·接口与实现类的关系是父类和子类,子类应该遵循父类的不变性。
·实际中更倾向于使用接口来定义变量。因为这样可以实现多态。
·接口不应该包含构造函数——它不能实例化。
·接口中不应该出现具体的实现类,这算表示暴露。
·接口中通过静态工厂方法而不是构造函数实现定义变量的需求,注意函数声明中不能出现具体的实现类。
·接口中的每方法在所有类中都要实现,通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它。
·接口中的三类方法:default方法、静态方法、子类方法,前两种声明与函数体都写,子类方法只写声明即可,在子类中写函数体
·严格继承:子类只能添加新方法,无法重写父类中的部分主要方法,可以重写特例的方法;子类中的方法要在父类中声明;模板模式使用严格继承;这种继承违背了多态的目的。
·重写:方法的重写,参数不能变,不然算是一个新的方法;A a=new B();a.方法调用的是子类中的方法。属性则不一样,a中属性的初始值为A中初始值。
重写的时候,不能改变方法的本意。
重写异常处理时,子类只能抛出比父类更少的异常,或者是抛出更具体的异常。
·一般要么用接口,要么用实现类,基本不用抽象类
·特殊多态——方法重载,在编译阶段决定要具体执行哪个方法(重写是在运行阶段决定)
在子类中,对父类的函数进行重载,A a=new B();a.move(int i)会报错,因为重载在编译阶段,重写在运行阶段,编译阶段决定a调用的是哪个方法就看它的类型(即A),而A中的move没有重载为move(int)的代码,此时程序会报错。
重载的参数列表必须不同,返回值类型可相同可不同,public/private/protected也可相同可不同,异常处理可相同可不同,可以在同一个类内重载,也可在子类中重载。
重载会根据参数列表中的类型进行最佳匹配。
·参数多态——泛型
·子类型多态——不同类型的对象可以统一的处理而无需区分
子类型的规约不能弱化父类型的规约。
·如何把一个类改为immutable类: