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)调用导出类构造器主体。