黑马程序员技术交流社区
标题:
几个代码块的疑问
[打印本页]
作者:
海带
时间:
2015-4-16 10:07
标题:
几个代码块的疑问
本帖最后由 海带 于 2015-4-16 10:13 编辑
public class StaticDemo {
public static void main(String[] args)
{
new Z(); //1
}
}
class X {
Y b = new Y();//3创建实例对象
static {
System.out.println("HelloWorld");//2静态代码块
}
{
System.out.println("How are you ?");//4构造代码块
}
X() {
System.out.print("X");//5构造方法
}
}
class Y {
Y() {
System.out.print("Y");//构造方法
}
}
class Z extends X {
Y y = new Y();//6
Z() {
//super();
System.out.print("Z");//7
}
} // 运行结果:
复制代码
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