继承
接口继承
一个接口继承另一个接口,被继承的接口方法都会自动的隐式继承在子类接口,但是不用实现,用
extends
继承。
实现继承
一个类可以继承另一个类的实现,通过
extends
关键字可以获得父类 所有的方法和变量。
接口实现
当一个类使用
implement
关键字继承一个接口的时候,必须提供接口中的所有方法,(接口中的所有方法默认public abstract)否则报错。
技术细节
细节
- 接口可以继承多个,但是java规定
单类继承
,子类只能是一个父类的扩展 - 类继承接口的时候最好加上Overrride来辅助确保方法签名(signature)一致,避免错误。
super关键字
在子类中如果想要调用父类的构造函数,要用super()
,不写的话,java也会自动的调用。
抽象类
public abstract class Animal() {}
特征
- 可以继承接口,然后实现其中一些方法,也可以增加抽象方法让子类来实现,要显性写出关键字public abstract。
- 注意: 抽象类继承接口,他不必提供实现,他会隐式的继承所有的抽象方法。
作用
充当接口和类之间的桥梁,实现接口中的冗余。可以实现一些比如isEmpty这种重复性的方法,或者设置几个变量让子类继承,会减少一点点的内存使用,主要是为了方便。
难点
产生原因
- java运行中,其实有一个(complie-time type)也就是静态类型,还有一个动态类型(dynamic type),由于
编译器只会根据静态类型来判断编译错误
,这在子类父类的静态类型和动态类型互相传值的时候就会造成很多的麻烦。
例如:
我用父类的方法new一个子类的类型,他的静态类型就是父类,动态类型就是子类
Object a = new Aniaml();
动态类型 Animal
静态类型 Object
用子类类型传给父类,编译器会通过,他会找到类的列表,发现animal是object的子类。但是让aniaml = 传回的object类,就会报错,无法确定这个object类是否具有animal的方法,让编译器不安。可以用cast(animal)强制转换成animal类,但是java不会出现类型错误就出现了悖论。
解决方法
用cast类型转换(不改变本身的类型),来让编译器”通融一下“,保证编译的通过