Kotlin学习(二)

2.kotlin学习(二)

1.条件控制

package com.simon.secondfun main(args: Array<String>) {//ifvar a = 1var b = 2var max:Intif (a > b){max = a}else{max = b}//作为表达式结果赋值给max1 感觉这个简单啊var max1 = if(a>b)a else bprintln(max)println(max1)//同样可以和区间一起var x = 6if( x in 1..6) println("x在区间里面")//when when类似于其他语言的switchwhen(x){1,3 -> println("x==1 or x==3")2 -> println("x==2")//区间也可以in 4..5 -> println("4<=x<=5")//可以类型判断也基本上就是判断式都okis Int -> println("x是数字")else ->{println("x是其他数字")}}//还能判断集合中是否存在var items = setOf<String>("apple","banana")when{"banana" in items -> println("banana in items")"apple" in items -> println("apple in items")}}

if和java差不多

when类似于switch

2.循环控制

package com.simon.secondfun main(args: Array<String>) {//for循环可以对任何提供迭代器对象来便利//for(item in collection)print(item)val ints:Array<Int> = arrayOf(1,2,3)for (item in ints){print(item)}//如果想通过索引来读(会编译优化,也可以选择下面这个方式)for(i in ints.indices){print(ints[i])}println()for((index,item) in ints.withIndex()){print("$index:$item ")}//while 和 doWhile循环
//    while (布尔表达式){
//        //内容
//    }
//    do{
//        //内容
//    }while (布尔表达式)var x = 5while (x>0){println(x--)}var y = 5do {println(y--)}while (y > 0)test1()foo()
}
fun test():Int{//return break 和 continuefor (i in 1..10){if (i == 3)continueprintln(i)if (i>5)break}return 10
}//Break和Continue标签
//这个爽炸了,直接跳指定循环舒服了
//continue同理跳到指定循环
fun test1(){loop@ for(i in 1..100){loop1@for (j in 1..100){if (i == j) {println("i==j")break@loop}}}
}
//标签处返回
//举个例子
fun foo(){var ints:Array<Int> = arrayOf(1,2,3)//如果没有标签处返回就会返回整个函数的返回,如果是有标签就会是标签处返回ints.forEach lit@{if (it == 3) return@litprintln(it)}//lambda表达式使用隐式标签ints.forEach {if (it == 2) return@forEachprint(it)}//匿名函数var x = ints.forEach(fun(value:Int){if (value == 2) return@forEachprint(value)})}

标签蛮有意思的可以多看看

感觉kotlin的lambda还是有点看不懂啊

3.类和对象

package com.simon.secondimport kotlin.properties.Delegatesclass Empty {}
class Runoob {//类的属性var name:String = "simon"var url:String = "www.baidu.com"var city:String = "赣州"//创建对象val site = Runoob()//成员函数fun foo(){println("foo is use")//调用属性println(site.city)println(site.name)println(site.url)}
}
//kotlin里面可以有一个主构造器以及一个或者多个此构造器,主构造器是类头部的一部分
class Person constructor(firstName:String){}
//如果主钩早期没有任何注解或者可见度修饰符那么可以省略构造器关键词
class Person1(firstName: String){}
//定义了一个Person2类,包含两个可变变量,lastName和no,lastName而修改了getter,no修改了setter
class Person2{var lastName:String = "zhang"get() = field.toUpperCase() //将变量赋值后转化为大写setvar no:Int = 100get() = fieldset(value){field = if (value<10) value else -1}//不可见var heiht:Float = 145.4fprivate set//backing filed 后备变量//例如下面一种情况
//    var name:String = "HelloWorld"
//        get() = namevar name:String = ""get() = fieldset(value){field = value}//另外还有一个非空属性的延迟加载}fun main(args: Array<String>) {var ps = Person2()println(ps.lastName)ps.no = 10println(ps.no)
//    ps.heiht = 10.2f//报错set是privateprintln(ps.heiht)//后备变量/** 我造!怎么溢出了??* println(ps.name)* 梳理下逻辑* 我ps.name调用name属性的get方法获取值,发现还是name属性,那继续get,自然就溢出了* set同理* 那这样我们就在外部如何访问修改他的值呢???* 这个时候后备变量就起作用了!* 也就是我们的变量的值就是filed的值* 我们属性使用会自动地调用set get方法* 但是这下就不会了* */ps.name = "Hello kotlin"println(ps.name)
}package com.simon.second
//1.延时加载 lateinit
class MyTest {//我们的lateinit是用于延时加载我们的非基本类型的变量lateinit var myVar:String//我们的基本数据类型想要被延时加载可以像下面这样用var myInt:Int? = null//也就是允许为null且赋值为nullfun checkMyVar(){if (::myVar.isInitialized){println(myVar)}else{println("未被初始化")}}}
//2.我们的主构造器没有其他构造器那样有一个程序段所以我们可以在构造的时候使用init关键字
class Person3 constructor(firstName: String) {var name:String = firstNamevar age:Int?=nullinit {println("FirstName is $firstName")}//次构造器,我们就需要加前缀constructor//并且我们的次构造器需要先去代理主构造函数,同一个类里面代理主构造函数就使用this关键字constructor (name: String, age:Int) : this(name) {this.age = age}
}
//3.我们定义了一个类之后会默认有无参构造,如果想要隐藏构造器可以这样操作(私有化)
class DontCreateMe private constructor () {
}//4.抽象类
abstract class Derived  {abstract fun f()
}//5.嵌套类
class Outer {                  // 外部类private val bar: Int = 1class Nested {var str:String = "simon"// 嵌套类fun foo() = 2}//那么我们的嵌套类与我们的内部类有什么区别呢?
}
//6.内部类
class Outer1{private val bar:Int = 2//内部类inner class Nested1{var str:String = "innerSimon"fun getBar():Int{return this@Outer1.bar}}
}
//7.匿名内部类
interface TestInterFace{fun test()
}
class Test{var v = "成员属性"fun setInterFace(test: TestInterFace){//我们可以看到我们的这个参数是这个接口test.test()}
}//8.类的修饰符
/*** 属性修饰符* abstract 抽象类* final 类不可继承* enum 枚举类* open 类可继承 默认类是final的* annotation 注解类* 访问修饰符* private 一个文件可以*protected 同一个文件或者子类可见* public 所有调用的地方都可以见* internal 同一个模块中可见** */fun main(args: Array<String>) {var myTest = MyTest()myTest.checkMyVar()myTest.myVar = "hello kotlin"myTest.checkMyVar()var person = Person3("simon")var person2 = Person3("simon2",5)println(person2.name)println(person2.age)//嵌套类var nest = Outer.Nested()println(nest.foo())//外部和内部元素均无法互相访问//内部类//我们内部类的对象在获取时也要初始化我们的外部类对象//(可能用到外部类的属性所以也要获取实例)//外部无法访问内部但是内部可以访问外部var bar = Outer1().Nested1().getBar()//我们外部对象访问不了内部的str属性
//    var str = Outer1().strprintln(bar)//匿名内部类/** 采用对象表达式来创建接口对象,即匿名内部类的实例* */var test = Test()test.setInterFace(object : TestInterFace{override fun test() {println("对象表达式创建匿名内部类的实例")}})
}

主要注意:

延时加载、主次构造器(次无论如何都会走主代理)、后备变量、init、嵌套类和内部类

4.继承

我们要知道我们Kotlin中所有类都继承Any类(类似java的Object)

Any提供了三个函数

equals hashCode toString

注:Any不是java.lang.Object

package com.simon.secondimport javax.naming.Context//基本的继承演示
open class Base(p:Int)
class BaseDerived(p:Int):Base(p){}//1.如果子类有主构造函数,则基本必须在主构造函数中立刻初始化
open class Person5(var name:String,var age:Int){//要声明出来可以被重写open fun study(){println("我毕业了")}
}class Student(name: String,age: Int,var no:String,var score:Int):Person5(name,age){}
//个人理解就是:如果基类主构造函数有这两个字段,那么我们的子类在声明时也必须吧这个字段带入自己的主构造函数//2.如果子类没有主构造函数
//class Student1():Person5(name = "simon",12){
//
//}
//就像上面上的必须马上初始化就直接赋值给基类的主构造函数
//或者像下面在次构造里面写一个super基类的构造方法
class Student2: Person5{//也就是我只有这个有参构造,构造的同时调用父类的主构造方法constructor(name: String,age: Int):super(name,age){}//3.重写方法override fun study() {println("我还在读书")}
}
//4.重写属性(一般用不上了解就行)
interface Foo{val count:Int
}
//将一个val属性重写为var(常-》变)
//不能变量变成常量
class Bar1(override var count:Int):Foo
//将属性重写属性和值
class Bar2 : Foo {override var count: Int = 1
}fun main(args: Array<String>) {var s = Student("Runoob",18,"s123",89)println("${s.name}")println("${s.age}")println("${s.no}")println("${s.score}")//重写var s2 = Student2("simon",19)s2.study()}

5.接口

Kotlin中的接口与java8类似,允许方法有默认实现

package com.simon.secondimport javax.naming.Context//基本的继承演示
open class Base(p:Int)
class BaseDerived(p:Int):Base(p){}//1.如果子类有主构造函数,则基本必须在主构造函数中立刻初始化
open class Person5(var name:String,var age:Int){//要声明出来可以被重写open fun study(){println("我毕业了")}
}class Student(name: String,age: Int,var no:String,var score:Int):Person5(name,age){}
//个人理解就是:如果基类主构造函数有这两个字段,那么我们的子类在声明时也必须吧这个字段带入自己的主构造函数//2.如果子类没有主构造函数
//class Student1():Person5(name = "simon",12){
//
//}
//就像上面上的必须马上初始化就直接赋值给基类的主构造函数
//或者像下面在次构造里面写一个super基类的构造方法
class Student2: Person5{//也就是我只有这个有参构造,构造的同时调用父类的主构造方法constructor(name: String,age: Int):super(name,age){}//3.重写方法override fun study() {println("我还在读书")}
}
//4.重写属性(一般用不上了解就行)
interface Foo{val count:Int
}
//将一个val属性重写为var(常-》变)
//不能变量变成常量
class Bar1(override var count:Int):Foo
//将属性重写属性和值
class Bar2 : Foo {override var count: Int = 1
}fun main(args: Array<String>) {var s = Student("Runoob",18,"s123",89)println("${s.name}")println("${s.age}")println("${s.no}")println("${s.score}")//重写var s2 = Student2("simon",19)s2.study()}

6.扩展

package com.simon.secondclass User(var name:String)
//1.扩展函数
fun User.Print(){println("用户名:${name}")
}
//2.扩展函数swap
fun MutableList<Int>.swap(index1:Int,index2:Int){var tmp = this[index1]this[index1] = this[index2]this[index2] = tmp
}
//3.扩展函数是静态解析的(具体是哪个对象调用就是哪个对象的扩展函数)和动态绑定正好不一样
open class D
class E: D()
fun C.foo() = "C"fun D.foo() = "D"
fun printFoo(d: D){println(d.foo())
}
//4.还可以扩展一个空对象,使用Any那不是所有类的toString都会判空了?
fun Any?.toString():String{if (this == null)return "null"return toString()
}
//5.伴生对象的扩展(方法和属性)
class MyClass{companion object{}
}fun MyClass.Companion.foo(){println("伴生对象的方法扩展")
}val MyClass.Companion.id: Intget() = 1
//6.作用域也可以扩展,懒得分包了不掩饰了//7.扩展声明为成员
class F{fun bar(){println("F bar")}fun G.foo(){barG()bar()}fun caller(g:G){g.foo()}}
class G{fun barG(){println("G bar")}
}fun main(args: Array<String>) {var user = User("simon")user.Print()var l = mutableListOf(1,2,3)l.swap(0,2)println(l.toString())//虽然传的是D对象,但是接受的是C对象,所以调用的是C的foo,所以为静态的printFoo(E())println(MyClass.foo())println(MyClass.id)var g = G()var f = F()f.caller(g)}

8.数据类和密封类

package com.simon.secondimport kotlin.math.exp//1.数据类 只包含数据的类data class UserInfo(val name:String, val age:Int)
//equals,hashCode,toString,componentN,copy
//上面四个不说了演示下copy
//标准库提供了pair和triple但是实际上数据类设计更加完善//2.密封类(这个蛮有意思的,同样是对有限类型的限制,举个例子)
//我们内嵌的子类定义了两个状态,一个是关闭一个是开启
//那么我们配合when对我们的这个op按钮类型进行判断
sealed class UiOp {object Show: UiOp()object Hide: UiOp()class TranslateX(val px: Float): UiOp()class TranslateY(val px: Float): UiOp()
}
fun execute(view: View, op: UiOp) = when (op) {UiOp.Show -> view.visibility = View.VISIBLEUiOp.Hide -> view.visibility = View.GONEis UiOp.TranslateX -> view.translationX = op.px // 这个 when 语句分支不仅告诉 view 要水平移动,还告诉 view 需要移动多少距离,这是枚举等 Java 传统思想不容易实现的is UiOp.TranslateY -> view.translationY = op.px
}class View {companion object{const val VISIBLE = trueconst val GONE = false}var translationY: Float = 0.0fvar translationX: Float = 0.0fvar visibility:Boolean = true
}fun main(args: Array<String>) {val cp1 = UserInfo("simon",13);val cp2 = cp1.copy(name = "simon1",14)println(cp1.toString()+cp2.toString())//解构val (name,age) = cp2//
}

感觉密封类和枚举类似但是密封类可以携带数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Zotero不显示标签的问题

目录 问题描述 解决办法&#xff1a; 问题描述 Zotero是一款学习助手&#xff0c;可以帮助我们梳理文献&#xff0c;方便我们整理。 最近电脑从windows换到mac&#xff0c;重新安装了Zotero&#xff0c;发现之前的一直设置都没有了。比如设置好的标签信息不显示了。如下图: …

pygame播放视频并实现音视频同步

一、前言 在我接触pygame时最新的pygame已经不支持movie模块&#xff0c;这就导致在pygame播放视频变成一个问题&#xff0c;网上搜了下解决方案有两个&#xff1a; 一是使用opencv播放视频&#xff0c;再结合pygame.mixer来播放音频 二是使用moviepy播放视频&#xff0c;再…

wsl安装ubuntu的问题点、处理及连接

WSL安装Ubuntu的参考链接 (41条消息) wsl报错&#xff1a;WslRegisterDistribution failed with error: 0x800701bc_yzpyzp的博客-CSDN博客_0x800701bc wsl (41条消息) 使用Ubuntu安装软件出现Unable to locate package错误解决办法_大灰狼学编程的博客-CSDN博客 手把手教你…

外贸ERP系统是什么?推荐的外贸管理软件?

外贸ERP管理系统有哪些&#xff1f;海洋建站管理软件的功能&#xff1f; 为了更有效地处理外贸业务&#xff0c;许多企业正在寻找先进的工具和技术。为了提高效率、降低成本并增强竞争力&#xff0c;越来越多的外贸企业正在转向外贸ERP系统。那么&#xff0c;外贸ERP系统究竟是…

抽象工厂设计模式是什么?什么是 Abstract Factory 抽象工厂设计模式?Python 抽象工厂设计模式示例代码

什么是 Abstract Factory 抽象工厂设计模式&#xff1f; 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定其具体类。它允许客户端使用抽象的接口创建一组相关对象&#xff0c;而无需关注实际的对象实…

VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中&#xff0c;tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题&#xff08;错误、警告等&#xff09;。 problemMatcher有三种配置方式&#xff0c;具体可…

Java操作redis常见类型数据存储

目录 一、Java连接Redis 1.1 导入pom依赖 1.2 建立连接 二、Java使用Redis 2.1 字符串 String 2.2 哈希 Hash 2.3 列表 List 2.4 集合 Set 2.5 有序集合 Sorted Set 三、Redis的实际应用场景 一、Java连接Redis redis与mysq都是数据库&#xff0c;java操作redis其实跟…

vue项目不用重新打包即可以修改项目ip

需求&#xff1a; 由于vue项目每次修改项目ip都需要重新打包&#xff0c;解决痛点&#xff1a; 方法&#xff1a; vue项目的dev.env.js配置文件引入外部变量 node中使用CommonJS规范引入 导出 static文件下新建host文件 static为暴露到外包的静态资源文件夹 /static/host/下…

黑盒子测试

黑盒子测试的步骤包括&#xff1a; 测试计划&#xff1a;根据用户需求报告中关于功能要求和性能指标的规格说明书&#xff0c;定义相应的测试需求报告&#xff0c;制订黑盒测试的最高标准。同时适当选择测试内容&#xff0c;合理安排测试人员、测试时间及测试资源等。测试设计…

2023年【施工升降机司机(建筑特殊工种)】最新解析及施工升降机司机(建筑特殊工种)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 施工升降机司机(建筑特殊工种)最新解析参考答案及施工升降机司机(建筑特殊工种)考试试题解析是安全生产模拟考试一点通题库老师及施工升降机司机(建筑特殊工种)操作证已考过的学员汇总&#xff0c;相对有效帮助施工升…

星戈瑞Sulfo-Cyanine5 mal的优势和局限性

Sulfo-Cyanine5 Maleimide&#xff08;Sulfo-Cy5-Mal&#xff09;是一种荧光染料&#xff0c;在分子生物学和细胞生物学研究中应用。 优势&#xff1a; 1.强荧光信号&#xff1a;Sulfo-Cy5-Mal具有强烈的荧光信号&#xff0c;适用于高灵敏度的荧光成像和检测。其荧光波长适用…

【开题报告】基于微信小程序的时空胶囊系统的设计与实现

1.研究背景 随着人们生活水平的提高和物质条件的改善&#xff0c;人们对于生活的品质和价值的要求也不断提高。人们开始更加注重记录自己的生活经历和感受&#xff0c;并且希望这些记录可以长期保存&#xff0c;并且可以随时回忆和分享。时空胶囊系统就是一个能够满足人们这种…

SAP 快速Debug财务替代GGB1

本文目的是提供快速debug财务替代的步骤。 1.GGB1打开财务替代界面 2.找到需要调试的替代&#xff0c;并在tcode输入框中输入SHCB,回车后将显示系统自动生成的源码界面。 3.找到需要调试的步骤&#xff0c;设置断点&#xff0c;后续进行重现操作即可进入断点位置。 以上。

风电场数字孪生-升压站BIM三维模型-obj格式

简介&#xff1a; 风电场中的升压站三维模型&#xff0c;obj格式&#xff0c;采用BIM技术建模&#xff0c;可应用于风电场三维数字孪生领域&#xff0c;用于对升压站进行漫游浏览&#xff1b;三维可视化场景应用&#xff1b;风电场三维设计模型。 下载地址 风电场数字孪生-升…

PostgreSQL中所的锁

为了确保复杂的事务可以安全地同时运行&#xff0c;PostgreSQL提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到它们尝试获取互相冲突的锁为止(比如两个事务更新同一行时)。当多个事务同时在数据…

java springboot在测试类中构建虚拟MVC环境并发送请求

好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…

7.0 异常处理

1. 异常概述 1.1. 异常的概念 Java中的异常是指Java程序在运行时可能出现的错误或非正常情况&#xff0c;比如在程序中试图打开一个根本不存在的文件&#xff0c;在程序中除0等。异常是否出现&#xff0c;通常取决于程序的输入、程序中对象的当前状态以及程序所处的运行环境。…

Week-T10 数据增强

文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强&#xff08;增加数据集中样本的多样性&#xff09;三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…

查看文件的二进制数据

有时候会遇到想查看一些文件的二进制的数据的需求&#xff0c;比如想看一张图片的二进制数据&#xff0c;想查看bin文件的二进制数据&#xff0c;或者想查看其它文件的二进制数据等等。 在linux和mac下有命令直接支持&#xff0c;比较方便&#xff0c;但是很多人用的是windows…

【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于 JavaScript 中 JSON&#xff08;JavaScript Object Notation&#xff09;语法的入门指南。JSON 是一种轻量级的数据交换格式&#xff0c;广泛应用于前端开发中。通过这篇博客&#xff0c;我将带你深入了解 JSON 的语法…