黑马程序员技术交流社区

标题: 向大家求教了 [打印本页]

作者: 张金铎    时间: 2013-5-13 22:10
标题: 向大家求教了
本帖最后由 张金铎 于 2013-5-13 22:44 编辑
  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. }
复制代码
我觉得就输出XZ啊,为什么结果跟我想的不一样啊,求高手能给分析下么?
作者: 任江峰    时间: 2013-5-13 22:19
本帖最后由 任江峰 于 2013-5-13 22:40 编辑

类的实例化过程:
1,加载.class类文件。
2,执行static静态代码块,如果有的话。
3,开辟内存空间,分配内存地址。
4,创建对象特有的属性,执行默认初始化。
5,对对象的属性执行显示初始化。
6,执行构造代码块。
7,执行构造函数。
8,new表达式返回对象引用。
这里的new Z();

由于Z类继承X类,加载Z类之前会加载X类。加载X类的过程:
执行第4步,创建对象特有的属性,执行默认初始化。 Y b =null;
执行第5步,对对象的属性执行显示初始化。 b= new Y();//new Y的对象会执行Y的构造函数,输出"Y"
执行第7步,执行本类的构造函数。 执行X类的构造函数,输出"X"

然后会加载Z类,加载Z类的过程:
执行第4步,创建对象特有的属性,执行默认初始化 Y b =null;
执行第5步, 对对象的属性执行显示初始化。 b= new Y();//new Y的对象会执行Y的构造函数,输出"Y "
执行第7步, 执行本类的构造函数。 执行Z类的构造函数,输出"Z"

所以最终的输出结果是:"YXYZ"







作者: 尹丽峰    时间: 2013-5-13 22:34
本帖最后由 尹丽峰 于 2013-5-13 22:57 编辑
  1. package heima;

  2. class X {//加载x类
  3. Y b = new Y();// 2 new Y 直接去加载Y类 Y类中的构造函数Y()初始化 输出 Y
  4. X() {
  5. System.out.print("X");//3 加载x类的同时 构造函数初始化 so 输出X
  6. }
  7. }

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

  13. public class Z extends X { //继承X类 就先加载X类 请看X类
  14. Y y = new Y();//4 new y(); 构造函数 Y在此执行 输出 Y
  15. Z() {
  16. System.out.print("Z");
  17. }

  18. public static void main(String[] args) {
  19. new Z();// 1 执行靠的是main关键字 所以从这里开始
  20. }
  21. }
复制代码

作者: 张金铎    时间: 2013-5-13 22:44
任江峰 发表于 2013-5-13 22:19
类的实例化过程:
1,加载.class类文件。
2,执行static静态代码块,如果有的话。

很清楚,谢谢啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2