java 静态内部类总结

平时开发,很少关系静态类细节,现在认真学习了一下,做个总结哈。

1. 如果一个类要被声明为static的,只有一种情况,就是静态内部类。
2. 静态内部类跟静态方法一样,只能访问外部类的静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法。
3. 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
4. 静态内部类可以单独初始化,普通内部类不行,例子如下:
静态内部类
Inner i = new Outer.Inner();

普通内部类
Outer o = new Outer();
Inner i = o.new Inner();

根本原因:静态内部类,不持有外部引用,普通内部类,则持有。

5. 加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。

可看如下例子:

public class Outer {  
    static {  
        System.out.println("load outer class...");  
    }  

    //静态内部类  
    static class StaticInner {  
        static {  
            System.out.println("load static inner class...");  
        }  

        static void staticInnerMethod() {  
            System.out.println("static inner method...");  
        }  
    }  

    public static void main(String[] args) {  
        Outer outer = new Outer();      //此刻其内部类是否也会被加载?  
         System.out.println("===========分割线===========");  
        Outer.StaticInner.staticInnerMethod();      //调用内部类的静态方法  
    }  
}  

运行结果:
load outer class…
==========分割线==========
load static inner class…
static inner method…

调用构造方法时,外部类Outer被加载,但这时其静态内部类StaticInner却未被加载。直到调用该内部类的静态方法(在分割线以下),StaticInner才被加载。可以做类似的实验验证非静态内部类的情况(普通内部类,只要不被new,那也不会加载)。 

根据内部类不会在其外部类被加载的同时被加载的事实,我们可以引申出单例模式的一种实现方式:

public class Singleton {  
    private Singleton() {}  

    static class SingletonHolder {  
        private static final Singleton instance = new Singleton();  
    }  

    public static Singleton getInstance() {  
        return SingletonHolder.instance;  
    }  
}  

这样做的好处是,可以确保多线程的情况下是安全的,且是唯一的。
因为,当执行了SingletonHolder.getInstance(), SingletonHolder 类才被加载,instance 变量一次性初始化,后面直接返回的,就是instance对象。

参考:

Java静态类
java 常见的单例模式,推荐静态内部类
内部类加载顺序及静态内部类单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newchenxf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值