Java 静态内部类

Java 静态内部类,静态内部类与静态变量和静态方法定义的位置一样,也带有static关键字,只是它定义的是类,下面我们介绍它的语法、实现原理和应用场景。我们看个静态内部类的例子,如代码如下所示。

package coolcou;

public class Outer {
    private static int shared = 100;

    public static class StaticInner {
        public void innerMethod() {
            System.out.println("inner " + shared);
        }
    }

    public void test() {
        StaticInner si = new StaticInner();
        si.innerMethod();
    }
}

外部类为Outer,静态内部类为StaticInner,带有static修饰符。语法上,静态内部类除了位置放在其他类内部外,它与一个独立的类差别不大,可以有静态变量、静态方法、成员方法、成员变量、构造方法等。

静态内部类与外部类的联系也不大(与其他内部类相比)。它可以访问外部类的静态变量和方法,如innerMethod直接访问shared变量,但不可以访问实例变量和方法。在类内部,可以直接使用内部静态类,如test()方法所示。

public静态内部类可以被外部使用,只是需要通过“外部类.静态内部类”的方式使用,如下所示:

public class coolcou {
    public static void main(String[] args) {
        Outer.StaticInner si = new Outer.StaticInner();
        si.innerMethod();
    }
}

运行结果如下:
Java 静态内部类
静态内部类是怎么实现的呢?上面代码示例实际上会生成两个类:一个是Outer,另一个是Outer$StaticInner,代码大概如下所示。

public class Outer {
    private static int shared = 100;
    public void test(){
        Outer$StaticInner si = new Outer$StaticInner();
        si.innerMethod();
    }
    static int access$0(){
        return shared;
    }
}
public class Outer$StaticInner {
    public void innerMethod() {
        System.out.println("inner " + Outer.access$0());
    }
}

内部类访问了外部类的一个私有静态变量shared,而我们知道私有变量是不能被类外部访问的,Java的解决方法是:自动为Outer生成一个非私有访问方法access$0,它返回这个私有静态变量shared。

静态内部类的使用场景是很多的,如果它与外部类关系密切,且不依赖于外部类实例,则可以考虑定义为静态内部类。比如,一个类内部,如果既要计算最大值,又要计算最小值,可以在一次遍历中将最大值和最小值都计算出来,但怎么返回呢?可以定义一个类Pair,包括最大值和最小值,但Pair这个名字太普遍,而且它主要是类内部使用的,就可以定义为一个静态内部类。

我们也可以看一些在Java API中使用静态内部类的例子:

  • Integer类内部有一个私有静态内部类IntegerCache,用于支持整数的自动装箱。
  • 表示链表的LinkedList类内部有一个私有静态内部类Node,表示链表中的每个节点。
  • Character类内部有一个public静态内部类UnicodeBlock,用于表示一个Unicode block。
赞(0)

评论 抢沙发

评论前必须登录!