java多态的学习笔记
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() = 1sub.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)调用导出类构造器主体。
?