Java多态中的缺陷

来源:互联网 发布:淘宝客新手如何玩鹊桥 编辑:程序博客网 时间:2024/05/21 14:02

        并不是所有的事物都可以多态的发生,多态只适用于普通的方法调用(private方法和final方法肯定不具有多态,包访问权限的方法,根据导出类和基类的位置决定,均在包内则可以继承)。
1、无法“覆盖”私有方法
        private方法自动被当作final方法,并且对导出类屏蔽。如果在导出类中具有一个和基类private方法一摸一样的方法,这不是多态。这只是导出类中的一个全新的方法。
        如本例中PrivateOverride的private f()方法在子类Derived中不可见,因此不可能被重载;Derived对象中f()方法是一个全新的方法。当向上转型时:PrivateOverride d = new Derived(); d是无法看见Derived()的新方法(即PrivateOverride没有的接口)的。
例程:

package polymorphism;public class PrivateOverride {  private void f(){    System.out.println("PrivateOverride's private f()");  }  public static void main(String[] args){    PrivateOverride d = new Derived();    d.f();  }}class Derived extends PrivateOverride {  public void f(){    System.out.println("Derived public f()");  }}/* OutputPrivateOverride's private f() */

2、无法覆盖域
        任何域访问操作都是在编译期解析的,因此不是多态。如果你直接访问某个域,这个访问会在编译期进行解析(编译期基类的域解析会先于导出类的域解析),就像下面所演示的。

本例中:p.field就是直接访问field这个域,是在编译期完成的。sp.field和sb.field分配了不同的存储空间,Sb实际上包含了两个field域:它自己的和它从Super处得到的。并且在引用sb.field时默认域并非Super版本的field域,引用sp.field时默认域是它自己的field域。
例程:

package polymorphism;class Super{    public int field = 1;    public int getField(){        return field;    }}class Sub extends Super {    public int field =2;    public int getField() {        return field;    }    public int getSuperField() {        return super.field;    }}public class FiledAccess {    public static void main(String[] args) {        Super sp = new Sub();        Sub sb = new Sub();        System.out.println("sp.field = "+sp.field+" sp.getField "+sp.getField());        System.out.println("sb.field = "+sb.field+" sb.getField "+sb.getField()+" sb.getSuperField "+sb.getSuperField());    }}

3、无法覆盖静态方法
如果某个方法是静态的,它的行为就不具有多态性。