我们知道一个类可以有很多部分组成,构造函数,静态方法、静态成员变量,成员变量,构造代码块,局部代码块,静态代码块。那么类在加载进内存并且创建对象时都发生了什么,又都有什么顺序呢?
先看一个栗子吧:
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的特点在上一篇博客有总结。