A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 a12366456 于 2015-7-20 00:09 编辑
  1. class X {
  2.         Y b = new Y();

  3.         X() {
  4.                 System.out.print("X");
  5.         }
  6. }

  7. class Y {
  8.         Y() {
  9.                 System.out.print("Y");
  10.         }
  11. }

  12. public class Z extends X {
  13.         Y y = new Y();

  14.         Z() {
  15.                 System.out.print("Z");
  16.         }

  17.         public static void main(String[] args) {
  18.                 new Z();
  19.         }
  20. }
复制代码
执行后结果为:YXYZ  ,和我最开始想的结果不一样,我想象的实例化只执行了构造函数不包含上面的语句,明显错了。最后分析可能是Z继承了X,实例化Z的对象时,先隐式实例化父类X的对象,所以先执行了X类中Y的实例化语句打印Y,再执行X的构造函数X()打印X,接着回来实例化Z的对象,先执行Y的实例化语句Y y = new Y();打印Y,再执行Z的构造函数Z()打印Z。不知道对不对??

3 个回复

倒序浏览
我也觉得 结果不应该是 XZ吗?   不应该只执行构造方法?
回复 使用道具 举报
这个结果,你可以打一个断点看看。这样效果更清楚。
回复 使用道具 举报
安卓新手 发表于 2015-7-20 09:02
我也觉得 结果不应该是 XZ吗?   不应该只执行构造方法?

我觉得是我们想当然了,实例化一个类的对象时,哪怕我们调用的是空参空语句的默认构造函数,对于new这个动作,Java也要执行为类的成员变量和成员函数分配内存并初始化的动作,而且这个动作要在调用构造函数之前发生,因为在构造函数中已经可以使用这些成员。只不过这个动作已经被Java封装在底层。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马