1、val 只读不能被修改 var 可以
2、let/also/with/run/apply/repeat 一看就会
内置函数的总结:
*1.apply函数返回类型,用于都是info本身此条和 also 模一样
*2.apply函数的 匿名函数里面持有的是this ==info本身 此条和 run一模一样
*1.let函数返回类型,是根据匿名函数最后一行的变化而变化此条和run -模一样
*2.let函数的 匿名函数里面持有的是it==集合本身 此条和 also -模一样
*/1.run函数返回类型,是根据匿名函数最后一行的变化而变化此条和 let一模一样
2.run函数的 匿名函数里面持有的是this==str本身此条和 apply一模一样
with(str) with和run基本上一样,只不过就是使用的时候不同
1.with函数返回类型,是根据匿名函数最后一行的变化而变化 此条和 let-模一样此条和 apply一模一样
2.with函数的名函数里面持有的是this== str本身
1.also函数返回类型,用于都是str本身此条和apply一样
2.also函数的 名函数里面持有的是it== str此条和 let -模一样
3、学习笔记
4、copy函数只管主构造函数,不管次构造函数
5、空值和空类型
fun main() {
var str: String? = null
//如果对象的属性为null则安全调用运算符返回null
println(str?.length)
//使用非空断言操作符!!.来明确不会出现null问题
println(str!!.length)
val str: String? = null
//Elvis运算符 ?: 左侧为空值检测目标,右侧为检测到null时返回的结果
val len: Int = str?.length ?: 0
}
6、takeIf关键字如果是括号{}内最后一行执行返回的是true,则返回的自身it?
如果是括号{}内最后一行执行返回的是false,则返回的自身null
takeUnless与takeif作用完全相反
fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main() {
var name: String? = "你好"
var lll = name.takeIf {
CheckMyTakeIf(true)
CheckMyTakeIf(false)
}//最后返回false,所以返回空nu11
println(111)
lll = name.takeIf {
CheckMyTakeIf(false)
CheckMyTakeIf(true)
}//最后返回ture,所以返回自身,自身就是name字符串
println(111)
}
7、伴生对象companion的由来: 在KT中是没有Java的这种static静态,伴生很大程度上和Java的这种static静态差不多,我们的伴生对象只有一次加载伴生对象只会初始化一次。
8、内部类可以是嵌套类,Kotlin 的默认形式内部不能访问外部,要想访问,需要额外添加一个 inner 关键字。
9、使用copy函数的时候,由于内部代码只处理主构造不管次构造,所以必须考虑次构造的内容
data class KtBase92(var name: String, var age: Int) {
var coreInfo: String = ""
init {
println("主构造被调用了")//copy函数只走这里
}
// 次构造
constructor(name: String) : this(name, 99) {
println("次构造被调用")//copy函数不会走这里
coreInfo = "增加非常核心的内容信息"
}
}
10、数据类data不能使用 abstract,open,sealed,inner 等等 修饰
11、泛型约束Personclass本身与Personclass的所有子类 都可以使用,|其他的类,都不能兼容此泛型
open class MyAnyclass(name:String)//祖宗类 顶级父类
open class Personclass(name:String):MyAnyclass(name = name)//父类
class Studentclass(name:String):Personclass(name = name)//子类
class Dogclass(name:String)//其他类另类
//相当于Java的T extends PersonClass
// T:PersonClass//Personclass本身与Personclass的所有子类 都可以使用,|其他的类,都不能兼容此泛型
class KtBase106<T : Personclass> (private val inputTypeValue: T, private val isR: Boolean = true) {
// /万能对象返回器
fun getobj()= inputTypeValue.takeIf{ isR }
}
12、如果泛型类型T的参数是vararg 可变参数,则在接收可变参数时,可以传入多个 指定类型的实例对象,需要使用Array<out T>类型的变量进行接收;
实例对象以[]运算符获取其items:Array<out T>中的某个元素,则需要重写该类的get方法;
13、当我们 对这个整个类里面的泛型,只能给读取 ,不能修改更改,可以声明 out T 协变
当我们 对这个整个类里面的泛型,只能修改,不能让外界读取时,可以声明 in T逆变
out 相当于java里面的 <? extend>
in 相当于java里面的 <? super>
如果一个类既要参数泛型又要获取返回的泛型就不适用in & out