我们需要注意只有普通方法调用才可以是多态的,对域的访问将在编译时期进行解析。如下面这个例子:
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.getField();} } public class FieldAccess { 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.getField="+sub.field+" sub.getField()="+sub.getField()+ " sub.getSuperField()="+sub.getSuperField()); } } /* output: sup.field=0 sup.getField()=1 sub.getField=1 sub.getField()=1 sub.getSuperField()=0 */当使用父类Super的引用sup指向子类Sub类对象,输出域,发现是父类的值。因此,域的访问是编译器解析,不是多态的。
如果某个方法是静态的,它的行为也不具有多态性。
class StaticSuper{ public static String staticGet() { return "Base staticGet()"; } public String dynamicGet(){ return "Base dynamicGet()"; } } class StaticSub extends StaticSuper{ public static String staticGet() { return "Derived staticGet()"; } public String dynamicGet() { return "Derived dynamicGet()"; } } public class OverloadingTest { public static void main(String[] args) { StaticSuper sup = new StaticSub(); //向上转型 System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); } } /* output: Base staticGet() Derived dynamicGet() */由输出可以看出,静态方法是不具有多态性的。静态方法是与类,而非与单个的对象相关联的。
小结简要介绍了对于多态的理解,其中存在的不足,希望各位看官不吝赐教。
参考:
《Java编程思想》第四版
《Java核心技术卷1》第九版
Java多态性理解,好处及精典实例:https://blog.csdn.net/Jian_Yun_Rui/article/details/52937791