多态的缺陷


多态的调用过程中涉及到了方法的绑定(所谓方法绑定就是将一个方法调用和方法主体关联起来的过程)。若在程序执行之前,由编译程序进行绑定的过程称之为前期绑定。(C语言就是前期绑定)。而java中实现多态的机制就依靠了后期绑定(也叫动态绑定 或 运行时绑定)来实现。所谓后期绑定就是在程序运行的才根据对象的类型进行绑定的过程。在java中除了static和final方法(private方法属于final方法)之外,其他的方法都是动态绑定。

这也就意味着,基类中声明为static、final、static的方法是不可能实现所谓多态的。

当一个基类的方法声明为private,子类重写出一个同名方法。由子类对象引用指向基类对象的时候调用这个方法会发生什么呢?

public class PrivateOverride {
	private void f(){System.out.println("基类f方法被调用了");}
	public static void main(String[] args) {
		PrivateOverride po=new Derived();
		po.f();

	}

}
class Derived extends PrivateOverride{
	private void f(){System.out.println("子类f方法被调用了");}
}

由以上理论分析,private 是前期绑定。所以输出 为基类f方法被调用了。

再看如下代码


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;}
}
public class FileAccess {

	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("sup.field=" +sub.field + " sup.getField=" + sub.getField()+ " sup.getSuperfield=" + sub.getSuperField());
	}

}

当Sub对象转化为Super引用的时候,任何域由编译器解析,因此不是多态的,在本例中。Super.field 和Sub.field分配了不同的存储空间。这样Sub实际包含连个Field域分别由他自己和他的Super得到。然而,再引用Sub中的field是产生的默认域并非Super版本的field 域。因此为了得到Super.field 必须明确指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值