- 多态机制得以实现的前提是后期绑定,即在运行时根据对象的类型进行绑定,所以后期绑定也叫做动态绑定或运行时绑定。
- java中除了static方法和final方法(private方法属于final方法)之外,其他所有方法都是后期绑定。因为static方法由类名调用,final方法不能被覆盖,这两种方法都不需要在运行时判断究竟是谁在调用它们,它们的调用者是前期确定的。
public class Test11 {
public static void main(String[] args) {
SuperClass11 sub = new SubClass11();
SubClass11 sub2 = sub.method1();
}
}
class SuperClass11 {
public SuperClass11() {
}
public SubClass11 method1() {
System.out.println("父类方法1执行");
return method2();
}
public SubClass11 method2() {
System.out.println("父类方法2执行");
return new SubClass11();
}
}
class SubClass11 extends SuperClass11 {
public SubClass11() {
}
@Override
public SubClass11 method2() {
System.out.println("子类方法2执行");
return new SubClass11();
}
}
- 只有非private方法才可以被覆盖,所以在子类中,对于父类的private方法,最好采用不同的名字。
class PrivateOverride {
private void m() {
System.out.println("父类m方法执行!");
}
public static void main(String[] args) {
PrivateOverride sup = new Derived();
sup.m();
}
}
class Derived extends PrivateOverride {
public void m() {
System.out.println("子类m方法执行!");
}
}
- 只有方法调用是多态的,如果直接访问某个域,这个访问就将在编译期进行解析。
- 编写构造器时有一条有效准则:“用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法”。在构造器内唯一能够安全调用的是父类的final方法(private方法也是final方法),因为其不能被覆盖,而若是调用了可以被覆盖的方法,并且子类已经将该方法重写,此时调用的就是子类的方法,但是此时子类中的成员变量还没有初始化,若子类该方法中使用了成员变量,调用该方法将会导致灾难(成员变量未初始化时默认0值或null)。