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();
}
}
运行结果如下:
静态内部类是怎么实现的呢?上面代码示例实际上会生成两个类:一个是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。
评论前必须登录!
注册