Java多态中的缺陷

        并不是所有的事物都可以多态的发生,多态只适用于普通的方法调用(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()");
  }
}
/* Output
PrivateOverride'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、无法覆盖静态方法
如果某个方法是静态的,它的行为就不具有多态性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值