1.有关多态覆盖私有方法
public class PrivateOverride { private void f(){System.out.println("private f()");} public static void main(String[] args){ PrivateOverride po = new Derived(); po.f(); } } class Derived extends PrivateOverride{ public void f(){ System.out.println("public f()"); } }
Output:
private f();
结论:在多态机制中,只有非private方法才可以被覆盖。在导出类中,对于基类的private方法,最好采用不同的名字。
2.有关多态机制中的域和静态方法
class Super{ public int field = 0; public int getField() { return field; } } class Sub extends Super{ public int field =1; public int getField(){ return field; } public int getSuperField(){ return super.field; } } public class FeildAccess { public static void main(String[] args){ Super sup = new Sub(); System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField()); Sub sub = new Sub(); System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField()); } }
Output:
sup.field = 0, sup.getField() = 1 sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态。这里为Super.field和Sub.field分配了不同的存储空间。这样Sub实际上包含两个称为field的域,然而在引用Sub中的field时所产生的默认域并非Super版本的field域。
3.构造器和多态-构造器调用顺序
class Meal{ Meal(){ System.out.println("Meal()"); } } class Bread{ Bread(){ System.out.println("Bread()"); } } class Lunch extends Meal{ private Bread b = new Bread(); Lunch(){ System.out.println("Lunch()"); } } public class Sandwich extends Lunch { private Bread b = new Bread(); public Sandwich(){ System.out.println("Sandwich()"); } public static void main(String[] args){ new Sandwich(); } }
Output:
Meal() Bread() Lunch() Bread() Sandwich()
构造器调用顺序:
1)调用基类的构造器。
2)按声明顺序调用成员的初始化方法。
3)调用导出类构造器主体。