黑马程序员技术交流社区

标题: 几个代码块的疑问 [打印本页]

作者: 海带    时间: 2015-4-16 10:07
标题: 几个代码块的疑问
本帖最后由 海带 于 2015-4-16 10:13 编辑

  
  1. public class StaticDemo {
  2.         public static void main(String[] args)
  3.     {
  4.             new Z(); //1
  5.     }
  6. }

  7. class X {
  8.         Y b = new Y();//3创建实例对象
  9.         static {
  10.                 System.out.println("HelloWorld");//2静态代码块
  11.         }
  12.         {
  13.                 System.out.println("How are you ?");//4构造代码块
  14.         }
  15.         X() {
  16.                 System.out.print("X");//5构造方法
  17.         }
  18. }
  19. class Y {
  20.         Y() {
  21.                 System.out.print("Y");//构造方法
  22.         }
  23. }
  24. class Z extends X {
  25.         Y y = new Y();//6
  26.         Z() {
  27.                         //super();
  28.                 System.out.print("Z");//7
  29.         }
  30. }   // 运行结果:
复制代码
HelloWorld
YHow are you ?
XYZ
问题是:为什么Y在How are  you?  的前面?构造代码块不是优于构造函数执行吗?为什么 3 号处的执行在4号处的前面?




作者: 耳东君    时间: 2015-4-16 10:18
Y b = new Y();是个变量   。要先给他初始化.
作者: Himoriarty    时间: 2015-4-16 11:00
这是毕老师讲课过程中总结的:
比如Person P = new Person();
创建对象时系统进行的步骤:
1、因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3、在堆内存中建立对象的特有属性,并进行默认初始化。
4、在对内存中建立对象的特有属性,并进行默认初始化。
5、对属性进行显示初始化。
6、对对象进行构造代码块初始化。
7、对对象进行对应的构造函数初始化。
8、将内存地址赋给栈内存中的P变量。

现在懂了吧
作者: 海带    时间: 2015-4-16 11:44
受教了,谢谢




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