本帖最后由 Aaron_wang 于 2015-11-20 00:28 编辑
我们知道一个类可以有很多部分组成,构造函数,静态方法、静态成员变量,成员变量,构造代码块,局部代码块,静态代码块。那么类在加载进内存并且创建对象时都发生了什么,又都有什么顺序呢?
先看一个栗子吧:
- class Person
- {
- private String name;
- private int age = 18;
- private static String country = "CN";
-
- public static void print()
- {
- System.out.println(country);
- }
- static
- {
- System.out.println("haha");
- }
- {
- System.out.println(name+","+age+","+country);
- }
-
- public Person(String name)
- {
- this.name = name;
- System.out.println(name);
- }
- }
- class TestPerson
- {
- public static void main(String[] args)
- {
- Person p = new Person("Aaron");//What happened here?
- }
- }
复制代码 如果对对象的建立过程熟悉的话,答案还是很容易得出的:
haha
null,18,CN
Aaron
整个过程其实可以分为如下几步:
* Person p = new Person("Aaron");
* 1.对象的类文件加载进内存
* 2.静态成员(静态属性和静态方法),方法被调用才会执行------(country赋CN)
* 3.静态代码块(优先于对象),给类初始化------(打印haha)
* 4.对象开辟堆内存空间(分配内存地址)
* 5.在堆内存中建立对象的特有属性,进行默认初始化-----(name赋null,age赋0)
* 6.对属性进行显示初始化-----(age赋18)
* 7.构造代码块初始化,给对象初始化------(打印null,18,CN)
* 8.对对象进行对应的构造函数初始化
* 9.将内存地址赋值给栈内存的p变量
上面就是整个Person类加载并创建对象的整个过程,可以看到静态总是优先于对象加载进内存的,他们所在的内存区域也有区别,静态static的特点在上一篇帖子有总结。 |