Java内部类和静态方法或字段

4
为什么内部类不能有静态(非final)字段和方法?
这个问题以前已经被提过,但是回答都是:这是一个设计决策或者因为内部类发生在外部类的上下文中,不能声明静态方法。
然而这些答案并没有解答我的问题。如果允许内部类有静态字段和方法会有什么后果?我猜这两个限制彼此相连。因为静态方法需要访问内部类的其他静态方法和非final静态变量,甚至从外部类访问(以能够改变内部状态),这将使内部类的行为类似于静态类。JVM可以限制对内部类中静态方法和数据的访问,但是这引出了另一个问题:为什么我们不能在内部类中声明静态非final变量?
这是设计问题还是存在问题?
顺祝商祺

2
根本问题在于它没有意义。内部类本质上不是静态的;它附加在外部类的实例上。在内部类上使方法静态只是毫无意义的。 - Louis Wasserman
2
你可以在内部静态类中声明静态成员。该类只需是静态内部类即可。 - Balkrishna Rawool
@BalkrishnaRawool OP 询问的是内部类(非静态嵌套类)。 - Pshemo
@returnFromException:是的,你可以这样做。但编译器不允许它。而且它不允许它是因为这没有任何意义。 - Balkrishna Rawool
如果您有一个外部类Human和一个内部类Heart,该怎么办?假设Heart有两个字段:static isPumping(用于设置内置心脏的默认行为)和hadStroke(特定于心脏)。内部类不允许更改isPumping,而静态嵌套类会强制将Heart与Human类关联(这不是预期的)。我该怎么办?(假设不允许将isPumping传递给构造函数) - BrunoMCBraga
显示剩余4条评论
2个回答

0
在非静态内部类中声明静态变量似乎与创建非静态内部类的意图相矛盾。
如果你声明一些变量和方法为静态的,那么当它们可以在不创建类实例的情况下访问时,你就这样做了。如果你声明内部类为非静态的,那么它是一个实例类型,因此意图是通过它的实例而不是静态地访问它。如果你声明内部类为静态的,因此将其与外部类分离,你可以声明变量和方法为静态的。
你问如果Java允许你在内部非静态类中声明静态方法/字段会有什么后果。嗯,可能没有什么后果。但这只是没有意义的,因此这是一个设计选择。

不完全正确。如果您有一个外部类Human和一个内部类Heart,会怎样呢?假设Heart有两个字段:静态isPumping(用于设置内置心脏的默认行为)和hadStroke(特定于心脏)。内部类不允许更改isPumping,而静态嵌套类会强制将Heart与Human类关联(这不是预期的)。我该怎么办?(快速示例) - BrunoMCBraga
是的,但内部类的问题在于它必须通过外部访问。Outer.Inner.variable/method。因此,如果inner是非静态的,则必须通过Outer outer = new Outer(); outer.Inner.method/variable进行访问。虽然可行,但很麻烦。这就是为什么它可能不被允许的原因。 - Null-Pointer-Exception
1
如果内部类是非静态的,那么你就必须通过 Outer outer = new Outer(); outer.Inner.method/variable 来访问它。但这并不一定正确。只要内部类的字段是编译时常量且为静态的,我们就可以通过 Outer.Inner.compileTimeConstant 来访问它们(不需要 Outer 实例)。演示请见 http://ideone.com/wGeErO。 - Pshemo
是的,他就是。老实说,我不知道如何回答这个问题。我仍然认为,在非静态类中使用非静态变量是一种设计选择,找不到其他可能性。 - Null-Pointer-Exception

0
回答为什么... ->
内部类对象与外部类对象紧密关联,这意味着没有外部类对象的存在,内部类对象就不存在的机会。因此,在内部类中定义任何静态变量/方法都无法满足此要求。
对于静态嵌套类 -> 内部类对象与外部类对象不是紧密关联的。

这意味着静态内部类可以拥有静态成员吗? - Mariam Atef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接