2019独角兽企业重金招聘Python工程师标准>>>
最近刚刚接触Kt,, 昨天使用Kt的时候遇到构造函数中 val var 使用的一个问题, 虽然昨天功能完成了, 但是还是有些糊涂, 为避免以后再遇到此类问题导致浪费时间, 现把原理介绍一下.
需求: 有一个Child类是一个data类, 继承一个父亲类Parent , 从而在Child中公用父亲某些参数. 这在java中是很容易实现的, 但是在Kt中由于需要用到data类(后期需要做gson转换), 在处理构造函数遇到了问题 .
1. 刚开始, 我定义Parent是data类, 但是data类是final的, 所以没法被孩子继承, 失败
2.那只能定义Parent为class, Child 是data
open class Parent(weight: Int, height: Int)
data class Child(var grade: Int, var weight: Int, var height: Int) : Parent(weight, height)
这里有问题了 为什么父亲没有var val, 孩子有var val呢? 那能不能去掉吗?
当然data是不能去掉 var/val的, 去掉以后会报 data class must have only property (var/val) parameters
那Parent能不能加上var或者val呢? 通过转换为java代码看一下:
1.Base构造函数没有var val
open class Base(num: Int)
java
public class Base { public Base(int num) { } }
Base构造函数有val
public class Base { private final int num; public final int getNum() { return this.num; } public Base(int num) { this.num = num; } }
Base构造函数有var
public class Base { private int num; public final int getNum() { return this.num; } public final void setNum(int var1) { this.num = var1; } public Base(int num) { this.num = num; } }
其实var 其实就是在编译的时候为代码加上 getter 和setter 方法, val是只读, 只加上getter方法
不加var, val 就不会生成任何getter和setter了.
这些getter setter 都是final的.
如果Base中有了getter setter, 子类data class中也有了同一字段的, getter setter那就冲突了
总结:
1.val var 就是为形参加上 final的 getter. setter
2.KT 遇到问题通过转换为java代码, 可以很快找到答案