JAVA中多态的“缺陷”

在JAVA中,多态也并非是所有事物都可以多态的发生,然而只有普通的方法调用是可以多态的,如果我们直接访问某个域,该访问就会在编译期进行解析,比如如下代码段:

package access;
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 Field {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Super sup = new Sub();
		System.out.println("sup.field = " + sup.field
				 + ", sup.getField() = " + sup.getField());
		Sub sub = new Sub();
		System.out.println("sub.field = " + sub.field
				 + ", sub.getField() = " + sub.getField() 
				 + ", sub.getSuperField() = " + sub.getSuperField());
	}

}
此程序输出结果为:


正如输出结果中看到的一样,当Sup对象上转为Super引用时访问field域时仍然为0,此时的结果由编译器解析决定,不再拥有多态性,而方法getField()仍然具有多态性。

在实际编程中,我们通常首先应该将所有的域设置为private类型,不能直接访问它,只能通过方法调用的方式来访问,另外我们可能不会对基类中的域和导出类中的域赋予相同的名字,这样做十分容易混淆。

如果某个方法是静态的,它的行为也将不具备多态性,看如下一段代码:

package access;
class StaticSuper{
	public static String staticGet(){
		return "Base staticGet()";
	}
	public String dynameicGet(){
		return "Base dynameicGet()";
	}
}
class StaticSub extends StaticSuper{
	public static String staticGet(){
		return "Derived staticGet()";
	}
	public String dynamicGet(){
		return "Derived dynameicGet()";
	}
}
public class StaticField {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StaticSuper sup = new StaticSub();
		System.out.println(sup.staticGet());
		System.out.println(sup.dynameicGet());
	}

}
此程序的输出结果为:


静态方法是类,而并非与单个的对象相关联。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值