4 回答
TA贡献1853条经验 获得超9个赞
因为内部类的实例与其外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,因此它只能通过对象引用来使用它们,在静态嵌套类中声明静态方法是安全的。
TA贡献1796条经验 获得超4个赞
在非静态内部类中允许静态方法没有多大意义; 你怎么去访问它?您无法访问(至少最初)非静态内部类实例而无需通过外部类实例。创建非静态内部类没有纯粹的静态方法。
对于外部类Outer,您可以访问如下静态方法test():
Outer.test();
对于静态内部类Inner,您可以innerTest()像这样访问其静态方法:
Outer.Inner.innerTest();
但是,如果Inner不是静态的,那么现在没有纯粹的静态方法来引用该方法innertest。非静态内部类与其外部类的特定实例相关联。函数与常量不同,Outer.Inner.CONSTANT因为对函数调用Outer.Inner.staticFunction();不保证引用是明确的。假设您有Inner.staticFunction()那些getState()定义的调用Outer。如果您尝试调用该静态函数,则现在对Inner类有一个不明确的引用。也就是说,你在内部类的哪个实例上调用静态函数?这很重要。看,由于对外部对象的隐式引用,没有真正的静态方法来引用该静态方法。
保罗贝洛拉是正确的,语言设计师可以允许这样做。然后,他们必须小心地禁止对非静态内部类的静态方法中对外部类的隐式引用的任何访问。在这一点上,如果你不能引用外部类,除了静态之外,这是一个内部类的值是什么?如果静态访问没问题,为什么不将整个内部类声明为静态呢?如果你只是让内部类本身是静态的,那么你没有对外部类的隐式引用,并且你不再有这种歧义。
如果您确实需要非静态内部类的静态方法,那么您可能需要重新考虑您的设计。
添加回答
举报