java面试题网站:www.javaoffers.com
父类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这样设计也是挺合理的