为什么内部类不能声明静态成员?

时间:2011-12-18 21:07:22

标签: java inner-classes

Java Tutorial说,由于内部类与封闭类的实例相关联,因此它(内部类)无法定义任何静态成员本身。

对我来说有趣的是为什么内部类不能声明静态成员,例如,某个private static字段,这个内部类的实例可能与同一内部类的其他实例共享?这只是Java中的一个实现,必须被视为理所当然或其他什么?

5 个答案:

答案 0 :(得分:6)

基本上只是一个武断的决定。没有理由无法支持,但 支持它也没有任何理由。只是声明外部类中的静态字段。

另外,该引用可能不完全正确:我相信你可以在内部类中声明一个静态的serialVersionUID。

答案 1 :(得分:2)

因为Java Language Specification says so

  

内部类是一个非显式或隐式的嵌套类   声明静态。内部类可能不会声明静态初始化器   (§8.7)或成员接口。内部类可能不会声明静态   成员,除非它们是编译时常量字段(第15.28节)。

至于为什么以这种方式指定,我不知道。我的猜测是内部类被设计为小辅助类,其复杂性应该非常有限。

答案 2 :(得分:2)

内部类为什么不能声明静态成员?

内部类包含在外部类的实例区域中。因此,在内部类中,不允许声明静态成员。另一方面,静态内部类包含在外部类的静态区域中。因此,只允许声明静态成员,而不是实例成员。

image >> two areas inside outer class

答案 3 :(得分:0)

内部class可能不会声明static个字段,除非它们是编译时常量。因此,如果您将static字段声明为final,它将起作用。

class Foo {
    class Test {
       final static int i = 10;
    }
}

将编译并完美运行

static字段只能在static或顶级类型中声明。因此,(纯)static变量只能在static class中声明。

答案 4 :(得分:-1)

这将导致在内部类中具有静态成员变量的利益冲突。一般来说,内部类在被实例化之前需要具有外部或封闭类的对象实例。静态成员变量表明您甚至不需要该特定类的对象实例,在这种情况下是内部类,但内部类依赖于该类,并且只能与外部类实例共存。你看到争论中出现利益冲突的地方吗?但是,您可以通过将内部类声明为static来创建内部类中的静态成员变量,这意味着内部类不再需要与外部类对象共存。

public class A {

   public static class B {

       private static JPanel myJPanel;

   }

}