为什么我们不能在(非静态)内部类(Java 16 之前)中使用静态方法?

新手上路,请多包涵

为什么我们不能在非静态内部类中使用静态方法?

 public class Foo {
    class Bar {
        static void method() {} // Compiler error
    }
}

如果我将内部类设为静态,它就可以工作。为什么?

 public class Foo {
    static class Bar { // now static
        static void method() {}
    }
}

在 Java 16+ 中,这两个都是有效的。

原文由 Rahul Garg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 923
2 个回答

因为内部类的实例与其外部类的实例隐式关联,所以它不能自己定义任何静态方法。由于静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,它只能通过对象引用来使用它们,因此在静态嵌套类中声明静态方法是安全的。

原文由 Bill the Lizard 发布,翻译遵循 CC BY-SA 3.0 许可协议

在非静态内部类中允许静态方法没有多大意义;你将如何访问它?如果不通过外部类实例,则无法访问(至少在最初)非静态内部类实例。没有纯静态的方法来创建非静态内部类。

对于外部类 Outer ,您可以像这样访问静态方法 test()

 Outer.test();

对于静态内部类 Inner ,您可以像这样访问它的静态方法 innerTest()

 Outer.Inner.innerTest();

但是,如果 Inner 不是静态的,现在没有纯静态的方法来引用方法 innertest 。非静态内部类绑定到其外部类的特定实例。函数不同于常量,因为对 Outer.Inner.CONSTANT 的引用保证是明确的,而函数调用 Outer.Inner.staticFunction(); 则不是。假设您有 Inner.staticFunction() 调用 getState() ,它在 Outer 中定义。如果您尝试调用该静态函数,您现在对内部类的引用不明确。也就是说,在内部类的哪个实例上调用静态函数?这很重要。看,由于对外部对象的隐式引用,没有真正静态的方式来引用该静态方法。

Paul Bellora 是正确的,语言设计者可以允许这样做。然后他们将不得不小心地禁止在非静态内部类的静态方法中访问对外部类的隐式引用。在这一点上,如果您不能引用外部类(静态除外),作为内部类的价值是什么?如果静态访问没问题,那么为什么不将整个内部类声明为静态的呢?如果你简单地让内部类本身成为静态的,那么你就没有对外部类的隐式引用,你就不再有这种歧义了。

如果您确实 需要 在非静态内部类上使用静态方法,那么您可能需要重新考虑您的设计。

原文由 Eddie 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题