Java术语辨析:所有局部类和匿名类都属于内部类吗?
术语判定结论
你对内部类和静态嵌套类的区分完全符合Java官方规范。
Java语言规范对嵌套类的分类规则明确:
- 被
static修饰的嵌套类为静态嵌套类,不会隐式持有外围类实例的引用,无法直接访问外围类的非静态成员,不需要依赖外围类实例即可创建对象。 - 未被
static修饰的嵌套类为内部类,会隐式绑定外围作用域的实例,可直接访问外围类的所有成员(含私有成员)。
延伸问题解答
所有局部类、匿名类都属于内部类范畴,完全符合官方定义。
内部类共包含三类:
- 成员内部类:直接定义在外围类成员位置的非静态类,即示例代码中的
Inner类 - 局部内部类:定义在方法、构造器、代码块内部的具名类,即示例代码中的
Local类 - 匿名内部类:没有显式类名的局部类,即示例代码中实现
Runnable接口的匿名类
对应特性可参考你给出的示例代码:
public class Example { class Inner { void f1() {System.out.println("Example.this"); } // 成员内部类,可以访问外围类的this } static class StaticClass { void f1() {System.out.println("this"); } // 静态嵌套类,只能访问自身的this } public static void main(String[] args) { } void f1() { int local=0; class Local { void f2() { System.out.println("Example.this"); // 局部内部类,可以访问外围类this和作用域内的有效final局部变量 System.out.println("local"); } } Runnable r = new Runnable() { @Override public void run() { System.out.println("Example.this"); // 匿名内部类,同样可以访问外围类this和作用域内的有效final局部变量 System.out.println("local"); } }; } }
注:日常开发中常有人把静态嵌套类误称为「静态内部类」,这个表述不符合官方术语规范,内部类从定义上就不包含static修饰的嵌套类。
内容的提问来源于stack exchange,提问作者Gonen I
相关产品推荐
相关产品推荐

