可能重复:
Why does Java prohibit static fields in inner classes?
让我们看看Java中的以下代码片段。它只是在Inner
类中声明的Outer
类中总结了两个数字,并按预期正常工作。
package staticfields;
final class Outer
{
final public static class Inner
{
private static int x;
private static int y;
public Inner(int x, int y)
{
Inner.x=x;
Inner.y=y;
}
public void sum()
{
System.out.println(x+y);
}
}
}
final public class Main
{
public static void main(String[] args)
{
new Outer.Inner(5, 10).sum();
}
}
当我尝试从Inner
类中删除static关键字时,它会发出编译时错误,指示内部类不能有静态声明表示静态字段(如果它是非静态的,则在Inner类中声明的x和y不起作用。
为什么只有Java中的静态内部类具有静态成员而非静态内部类不具有?
答案 0 :(得分:0)
内部类是一个非显式或隐式的嵌套类 声明静态。内部类可能不会声明静态初始化器 (§8.7)或成员接口。内部类可能不会声明静态 成员,除非它们是编译时常量字段“
内部类属于out类的一个实例,所以它是有意义的。
答案 1 :(得分:0)
因为“内部类不能有静态声明”。 : - )
但严重的是,根据定义,内部类是非静态的。 您需要了解内部类和嵌套类之间的区别(静态)。
答案 2 :(得分:0)
首先,快速回顾一下为什么你可以声明一个内部类是静态的:
非静态内部类只能存在于其声明的父类的实例的上下文中。因此,如果您的类Inner是非静态的,那么它只能存在于Outer的特定实例中。即内部依赖于具有Outer的实例,并且Inner的每个实例“引用”到外部的实例(使用这里的词语松散地引用)。
这允许非静态内部类引用Outer的非静态字段和方法,而无需显式使用对Outer的引用。
为了告诉编译器和JVM这不是内部类的期望行为,您需要使内部类静态(因此它不再是“内部”类)。然后,这会破坏内部类与外部类实例的依赖关系,并允许您声明“内部”(嵌套)类,就像它是任何其他常规Java类一样。
现在,由于非静态内部类依赖于外部类的特定实例,因此内部类具有非最终静态成员没有意义(因为修改一个有效地打破了内部类的封装) )。我相信如果他们愿意,他们可能在技术上允许它,但是使用它可能是不好的编程习惯,并且表明你真正想要的是一个静态嵌套类。