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

Java内部类和静态方法或字段,java,static,inner-classes,Java,Static,Inner Classes,为什么内部类不能有静态(非最终)字段和方法 这个问题以前已经发布过,但是发布的答案是:这是一个设计决策,或者因为内部类发生在外部类的上下文中,并且不能声明静态方法 然而,这些答案并没有澄清我的问题。允许在内部类上使用静态字段和方法会有什么后果?我猜这两个限制是相互关联的。由于静态方法需要访问内部类的其他静态方法和非最终静态变量,甚至需要访问外部类(以便能够更改内部状态),这将导致内部类的行为类似于静态类。不过,JVM可以将内部类中的静态方法的访问限制为内部类中的静态方法和数据。然而,这提出了一个

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

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

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

是这个设计还是有问题


在非静态内部类中声明静态变量似乎与创建内部非静态类的意图相矛盾
若您声明一些变量和方法是静态的,那个么当在不创建类实例的情况下访问它们是有意义的时,您就可以这样做;若您声明内部类是非静态的,它的实例类型是静态的,所以您的目的是通过它的实例而不是静态地访问它。若您声明内部类为静态的,所以将其与外部类分开,则可以声明变量和方法为静态的。
您询问,如果java允许您在内部非静态类中声明静态方法/字段,会产生什么后果。很可能没有。但这毫无意义,因此这是一种设计选择。

回答为什么…->
内部类对象与外部类对象紧密关联,这意味着如果没有现有的外部类对象,就不可能存在现有的内部类对象,因此在内部类中定义任何静态变量/方法将无法满足此要求


在静态嵌套类->内部类对象与外部类对象没有强关联的情况下,

基本问题是它没有意义。内部类本质上不是静态的;它附加到外部类的实例。使方法在内部类上是静态的是毫无意义的。您可以在内部类中声明静态成员。类必须是静态的内部类。@BalkrishnaRawool OP正在询问内部类(非静态嵌套类)。@Pshemo:好的。很明显,它们不能有静态成员。因为它们必须有外部类的实例。“谢谢你,”路易斯瓦瑟曼说。所以这是一个适用性的问题,而不是潜在缺陷的问题?因为由于闭包的原因,本地类无法访问封闭方法中的静态字段。我以为这会是类似的。我认为这会导致不一致。这是我的困惑,不太清楚。如果你有一个外阶级的人和一颗内阶级的心呢。假设心脏有两个字段:静态isPumping(在构建的心脏上设置默认行为)和hadstrope(特定于心脏)。内部类不允许更改ispump,而静态嵌套类将强制Heart与类Human关联(不是有意的)。我该怎么办?(快速示例)是的,但内部类的问题是必须通过外部类进行访问。Outer.Inner.variable/method。所以,如果内部是非静态的,您将被迫通过Outer-Outer=new-Outer()访问它;outer.Inner.method/变量。可行但令人讨厌。所以这就是为什么它可能不被允许的原因。”所以如果inner是非静态的,那么您将被强制通过
Outer-Outer=new-Outer();Outer.inner.method/variable
”访问它,这是不必要的。内部类可以有静态字段,只要它们是编译时常量,我们可以通过
Outer.Inner.compileTimeConstant
访问它们(不需要外部实例)。是的,他是。老实说,我不知道怎么回答这个问题。我仍然认为在非静态类中没有静态变量是设计的选择。找不到其他的可能性。