类的初始化过程
public class Person
{
String name = "张三";
int age = 18;
public Person()
{
name = "李四";
age = 28;
}
}
Person p = new Person()
1、将 Person.class 文件加载到内存
2、在栈内存之中为 p 开辟空间
3、在堆内存中为 Person 对象开辟空间
4、对 Person 对象的成员变量进行默认初始化:name = null, age = 0
5、对 Person 对象的成员变量进行显示初始化:name = “张三”,age =18
6、通过构造方法对 Person 对象的成员变量赋值:name = “李四”, age=28
7、 Person 对象初始化完成,将对象地址赋值给 p
继承中类的初始化
1、一个类的静态代码块、构造代码块、构造方法的执行流程:
静态代码块>构造代码块>构造方法
构造代码块和构造方法会在调用构造的时候执行
2、静态的内容是随着类的加载而加载,静态代码块的内容会优先执行
3、子类初始化之前会先对父类进行初始化
public class Fu
{
static
{
System.out.println("Fu 的静态代码块");
}
{
System.out.println("Fu 的构造代码块");
}
public Fu ()
{
System.out.println("Fu 的构造函数");
}
}
public class Zi extends Fu
{
static
{
System.out.println("Zi 的静态代码块");
}
{
System.out.println("Zi 的构造代码块");
}
public Fu ()
{
System.out.println("Zi 的构造函数");
}
}
public class TestDemo
{
public static void main(String[] args)
{
Zi z = new Zi();
}
}
在 Zi z 的时候会先对 Zi 进行加载,而在对 Zi 进行加载之前 Fu 进行加载。类在加载的时候会优先加载静态代码块,而构造代码块和构造方法在调构造的时候才会执行
Fu 的静态代码块
Zi 的静态代码块
接下来 new Zi() 会先调用 Fu 的构造,执行 Fu 的构造代码块和构造方法,然后调用 Zi 的构造代码块和构造方法
Fu 的构造代码块
Fu 的构造函数
Zi 构造代码块
Zi 的构造函数
总结:
1、创建对象并非在构造函数中进行(在构造函数中可以使用 this 可以看出,在调用构造方法时,对象就已经存在),而是在执行 "new" 关键字的时候,构造函数只是为了对数据进行初始化
2、在执行 "new" 关键字,即创建对象的时候,会首先加载父类,然后再加载本类,加载顺序为:默认初始化、显示初始化、构造函数初始化