Java多态中的问题(二)字段和静态方法

动态绑定:在运行时根据对象的类型调用恰当的方法。Java中除了static方法(构造方法可看做static方法)和final方法(private方法可看做final方法)之外,其他普通方法都是动态绑定的。

1. 在利用多态特性时,如果直接访问某个字段,这个访问就将在编译器进行解析,不再是多态,以下代码可反映该问题。

package polymorphism;

class Super {
	public int field = 0;
	public int getField() {
		return field;
	}
}

class Sub extends Super {
	public int field = 1;
	//返回该类field值
	public int getField() {
		return field;
	}
	//返回基类field值
	public int getSuperField() {
		return super.field;
	}
}

public class FieldAccess {
	public static void main(String[] args) {
		Super sup = new Sub();
		//用基类引用直接访问字段
		System.out.println("sup.field=" + sup.field + ", sup.getFiled()="
				+ sup.getField());
		Sub sub = new Sub();
		//用基类引用直接访问字段
		System.out.println("sub.field=" + sub.field + ", sub.getFiled()="
				+ sub.getField() + ", sub.getSuperField()="
				+ sub.getSuperField());

	}
}

/*程序输出为:
sup.field=0, sup.getFiled()=1
sub.field=1, sub.getFiled()=1, sub.getSuperField()=0
*/

通常情况下,不会在子类中的字段和基类中的字段用相同的名字,但了解它的访问过程能加深对多态的理解。

在程序中,实际上为Super.field和Sub.field分配了不同的存储空间,Sub实际上包含了两个名为field的字段,由于访问字段的操作在编译期已经进行解析和绑定,所以在使用Super引用访问field时,访问的是Super的field值。

2. 如果某个方法是静态的,它的行为就不具有多态性,以下代码可反映问题。

package polymorphism;

class StaticSuper{
	public static String staticGet(){
		return "Super staticGet()";
	}
	public String dynamicGet(){
		return "Super dynamicGet()";
	}
}

class StaticSub extends StaticSuper{
	public static String staticGet(){
		return "Sub staticGet()";
	}
	public String dynamicGet(){
		return "Sub dynamicGet()";
	}
}

public class StaticOverride {
	public static void main(String[] args) {
		StaticSuper sup = new StaticSub();
		//基类引用访问static方法和普通方法
		System.out.println(sup.staticGet());
		System.out.println(sup.dynamicGet());
		
		StaticSub sub = new StaticSub();
		//子类引用访问static方法和普通方法
		System.out.println(sub.staticGet());
		System.out.println(sub.dynamicGet());

	}
}
/*程序输出为:
Super staticGet()
Sub dynamicGet()
Sub staticGet()
Sub dynamicGet()
*/

静态方法是与类直接关联的,而不是于某个对象相关联。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值