Kotlin继承关系中构造函数形参修饰符(var val)的使用踩坑

最近刚刚接触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代码, 可以很快找到答案

猜你喜欢

转载自my.oschina.net/sfshine/blog/1800812