当前位置: 首页 > 网络课堂 > Java对象实例是何时被创建

Java对象实例是何时被创建

2016年12月09日 13:42:39 访问量:20

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

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

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

请看下面代码:

Java代码

Date date=new Date();

em.out.println(date.getTime());

新手在刚接触构造函数这个概念的时候。他们常常得出这样的结论:对象实例是在调用构造函数后创建的。因为调用构造函数后,调用引用(date)的实例方法便不会报NullPointerException的错误了。

二、经验者的观点

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

请看下面代码:

Java代码

public class Test

{

public Test()

{

this.DoSomething();

}

private void DoSomething()

{

System.out.println("do init");

}

}

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

三、父类构造函数

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

Java代码

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构造函数初始化。然而非常不幸的是,这是个错误的观点。

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

Java代码

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();

}

}

这段代码运行的结果是先调用父类的构造函数,再调用子类的init()方法,再调用子类的构造函数。

这是一段奇妙的代码,子类的构造函数居然不是子类第一个被执行的方法。我们早已习惯于通过super方便的调用父类的方法,但是好像从没这样尝试从父类调用子类的方法。

再次声明,这只是个示例。是为了与您一起探讨对象实例化的秘密。通过这个示例,我们再次印证了开头的观点:早在构造函数被调用之前,实例便已被创造。若该对象有父类,则早在父类的构造函数被调用之前,实例也已被创造。这让java显得有些不面向对象,原来老子儿子其实是一块儿出生的。

  五、奇怪但危险的代码

本篇是对上篇奇怪代码的延续。但是这段代码更加具有疑惑性,理解不当将会让你出现致命失误。

请看下面代码:

Java代码

public class BaseClass {

public BaseClass()

{

System.out.println("create base");

init();

}

protected void init() {

System.out.println("in base init");

}

}

public class SubClass extends BaseClass{

int i=1024;

String s="13 leaf";

public SubClass()

{

System.out.println("create sub");

init();

编辑:阿不力孜江吐尔地
评论区
发表评论

评论仅供会员表达个人看法,并不表明网校同意其观点或证实其描述
教育部 中国现代教育网 不良信息 垃圾信息 网警110
郑重声明:本站全部内容均由本单位发布,本单位拥有全部运营和管理权,任何非本单位用户禁止注册。本站为教育公益服务站点,禁止将本站内容用于一切商业用途;如有任何内容侵权问题请务必联系本站站长,我们基于国家相关法律规定严格履行【通知—删除】义务。本单位一级域名因备案流程等原因,当前临时借用网校二级域名访问,使用此二级域名与本单位官网权属关系及运营管理权无关。轮台县第十一小学 特此声明。
中华人民共和国电信经营许可证 ICP证 京ICP备13002626号-8 京公网安备11010502032087 轮台县第十一小学 版权所有
联系地址:新疆轮台县策达雅乡
北京网笑信息技术有限公司 仅提供技术支持 违法和不良信息举报中心