根据JLS:
内部类是不是显式或隐式声明为静态的嵌套类。内部类不能声明静态初始值设定项或成员接口。
但我下面的代码编译成功。
class A {
interface B {
class C { // Inner class having static variables.
static int d; // Static variable
static {
}
}
}
}
有人能帮我理解这种行为吗
您可以在接口内定义一个类。在接口内部,内部类是隐式的公共静态的。...接口可能包含成员类型声明 接口中的成员类型声明是隐式静态的和公共的。
因此,我们不能将非静态成员声明为静态块、静态方法或静态类。
嵌套接口是隐式静态的,它们本身没有非静态的上下文,这就是为什么C是隐式静态的。
找到相同的 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中,当您将声明为时,就是说它是类的成员,而不是对象(因此为什么只有一个)。因此,在对象上访问它是没