【问题标题】:Are all local classes and all anonymous classes also inner classes?所有本地类和所有匿名类也是内部类吗?
【发布时间】:2021-09-23 06:58:24
【问题描述】:

这个问题主要是关于正确的 Java 术语。

我正在区分一个 inner class,它绑定到其封闭范围的实例,以及一个非内部的 nested static class,它独立于一个封闭的范围实例。

public class Example {
 class Inner {
     void f1() {System.out.println(Example.this); } // Inner class can access Example's this
 }
 static class StaticClass {
     void f1() {System.out.println(this); } // Static nested class - Only its own this
 }

 public static void main(String[] args) {
 }
 void f1() {
     int local=0;
     class Local {
         void f2() {
             System.out.println(Example.this); // Local class - can access Example.this
             System.out.println(local); // can access local
         }
     }
     Runnable r = new Runnable() { 
         @Override
        public void run() {
             System.out.println(Example.this); // Anonymous local class can access Example.this
             System.out.println(local); // can access local 
        }
     };
 }
}

这是正确的术语吗?如下所示,所有本地类和所有匿名类也是内部类吗?

【问题讨论】:

  • JLS 8.1.3. Inner Classes and Enclosing Instances "内部类是嵌套类,不是显式或隐式静态的。内部类是以下之一:非显式或隐式静态的成员类( §8.5);非隐式静态的本地类 (§14.3);匿名类 (§15.9.5)" 以及更多解释哪些类是隐式静态的(查看链接)
  • Java Nested Classes 教程提供了对术语的另一种评论:嵌套类是“另一个类中的一个类”。另外:“嵌套类分为两类:非静态和静态。非静态嵌套类称为内部类。声明为静态的嵌套类称为静态嵌套类。” “在块中定义”的类称为本地类

标签: java inner-classes local-class


【解决方案1】:

根据 Java 语言规范:

  • 匿名类始终是内部类(第 8.1.3 节);它永远不是静态的(§8.1.1、§8.5.1)。 (15.9.5)
  • 所有本地类都是内部类(第 8.1.3 节)。 (14.3)

【讨论】:

  • @user16320675 由于您的评论证明比我的研究更深入,我鼓励您发布自己的答案,并获得投票。
【解决方案2】:
  • 嵌套类是其声明出现在另一个类或接口声明的主体中的任何类。嵌套类可以是成员类、本地类或匿名类。

  • 内部类是一个嵌套类,不是显式或隐式静态的。内部类可以引用封闭类实例、局部变量和类型变量。

  • 本地类和匿名类不能是静态的,所以它们是内部类。

因此,class Inner 是嵌套的,成员和内部, static class StaticClass 是嵌套的,成员但不是内部的,因为它是显式静态的。

【讨论】:

    最近更新 更多