一、“覆盖私有方法”
1、代码更易理解
public class PrivateOverride {
private void f(){
System.out.println("privateOverride");
}
public void g(){
System.out.println("privateOverride.g");
}
public static void main(String[] args) {
PrivateOverride po = new Derived();
po.f();//privateOverride;对于多态,不能覆盖私有方法。
po.g();//derived.g
}
}
class Derived extends PrivateOverride{
public void f(){
System.out.println("derived");
}
public void g(){
System.out.println("derived.g");
}
}
2、下个结论
只有非private方法才可以被覆盖。
二、域1、代码
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;//通过super获得基类的域
}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println(sup.field+"---"+sup.getField());//0---1,域访问的还是基类的域,但方法实现了多态
Sub sub = new Sub();
System.out.println(sub.field+"---"+sub.getField()+"---"+sub.getSuperField());
//1---1---0要想获取基类的域值,可以通过super.的形式。
2、结论
当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。
三、静态方法
1、代码
class StaticSuper{
public static String staticGet(){
return "staticSuper";
}
public String dynamicGet(){
return "staticSuper.d";
}
}
class StaticSub extends StaticSuper{
public static String staticGet(){
return "staticSub";
}
public String dynamicGet(){
return "staticSub.d";
}
}
public class StaticPolymorphism {
public static void main(String[] args) {
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());//staticSuper;静态方法依然调用的是基类的方法
System.out.println(sup.dynamicGet());//staticSub.d
}
}
2、结论
静态方法是与类,而并非与单个的对象相关联的
---该博文为Java编程思想第四版第八章多态的摘录,欲知详情,可前去查阅---