第八章:多态
1 多态通过分离做什么和怎么做来将接口和实现分离出来,其作用是消除对象之间的耦合关系,它能改善代码的组织结构和可读性,可以创建出可扩展程序(可生长程序)。
2 把某个对象的引用视为对其基类对象的引用的做法称作向上转型,因为继承树的画法中,基类是放在上方的。
3 用继承表达行为间的差异,用字段表达状态上的变化。
4 将一个方法调用同一个方法主体关联起来称作绑定。
如果程序执行前进行绑定,叫做前期绑定,如C语言只有一个方法调用。
Java中除了STATIC和FINAL方法(private方法属于FINAL方法)之外,其他所有方法都是后期绑定。其实申明某个方法为FINAL,就是可以有效的关闭动态绑定,防止其他人覆盖该方法。
例子:
public class Test {
private void f(){
System.out.println("parent");
}
public static void main(String[] args) {
Test t = new T();
t.f();
}
}
class T extends Test{
public void f(){
System.out.println("child");
}
}
由于private被自动认为FINAL属性,所以他对导出类是屏蔽的。即f这个方法是前期绑定,被绑定到了Test这个类上。同理STATIC是前期绑定的,它并不是与实例化的对象相关联的,即STATIC的方法是绑定到实例化对象之前的类上面的,所以STATIC是类相关的,他的行为不具有多态性。所以,只有普通方法的调用可以是多态的。(本例子结果parent)
5 基类的构造器总是在导出类的构造过程中被调用,因为导出类只能访问他自己的成员,不能访问基类成员,所以只有基类构造器才能对自己正常的初始化。即这个是Java保证所有的变量在使用前都得到恰当的初始化所要求的。
6 构造器调用顺序例子:
class a{a(){System.out .print("a" );}}
class b{b(){System.out .print("b" );}}
class c{c(){System.out .print("c" );}}
class d{d(){System.out .print("d" );}}
class e extends a{e(){System.out.print("e");}}
class f extends e{f(){System.out.print("f");}}
public class g extends f {
public g() {
System.out.print("g");
}
private b bb = new b();
public static void main(String[] args) {
new g();
}
}
结果:aefbg
构造器调用顺序:1)调用基类构造器 2)按声明顺序初始化成员 3)调用到导出类构造器的主体。