最近在研读<<Thinking in Java>>......
多态的2个缺陷,其一:对私有方法的“覆盖”。只有非private方法才可以覆盖,因为private方法会被自动默认为是final方法。
其二:域与静态方法不具多态性。因为域是分配有存储空间的,父类与子类的域名虽然相同,但其存储空间不同。静态方法也同样道理。
多态的2个缺陷,其一:对私有方法的“覆盖”。只有非private方法才可以覆盖,因为private方法会被自动默认为是final方法。
public class Father {
private void f() {
System.out.println("Father's f()");
}
public void p() {
System.out.println("Father's p()");
}
public static void main(String[] args) {
Father f = new Sun();
f.f();//Father's f()
f.p();//Sun's p()
}
}
class Sun extends Father {
public void f() {
System.out.println("Sun's f()");
}
public void p() {
System.out.println("Sun's p()");
}
}
其二:域与静态方法不具多态性。因为域是分配有存储空间的,父类与子类的域名虽然相同,但其存储空间不同。静态方法也同样道理。
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println(sup.field);//0
System.out.println(sup.getField());//1
System.out.println(sup.dynamicGet());//Sub's dynamicGet
System.out.println(sup.staticGet());//Super's staticGet
Sub sub = new Sub();
System.out.println(sub.field);//1
System.out.println(sub.getField());//1
System.out.println(sub.getSuperField());//0
}
}
class Super {
public int field = 0;
public int getField() {
return field;
}
public String dynamicGet() {
return "Super's dynamicGet";
}
public static String staticGet() {
return "Super's staticGet";
}
}
class Sub extends Super {
public int field = 1;
public int getField() {
return field;
}
public int getSuperField() {
return super.field;
}
public String dynamicGet() {
return "Sub's dynamicGet";
}
public static String staticGet() {
return "Sub's staticGet";
}
}