单个类中的加载顺序
使用之前
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();
}
结论:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类变量
父类代码块
父类构造器