Scala 中的类继承之 父类带有构造参数

父类class China(var name){}

 

子类class Japan extends China(name="son"){} 注意: 我们查看Scala文件编译后的class文件,然后再通过反编译为Java文件可以看到以下代码: 在Japan的默认构造中调用了父类的带参数的构造方法。

public Japan()

  {
    super("son");

  }

如果我们想在Japan中定义和父类相同的属性(覆盖override)则需要注意父类 属性的参数的修饰符必须为val (var 也不行), 否者会报错,在Scala中属性覆盖针对不易变的属性,子类必须加上 override val XXX: Tpye

修改父类:class China(val name: String){}

修改子类:class Japan(override val name: String) extends China(name="XX") 这里父类上的参数必须加上,否者编译不通,如果不想赋值则可以:Chian(name) 直接这样也可以。

以上为原理在开发时不注意这些的话,你可以直接简写:
 

class Japan(  name: String ) extends China(name) {

}

把 override val 去掉, 变量前面 不要加任何的 权限修饰符。应为Scala的构造方法 是与class写在一起的

看成java的话:

  public Japan( name: String ){

     super.(name)

      }

总:

     Scala的语言设计的初衷就是少写代码,仔细想想,如果父类中有了非val的属性,我们的子类直接就可以在创建对象的时候,默认的构造中可以传入对应的属性值,并且使用该对象也可以访问的到,所以针对于非val的属性没必要override(脱裤子放屁---多此一举),而val修饰符在编译后的JAVA文件中是final修饰 是最终变量不可变,所以该值在子类中想引用这个变量并且想改变他的值,则需要override val,想想Scala这样设计也是挺合理的

 

 

 

 

你可能感兴趣的:(Scala)