- static的属性和方法在类加载过程中就会存入到内存 方法区
- 内部类不会随着类加载而加载
- 非静态内部类会在内部类对象实例化(新建对象)的过程中加载
- 静态内部类会在内部类调用(实例化,静态方法,静态成员)
- 综上 非静态内部类调用方法的时候可能未加载导致报错。
- question:为什么不能像普通类一样调用时加载
- 可能非静态内部类没有类加载机制 和父类一起加载???
参考问题
- https://ask.csdn.net/questions/768930
调用B的时候不是应该先加载A吗?
public class test3 {
public static void main(String[] args) {
A.B.go();
}
}
class A{
static{
System.out.println("a");
}
static class B{
static{
System.out.println("b");
}
public static void go(){
System.out.println("go");
}
}
}
因为B类是内部类,你查看字节码文件可以发现你这个会生成test3.class, A.class 和 A$B.class,你使用 A.B.go() 时知只会用到test3.class 和 A$B.class 不会用到 A.class所以不会执行其中的静态代码块
静态内部类会直接通过编译生成A$B.class
所以此时可以直接认为类B是一个单独的类,加载等操作与普通类相同
单例懒加载用应用
public class Singleton {
private Singleton(){}
private static class Inner{
static Singleton singleton = new Singleton();
}
public static Singleton getInstance(){
return Inner.singleton;
}
}
调用时才加载Inner 保证线程安全
参考
https://blog.csdn.net/zhaodedong/article/details/52911338