内部类使用静态方法或静态对象需要 static

  1. static的属性和方法在类加载过程中就会存入到内存 方法区
  2. 内部类不会随着类加载而加载
    • 非静态内部类会在内部类对象实例化(新建对象)的过程中加载
    • 静态内部类会在内部类调用(实例化,静态方法,静态成员)
  3. 综上 非静态内部类调用方法的时候可能未加载导致报错。
    • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值