scala继承

 

继承

继承是面向对象编程语言的重要概念,简单一句话就是“儿子继承爸爸,拥有爸爸的很多可以被继承的特征(method和field)”。

scala中子类继承父类与java一样,使用“extends”关键字。

重写父类方法时使用“override”关键字。

使用父类的方法或变量时使用“super”关键字。

scala继承

对象匹配和转换

classOf[T]看成Java里的T.class,可以精确获取类

obj.isInstanceOf[T]看成 obj instanceof T,只能判断出对象是否是指定类以及其子类的对象,而不能精确判断出,对象就是指定类的对象

obj.asInstanceOf[T]看成(T)obj,强制转型

但是在实际开发中,比如spark的源码中,大量的地方都是使用了模式匹配的方式来进行类型的判断,这种方式更加地简洁明了,而且代码得可维护性和可扩展性也非常的高。功能性上来说,与isInstanceOf一样

scala继承

父类的有参构造函数

父类的构造函数可以给子类继承,这个挺好理解的,因为我们最常用的继承其实是继承父类的无参构造函数,所有无参构造函数都能继承,有参的为什么不能继承呢?

需要注意的是:如果是父类中接收的参数,比如name和age,子类中接收时,就不要用任何val或var来修饰了,否则会认为是子类要覆盖父类的field。

scala继承

scala的继承层级

scala继承

 Any是所有类型的父类,直接继承Any的有两个。一个是AnyRef,是所有引用类型的父类,Null是所有引用类型的子类,当一个引用类型为空的时候,实际就是引用了Null;还有一个是AnyVal,所有的基本数据类型如Int、Boolean、Byte等都是AnyVal子类,这里需要额外强调一下Unit类似java中的void也是AnyVal子类。Nothing是所有类的子类。