java构造器内部的多态方法

参考java编程思想


在构造器内部调用正在构造的某个对象的某个动态绑定方法。即在基类构造器中调用被子类覆盖的方法。所以此方法所操纵的某个成员可能还未进行初始化。


解决该问题的办法在于:对象初始化首先会在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。

public class A {
	public A(){
		System.out.println("A before");
		this.f();
		System.out.println("A After");
	}
	
	public  void f(){
		System.out.println("A::f()");
	}
}
public class B extends A {
	private int i=2;
	
	public B(){
		System.out.println("B before");
		f();
		System.out.println("B After");
	}
	
	public  void f(){
		System.out.println("B::f()  i="+i);
	}

}
<pre name="code" class="java">public class Other {
	public Other(){
		System.out.println("Creating Other");
	}
	
	public String toString(){
		return "Other";
	}
}


 
public class C extends B{
	private int i=3;
	private Other o=new Other();
	public C(){
		System.out.println("C Before");
		f();
		System.out.println("C After");
	}
	
	public final void f(){
		System.out.println("C::f()  i="+i+"\t"+o);
	}
	
	public static void main(String[] args){
		C c=new C();
	}
	
}
输出结果:

A before
C::f()  i=0 null
A After
B before
C::f()  i=0 null
B After
Creating Other
C Before
C::f()  i=3 Other
C After

我们应该使用尽可能简单的方法构造对象,尽量避免调用其它方法。在构造器内唯一可以安全调用的方法是final方法,因为final方法不能被覆盖。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值