Java的对象实例是什么时候被创建

本文转载2JAVA.NET ,对象实例何时被创建,这个问题也许你用一句话就能回答完了。但是它的潜在陷阱却常常被人忽视,这个问题也许并不像你想的那么简单,不信请你耐心看下去。

我前几天问一个同学,是不是在调用构造函数后,对象才被实例化?他不假思索的回答说是。

请看下面代码:
Java代码
Date date=new Date();
em.out.println(date.getTime());
新手在刚接触构造函数这个概念的时候。他们常常得出这样的结论:对象实例是在调用构造函数后创建的。因为调用构造函数后,调用引用(date)的实例方法便不会报NullPointerException的错误了。


经验者的观点

然而,稍稍有经验的Java程序员便会发现上面的解释并不正确。这点从构造函数中我们可以调用this关键字可以看出。

public class Test{
	public Test()
	{
		this.DoSomething();
	}
	private void DoSomething(){
		System.out.println("do init");

	}
}

这段代码中我们在构造函数中已经可以操作对象实例。这也就证明了构造函数其实只是用于初始化,早在进入构造函数之前。对象实例便已经被创建了。



父类构造函数
当创建一个有父类的子类的时候。对象的实例又是何时被创建的呢?我们也许接触过下面经典的代码:

public class BaseClass
{
	public BaseClass(){
		System.out.println("create base");
	}

}

public class SubClass{
	public SubClass()
	{
		System.out.println("create sub");
	}
	public static void main(String[] args)
	{
		new SubClass();
	}
}

结果是先输出create base,后输出create sub。这个结果看起来和现实世界完全一致,先有老爸,再有儿子。因此我相信有很多程序员跟我一样会认为new SubClass()的过程是:实例化BaseClass->调用BaseClass构造函数初始化->实例化SubClass->调用SubClass构造函数初始化。然而非常不幸的是,这是个错误的观点。

奇怪的代码
以下代码是为了驳斥上面提到的错误观点。但是这种代码其实在工作中甚少出现。

public class BaseClass {
	public BaseClass() {
		System.out.println("create base");
		init();
	}

	protected void init() {
		System.out.println("do init");
	}
}

public class SubClass {
	public SubClass() {
		System.out.println("create sub");
	}

	@Override
	protected void init()
	{
		assert this != null;
		System.out.println("now the working class is:" + this.getClass().getSimpleName());
		System.out.println("in SubClass");
	}
	public static void main(String[] args)
	{
		new SubClass();
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值