静态内部类与外部的加载顺序
它们的关系是按需加载,如果你调用了外部类的静态属性、静态方法或者构造器,那么外部类将会被加载而内部类并不会加载。
如果你调用了静态内部类的静态属性、静态方法或者构造器,那么内部类将会被加载而外部类并不会被加载。
接下来我们验证下:
1) 类的准备
public class OutClass {
static {
System.out.println("外部内加载");
}
public static void say(){
System.out.println("外部类说");
}
static class InnerClass{
static {
System.out.println("内部类加载");
}
public static void say(){
System.out.println("内部类说");
}
}
}
2)加载外部类
class Test {
@org.junit.jupiter.api.Test
void test(){
OutClass.say();
}
}
执行结果
3)加载内部类
class Test {
@org.junit.jupiter.api.Test
void test(){
OutClass.InnerClass.say();
}
}
执行结果
总结:静态内部类与外部类的加载相互独立
非静态内部类与外部类的加载关系
外部类的加载不会影响到内部类,非静态内部类的加载依赖于外部类的加载(即非静态内部类实例化是在外部类实例的基础上)
接下来我们验证下
1)类的准备
public class OutClass1 {
static {
System.out.println("外部内加载");
}
public void say(){
System.out.println("外部类说");
}
class InnerClass{
{
System.out.println("内部类加载");
}
public void say(){
System.out.println("内部类说");
}
}
}
2) 加载外部类
class Test {
void test(){
OutClass1 outClass1 = new OutClass1();
}
}
执行结果
3)加载内部类
class Test {
void test(){
OutClass1 outClass1 = new OutClass1();
OutClass1.InnerClass innerClass = outClass1.new InnerClass();
}
}
执行结果