Kotlin 笔记

1、val 只读不能被修改 var 可以
2、let/also/with/run/apply/repeat 一看就会

1704638876507.jpg

内置函数的总结:
apply使用场景:当你需要初始化一个对象或配置对象属性时。
also使用场景:当你想要执行一些副作用操作(比如打印日志),但不改变对象本身或不关心返回值时。。
run使用场景:当你想在一个对象的上下文中执行一系列操作,并返回最后一个表达式的值时。。
let使用场景:当你需要在一个表达式中使用一个对象并希望返回处理后的结果时。
with使用场景:当你已经有一个对象实例,并且想要在这个对象上执行多个操作时。
let和also:
明确一个变量所处特定的作用域范围内可使用。
针对一个可null的对象统一做判空处理。(重要)
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Kotlin笔记 要理解Java与Kotlin的区别,就要从最根本的上来理解。Java是解释型语言(边解释成二进制...
    FFFSnow阅读 4,668评论 0 0
  • 一、Kotlin基础 1.1 变量 在Kotlin中变量分为可变引用var和不可变引用val,val对应的是jav...
    东方未曦阅读 3,355评论 0 1
  • Kotlin与Java的差异 1. 对象的初始化时的顺序 在java中,初始化代码块 -> 构造函数 在kotli...
    HWilliamgo阅读 3,627评论 0 0
  • Sealed Class 密封类如果想对能够创建出的子类做限制,可以使用密封类。 下面一个例子是没有使用密封类的:...
    易含阅读 3,424评论 0 0
  • 函数 kotlin 函数以fun来标识,使用方式和java一样,同一类使用直接调用,如果是通过类引用则使用 '类名...
    金馆长说阅读 1,456评论 0 0