2015-06-19 46 views
3

为什么内部类不能有静态(非最终)字段和方法?Java内部类和静态方法或字段

此问题之前已发布,但发布的答案是:这是一个设计决策,或者是因为内部类发生在外部类的上下文中,并且无法声明静态方法。

然而这些答案并没有阐明我的问题。允许内部类的静态字段和方法的后果是什么?我的猜测是两个限制都是连接的。由于静态方法需要访问内部类的其他静态方法和非最终静态变量,甚至需要访问外部类(以便能够更改内部状态),这将导致内部类的行为类似于静态方法。不过,JVM可以将内部类中静态方法的访问权限限制在内部类中的静态方法和数据中。然而这引发了一个问题:为什么我们不能在内部类中声明静态非最终变量?

这是设计还是有问题?

亲切的问候

+2

根本问题是它没有意义。内部类本质上不是静态的;它被附加到外部类的一个实例上。在内部类上静态方法是无稽之谈。 –

+2

你可以在内部类中声明静态成员。该类必须是静态的内部类。 –

+0

@BalkrishnaRawool OP询问内部类(非静态嵌套类)。 – Pshemo

回答

0

在非静态内部类中声明静态变量似乎有矛盾打算创建内部非静态类的。
如果你声明一些变量和方法是静态的,你可以在没有创建类的实例的情况下访问它们时使用它,如果你声明内部类非静态的实例类型,那么意图是通过它的实例不是静态地访问它。如果您声明内部类为静态,因此将它与外部类分开,您可以声明静态变量和方法。
你问过如果java允许你在内部的非静态类中声明静态方法/字段,结果会是什么。那么可能会有没有。但它没有任何意义,因此这是一个设计选择。

+0

不完全。如果你有一个外部类人类和一个内心阶层的话会怎么样?假设有两个字段:静态isPumping(用于在内置心脏上设置默认行为)和hadStroke(特定于心脏)。内部类不允许更改isPumping,并且静态嵌套类会强制Heart与类Human(不打算)关联。我该怎么办? (快速示例) – BrunoMCBraga

+0

是的,但与内部类的标志是它必须通过外部访问。 Outer.Inner.variable /方法。因此,如果内在是非静态的,你将通过Outer outer = new Outer()来强制访问它。 outer.Inner.method /变量。可行但讨厌。这就是为什么它可能不被允许。 –

+1

“*因此,如果inner是非静态的,那么您将强制通过'Outer outer = new Outer(); outer.Inner.method/variable'。*”来访问它,这不是必需的。内部类只要是编译时间常量就可以有静态字段,我们可以通过'Outer.Inner.compileTimeConstant'访问它们(不需要外部实例)。演示http://ideone.com/wGeErO。 – Pshemo