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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 海带 中级黑马   /  2015-4-16 10:07  /  435 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 海带 于 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号处的前面?



3 个回复

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

现在懂了吧
回复 使用道具 举报
受教了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马