今天来记录一下类的加载
单个类的加载顺序
场景一:
public class Test {
public Test(){
System.out.println("构造函数");
}
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public static void main(String[] args){
System.out.println("main函数");
}
}
运行结果为
静态代码块
main函数
场景二:
public class Test {
public Test(){
System.out.println("构造函数");
}
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public static void main(String[] args){
System.out.println("main函数");
Test testA = new Test();
}
}
运行结果为:
静态代码块
main函数
构造代码块
构造函数
场景三:
public class Test {
public Test(){
System.out.println("构造函数");
}
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public static void main(String[] args){
System.out.println("main函数");
Test testA = new Test();
Test testB = new Test();
}
}
运行结果为:
静态代码块
main函数
构造代码块
构造函数
构造代码块
构造函数
以上几个场景的结果可以得出结论,运行顺序为静态代码块(静态变量)->main函数->构造代码块(普通变量)->构造函数,而且静态代码块只会在类加载中执行一次
有继承关系的类的加载顺序
场景一:
public class Parent{
public Parent(){
System.out.println("Parent的构造函数");
}
static{
System.out.println("Parent的静态代码块");
}
{
System.out.println("Parent的构造代码块");
}
public static void main(String[] args){
System.out.println("Parent的main函数");
TestB testBA = new TestB();
TestB testB = new TestB();
}
}
public class SubClass extends Parent{
public SubClass(){
System.out.println("SubClass的构造函数");
}
static{
System.out.println("SubClass的静态代码块");
}
{
System.out.println("SubClass的构造代码块");
}
public static void main(String[] args){
System.out.println("SubClass的main函数");
SubClass subClass= new SubClass();
}
}
运行结果为:
Parent的静态代码块
SubClass的静态代码块
SubClass的main函数
Parent的构造代码块
Parent的构造函数
SubClass的构造代码块
SubClass的构造函数
通过以上场景可以得出继承类的加载顺序为父类的静态代码块(父类的静态变量)->子类的静态代码块(子类的静态变量)->子类的main函数->父类的构造代码块(父类的普通变量)->父类的构造函数->子类的构造代码块(子类的普通变量)->子类的构造函数