B->A
B继承自A,a就包含了B
A x = new B
A类型对应的集合就包含了B,任意一个B对象都属于A。
接口不能包含任何具体实现类的。接下来看实现
子类必须遵从父类的特性,也是immutable类。故存在以上四种错误。
哪些错误可以被静态检测出来?上方两个可以,下面两个检测不出来。
子类重写抽象的方法就可以了,它不会管特性有没有继承。
创建接口对应的具体实现类
返回值一定是接口类型的,不能返回具体实现类,在子类通过具体方法创建具体对象;
B和C都对A进行实现,A中某个方法对于BC都是一样的,要是再B中C中都出现一次,就造成两个类之间存在冗余。
故可以增加default方法放在接口中。
接口不可包含属性只能包含方法,default和static允许存在方法体;
3.
不会再讲继承和重写,
严格继承:
子类不能覆盖父类方法进行重写了,父类定义的方法都加了final属性。
Final基本对象->值不能被改变 方法->不能被重写
不提倡子类增加新方法
Old A = new C(),
- playmusic();
看方法能不能被调用,用子类型对父类型进行初始化,调用不到子类方法。
父类先写个方法在那里然后子类再来对他进行重写
父类写架构,然后子类再进行具体化
后面模板可以允许,子类的方法都可以在父类找到,父类方法可以调用子类方法,客户看不到
日你姥姥这啥
模板设计严格继承和实现
编译看前面,具体执行看后面,所以执行的时候是执行dog类中的move
A:move(); D:move(int);
如果dog改变了输入变量的输入,则视为重载,子类和父类的move已经不是同一种方法,调用时候就会调A类的。
a.move(3);
编译时就直接报错了。以上对于方法来说
对于属性来说
A{
i,j
move()
{i=i+1;
Print(i);}
}
D{
I=1;
Move();
I=i+2
Print();
}
D中没有这两个属性
A a = new D();
a.i; //调用这个属性
属性根据定义时的类型,所以就调A中。
方法是遵循多态的动态绑定的,属性是根据具体的类型方法解析的,两者不同。