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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王威 中级黑马   /  2012-10-18 09:35  /  1529 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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 B extends X {
  13.         Y y = new Y();
  14.         B() {
  15.                 super();//这句可省
  16.                 System.out.print("Z");
  17.         }

  18.         public static void main(String[] args) {
  19.                         new B();
  20.         }
  21. }
复制代码
这段代码执行结果是什么?
我的分析是这样的:
先执行main方法里的new B();
然后到B类里执行构造方法super();
接下来执行X类的构造方法打印“X”
最后执行B类构造方法里第二句打印“Z”
所以我分析的结果最后打印出“XZ”
那么在该程序中Y类根本没用到?

评分

参与人数 2技术分 +2 收起 理由
谭立文 + 1 赞一个!
唐志兵 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
你自己运行一下不就知道Y类用没用到。。。。。。

打印的是YXYZ

在创建对象实例的时候,是先将成员变量初始化,才运行的构造函数。
打印的两个Y一个是继承自父类的,一个是自己的

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
结果是YXYZ
我的分析是这样的:
先执行main方法里的new B();
然后到B类里执行构造方法super(),首先执行父类X的Y b = new Y();打印“Y”.再执行B的构造方法打印“X”.
然后执行B类的 Y y = new Y();打印“Y”.再执行B类的构造方法中的System.out.print("Z");打印“Z”.

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
给你一个清晰的执行过程
new B()
1 执行X类的构造器
  * X类的显示初始化语句--Y
  * X构造器的内容 -- X
2 执行B类的构造器
  * B类的显示初始化语句--Y
  * B类的构造器内容 -- Z

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
用到了,看代码
首先执行的是new B()
让后到B类里面,发现B类里面先创建了一个Y对象,
再去Y类里,发现Y类的构造函数输出Y,所以这时输出Y
接下来又回到B的构造函数里面,你也知道会隐式调用父类构造函数super();
既然父类是x,就x类里边,发现又new了一个Y对象,再次调用Y的构造函数,然后调用X的构造函数。
最后回到B类来,调用B的构造函数。
所以就是YXYZ
回复 使用道具 举报
对象的执行过程是:
1)找到class文件并加载到内存中。
2)执行该类中的static代码块,如果有的话,并给类进行初始化。
3)在堆内存中开辟空间,分配内存地址。
4)在堆内存中建立对象的特有属性。并进行默认初始化。
5)对属性进行显示初始化。(如果有的话)
6)对对象进行构造代码块初始化。(如果有的话)
7)对对象进行对应的构造函数初始化。
8)将内存地址付给栈内存中的引用变量。。(如果有的话)
而且之所以子类中的构造函数存在super,就是因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
回复 使用道具 举报
王威 中级黑马 2012-10-18 13:25:14
7#
cz2861856 发表于 2012-10-18 12:43
用到了,看代码
首先执行的是new B()
让后到B类里面,发现B类里面先创建了一个Y对象,

叫你这样说,输出应该是YYXZ了,怎么是YXYZ呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马