java学习笔记---构造器的多态和调用顺序

话不多说,先看一个例子:

public class Constructor extends Child
{
	public Constructor()
	{
		System.out.println("Constructor()");
	}
	private Bread b=new Bread();
	private int i=1;
	void draw()
	{
		System.out.println("Constructor.draw()  i="+i);
	}
	public static void main(String[] args)
	{
		new Constructor();
	}
}


class Bread
{
	
	public Bread()
	{
		System.out.println("Bread()");
	}
}
 
class Father
{
	void draw()
	{
		System.out.println("Father.draw()");
	}
	public Father()
	{
		System.out.println("Father() before draw");
		draw();
		System.out.println("Father() after draw");
	}
}


class Child extends Father
{
	void draw()
	{
		System.out.println("Child.draw()");
	}
	public Child()
	{
		System.out.println("Child()");
	}
}


 

例子的输出结果是:

 

Father() before draw
Constructor.draw()  i=0
Father() after draw
Child()
Bread()
Constructor()


 

注意观察输出结果的第二行,调用的实际是Constructor的draw方法,而且,i等于0,不等于1。


通过这个例子,需要说明两点:

(1)构造函数中调用其他方法也会出现多态。调用的方法的被派生类覆盖的方法。然而,这种情况并不多见,在编写构造器时,我们遵循这样的原则:“用尽可能简单的方法使对象进入正常状态;可以的话,避免调用其他方法”。在构造器中唯一能安全调用的是那些方法时基类中的final方法(也适用于private方法,它们自动属于final方法)。这些方法不会被覆盖,因此不会出现“多态”的问题。

(2)初始化的实际过程是:

1)在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。

2)调用基类构造器。这个过程不断持续,直到最底层的导出类。

3)按照声明的顺序调用成员变量的初始化方法。

4)调用导出类构造器的主体。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值