Android开发经验谈Android技术知识Android开发

Kotlin学习笔记之 6

2019-03-25  本文已影响10人  super_shanks

6.Kotlin 继承

OK,我们接下去看一下两种情况下作为基类被继承了之后会有什么地方的不同。

前面我们有提到,kotlin中无论使用什么修饰符,对于参数本身来说,编译成java代码之后始终是private的,只是通过getset方法来体现修饰符,

如果我们的子类是这么定义的:

//kt
class Sun(name : String): Person(name){   
}

//decompiled
public final class Sun extends Person {
    public Sun(@NotNull String name) {
       Intrinsics.checkParameterIsNotNull(name, "name");
       super(name);
    }
 }

看起来完全没有问题。这时候我们把name写上var,我们先不反编译,直接按照上面的理解,应该是这样的

```js
//kt
class Sun(var name : String): Person(name){ 
}

//decompiled
public final class Sun extends Person {
   @NotNull
   private String name;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.name = var1;
   }

   public Sun(@NotNull String name) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
   }
}
```

乍一看,没有问题。但是实际上这么写IDE直接会报错。Sun的方法getNamesetNamepublic final的,由于父类也有相同的方法getNamesetName。犯了java的大忌,子类出现了父类的同名函数,父类的函数还他么是final的。

也就是说,除了父类是非final字段,子类不能出现相同的字段。

综上所述,只要不是open形容的字段,都不能在子类出现重复的字段名。无论是val还是var

Sun1是无法编译通过的,所以出来的decompiled实际上是没有意义,上面说过调用父类的无参构造和不调用最终出来的结果是一样的,所以我们直接看Sun2即可

Sun2Sun3连在一起看,首先我们知道,在java中,每一个类如果没有单独的去申明他的构造函数,那么他们都将有一个默认的无参构造函数。并且又有继承,所以Sun2实际上是这样的

public final class Sun2 extends Parent {
      public Sun2() {
         super();
      }
 }
上一篇 下一篇

猜你喜欢

热点阅读