为什么我们不能在[public]内部类中声明静态方法,除非这些内部类也被声明为静态?

7

可能是重复问题:
为什么我们不能在非静态内部类中声明静态方法?

大家好,在Java中,我们为什么不能在[public]内部类中声明静态方法,除非这些内部类也被声明为静态?

令人惊讶的是,顶层类可以拥有任意数量的静态方法,而不需要任何特殊修饰符。

2个回答

2

非静态内部类只有在外部类的实例上下文中才存在。

因此...如果你要有一个静态方法,整个内部类都必须是静态的。如果不这样做,当尝试调用静态方法时,无法保证内部类已经存在。


8
这完全是错误的。只有内部类的实例存在于外部类的上下文中,并且这仅仅是因为内部类隐式地引用了外部类。这与类定义无关。 - Lawrence Dol

1
要问的问题是 - 如果您在内部类中有一个静态方法,那么如何调用该静态方法?答案是,您无法调用。
内部类与外部类的实例相关联。
根据Effective Java的说法 - “每个非静态[嵌套]类的每个实例都隐式地与其包含类的封闭实例相关联”。
这就是将“内部”类设置为静态的原因。这实际上是一个静态嵌套类,它是一个完整的类,仅出于打包方便而存在于封闭类中。

4
为什么 OuterClass.InnerClass.staticMethod() 不能工作?内部类只是一个普通的类,它具有对封闭类实例的隐藏引用。 - Lawrence Dol
1
@Software Monkey -- 很好的观点。但是有一个问题--类加载器无法访问内部类,除非在外部类的实例上下文中,这就是为什么你不能像上面提到的那样做某些事情的原因。 - Kal
1
那么这就是Java的问题了。因为其他语言没有这个限制。 - Pacerier
你错了,@Kal。类加载器绝对可以访问内部类而不需要外部类的实例。只有内部类的实例不能在没有外部类实例的情况下存在。这可以通过通过OuterClass.InnerClass.class获取Class实例来轻松验证,然后可以进行反射。禁止在这些类上使用静态方法的决定可能是一个概念/设计动机的决定。个人认为这不是一个好决定,但无论如何,你给出的理由都是无意义的。 - Elias Vasylenko
如果您创建一个私有的、非静态的嵌套类,那么“private”是否意味着外部类已经有一个实例,如果访问嵌套类的实例? - Phillip

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