本帖最后由 高原 于 2012-7-7 23:30 编辑
毕老师第六天的课程中讲到对象的初始化过程。他说:先对属性显示初始化,然后再进行构造代码块初始化。
我写了个程序,与老师说的不太一样。- public class Person {
-
- {
- System.out.println("name= " + this.name);
- }
- public String name = "zhangsan";
-
- static {
- Person.country = "static country";
- System.out.println("country= " + Person.country);
- }
- public static String country = "cn";
- public Person(String name) {
- this.name = name;
- }
- }
- public class TestInit {
- public static void main(String[] args) {
- Person p = new Person("lisi");
- System.out.println("name= " + p.name);
- System.out.println("country= " + Person.country);
- }
- }
复制代码 打印结果为:
country= static country
name= null
name= lisi
country= cn
这说明构造代码块先执行了,然后显示初始化才执行。
并且,静态代码块的执行时机也比类变量的显示初始化要早。
所以构造代码块,显示初始化谁在代码中比较靠前,谁就先执行,静态代码块和类变量显示初始化也是同样的。
我觉得对象初始化过程是这样的:
1. 首先加载类到内存中 2. 对于类变量,系统默认初始化为null或0等默认值 3. 执行静态代码块或类变量的显示初始化(代码中谁在前面谁就先执行) 4. 在堆内存中开辟空间,分配内存地址 5. 对于成员变量,首先系统默认初始化为null或者0等默认值 6. 然后执行构造代码块或成员变量显示初始化(代码中谁在前面谁就先执行) 7. 最后才是构造方法初始化 8. 将堆内存中的地址付给栈内存中的引用
大家怎样认为?
|