单个类中的加载顺序
使用之前
main方法为空:
public class Test {//准备阶段直接赋值a=常量public static final String a = "常量";//准备阶段设置默认值 b=null,初始化阶段设置b=静态变量public static String b = "静态变量";//构造时赋值public String c = "变量";static {System.out.println(a);System.out.println(b);System.out.println("静态代码块");}{System.out.println(c);System.out.println("代码块");}public Test() {System.out.println("构造器");}public static void main(String[] args) {}}
结果:
常量静态变量静态代码块
总结:
- 常量最先被加载赋值,在链接-准备阶段直接赋值
- 静态变量在准备阶段设置默认值,在初始化阶段设置值
-
使用之后
main方法new了一个对象:
public static void main(String[] args) {new Test();}
结果:
常量静态变量静态代码块变量代码块构造器
父类子类中的加载顺序
使用之前
main方法为空: ```java public class Parent { public static String b = “父类静态变量”; public String c = “父类变量”;
static {
System.out.println(b);System.out.println("父类静态代码块");
}
{
System.out.println(c);System.out.println("父类代码块");
}
public Parent() {
System.out.println("父类构造器");
} }public class Parent { public static String b = “父类静态变量”; public String c = “父类变量”;
static {
System.out.println(b);System.out.println("父类静态代码块");
}
{
System.out.println(c);System.out.println("父类静态代码块");
}
public Parent() {
System.out.println("父类构造器");
} }
public class Test extends Parent{ public static String b = “子类静态变量”; public String c = “子类变量”;
static {System.out.println(b);System.out.println("子类静态代码块");}{System.out.println(c);System.out.println("子类代码块");}public Test() {System.out.println("子类构造器");}public static void main(String[] args) {}
}
结果:```java父类静态变量父类静态代码块子类静态变量子类静态代码块
使用之后
main方法new了一个子类对象:
public static void main(String[] args) {new Test();}
结果:
父类静态变量父类静态代码块子类静态变量子类静态代码块父类变量父类代码块父类构造器子类变量子类代码块子类构造器
main方法new了一个父类对象:
public static void main(String[] args) {new Parent();}
结论:
父类静态变量父类静态代码块子类静态变量子类静态代码块父类变量父类代码块父类构造器
