• Renext
    2021-12-31
    思考题: 转换成 java代码就一清二楚,两种方式的isAdult本质不是同一个东西: 1-通过自定义 getter 来实现的方式,isAdult其实是一个方法。外部每一次调用,都是拿最新的age进行计算,所以age的值有变动,isAdult()的结果是最新的。 2- val isAdult = age >= 18 这种方式,isAdault是一个final变量,只会在对象新建时,在构造方法中,根据age的值赋值一次。所以,之后age的值如果有变动,isAdault值是永远不变的。

    作者回复: 赞!

    共 3 条评论
    57
  • PoPlus
    2021-12-31
    思考题: 如果采用 val isAdult = age >= 18 这种写法,那么错误会表现在给某个 Person 对象的 age 属性二次赋值时,isAdult 属性仍会是一个旧的 Boolean 值。原因:从反编译出的 Java 代码可以看出,isAdult 属性会被转换成一个 final 修饰的 Java 属性且在构造方法里赋好值了,那么意味着即使 age 属性后期修改一万遍,isAdult 属性也只会是它原来的那个初始值。 而如果用 getter 的方式则不会有这个问题,因为 getter 方式会把 isAdult 属性转换成 getter 方法而不是 final 修饰的属性,每一次调用,isAdult 属性就会动态的根据 age 属性来判断返回值。

    作者回复: 赞!分析的很到位。

    
    12
  • 阶前听雨
    2021-12-31
    太赞了,看了很多书和博客,基本都在讲kotlin多好用。从根本上讲kotlin的还是这门课,很多以前懵懵懂懂的概念都豁然开朗,太赞了。

    作者回复: 你的鼓励就是我的动力。我们一起加油!

    
    10
  • 逢庆
    2021-12-31
    1. val isAdult get() = age >= 18 反编译后可以看到,会生成方法: public final boolean isAdult() { return this.age >= 18; } 2. val isAdult = age >= 18 反编译后,可以看到: 会定义一个isAdult属性: private final boolean isAdult; 并在构造函数里根据age来赋值: this.isAdult = this.age >= 18;

    作者回复: 没错。

    
    7
  • 3.141516
    2022-02-09
    kotlin 的一些语法特性在编译为字节码后会增多 class 数量,所以会增加字节码的大小。 想请教下老师,在 Android 中,Kotlin 还有哪些方面会增加包大小呢?谢谢

    作者回复: 其实,我们一般说Kotlin增大包体积,主要只两个方面: 1. Kotlin标准库+反射库+协程库 2. 字节码增加class数量

    
    5
  • 文茂权
    2022-01-16
    JVM 由于存在多种实现,依赖的是一套标准规范。尽管学习 Kotlin 不需要直接接触 JVM ,但参考 JVM 的设计规范对于我们学习 JVM 编程语言的设计是很有作用的。 这里附上 JVM 不同版本的设计规范文档:https://docs.oracle.com/javase/specs/index.html

    作者回复: 赞!感谢补充。

    
    5
  • droidYu
    2022-03-20
    Kotlin语言的简洁得益于Kotlin编译器的强大,之所以Java和Kotlin能完全兼容,是因为Java和Kotlin编译后的成果都是Java字节码。

    作者回复: 是的。

    
    4
  • 郑峰
    2022-01-15
    You can define custom accessors for a property. If you define a custom getter, it will be called every time you access the property (this way you can implement a computed property). If you define a custom setter, it will be called every time you assign a value to the property, except its initialization.

    作者回复: 嗯,是的。

    
    3
  • qinsi
    2022-01-01
    直觉上反编译都是有损的,不知道有没有遇到过反编译结果不对的例子?

    作者回复: 确实,字节码才是最接近本质的。反编译成Java之后确实会损失少量信息,但一般都不会有很大的偏差。

    共 2 条评论
    2
  • PoPlus
    2021-12-31
    关于 Kotlin 包装类型优化原始类型,我的实验结果和老师的结论有一点出入,不知道是不是编译器版本的原因。🌚 var a: Long = 1 // private static long a = 1L; val b: Long = 2 // private static final long b = 2L; var c: Long? = 3 // private static Long c = 3L; 未优化成原始类型 val d: Long? = 4 // private static final Long d = 4L; 未优化成原始类型

    作者回复: 嗯,这是有可能的,我用的最新版IntelliJ,Kotlin1.6版本。

    共 2 条评论
    2