当前位置: 首页 > 知识库问答 >
问题:

内部类允许静态字段和非常数静态表达式——为什么?

钱京
2023-03-14

根据JLS:

内部类是不是显式或隐式声明为静态的嵌套类。内部类不能声明静态初始值设定项或成员接口。

但我下面的代码编译成功。

class A {
    interface B { 
        class C { // Inner class having static variables.
            static int d; // Static variable
            static {
            }
        }
    }
}

有人能帮我理解这种行为吗

共有3个答案

湛骏祥
2023-03-14

您可以在接口内定义一个类。在接口内部,内部类是隐式的公共静态的。...接口可能包含成员类型声明 接口中的成员类型声明是隐式静态的和公共的。

因此,我们不能将非静态成员声明为静态块、静态方法或静态类。

卫甫
2023-03-14

嵌套接口是隐式静态的,它们本身没有非静态的上下文,这就是为什么C是隐式静态的。

祁承望
2023-03-14

找到相同的 JLS 规范:

8.5.2-“成员接口始终是隐式静态的”

9.5 - “接口可能包含成员类型声明 (§8.5)。接口中的成员类型声明是隐式静态和公共的”

这意味着上面的代码在道德上等同于(隐式修饰符用大写字母编写):

class A {
    STATIC interface B {
        PUBLIC STATIC class C { //It's a static class - that's why static members are legal (like a toplevel class but nested)
            static int d; //Static variable
            static {} //Static initializer

        }
    }
}
 类似资料:
  • 问题内容: 假设我们有如下代码。 我知道要实例化 非静态内部类 的 对象,需要外部 类 的 对象 。表示与类相关,并且访问该类不需要实例化。非静态内部类仅可在实例化外部类的对象后使用。包含任何静态引用可能没有意义。 我的问题: 没有外部类的任何显式对象,可以加载非静态内部类吗? 为什么 允许在 非静态内部类* 中将 编译时间常数 (字符串文字,在字符串池和原始类型中以特殊方式处理)设为 静态 ?

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?

  • 问题内容: 我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象会自动具有对该外部类对象的隐藏引用。但是为什么非静态内部类不能具有静态成员呢?Java设计人员只需要禁止在内部类的静态方法内访问非静态外部类字段,这样做会更有意义,不是吗? 如果在内部类中具有静态成员没有意义,那么为什么内部类可以通过继承具有静态成员的类来继承静态成员? 我也读了这篇文章。如前所述: 内部类可以继

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 这是指帖子 ..无法回复或评论任何这样创建的新帖子。为什么是我的 发出警告-应该以静态方式访问静态字段MyUnits.MILLSECONDS吗?谢谢。 问题答案: 因为当您访问静态字段时,您应该在类(或本例中为枚举)上执行此操作。如 不在实例中 编辑 要解决 为什么这样 的问题:在Java中,当您将声明为时,就是说它是类的成员,而不是对象(因此为什么只有一个)。因此,在对象上访问它是没