为什么静态字段(不是final)在java的内部类中受到限制[重复]

2024-02-08

可能的重复:
为什么Java禁止内部类中的静态字段? https://stackoverflow.com/questions/1953530/why-does-java-prohibit-static-fields-in-inner-classes

我正在查看规范并发现内部类中不可能有不是最终编译时常量的静态成员。

class HasStatic {
    static int j = 100;
}
class myInnerClassTest {
    class Inner extends HasStatic {
        static final int x = 3;  // OK: compile-time constant
        static int y = 4;  // Compile-time error: an inner class
    }
    static class NestedButNotInner{
        static int z = 5;    // OK: not an inner class
    }
    interface NeverInner {}   // Interfaces are never inner
}

而我从为什么内部类可以有静态final成员但不能有静态方法? https://stackoverflow.com/questions/2482327/why-can-we-have-static-final-members-but-cant-have-static-method-in-an-inner-cla它可以从其所有者类继承静态成员。但为什么不应该呢?它伤害了哪些 OOP 的主体?


你的班myInnerClassTest未声明为静态。那么,拥有静态字段到底意味着什么呢?

可不可能是

  • 无论封闭实例如何,所有实例都相同?
  • 对于具有相同封闭实例的该内部类的所有实例都相同吗?

乍一看,大多数程序员可能会认为这是第一种情况,而(非静态)内部类的封装逻辑可能会导致第二种选择。无论哪种情况(或两者都有不同的修饰符)都需要一个新的定义static这可能被认为没有必要。无论哪种情况,程序员都会对确切的含义感到困惑。

From 规格 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3 :

内部类是非显式或隐式的嵌套类 声明为静态。

内部类包括本地类(§14.3)、匿名类(§15.9.5)和 非静态成员类(第 8.5 节)。

内部类不得声明静态初始值设定项(第 8.7 节)或成员 接口,或者发生编译时错误。

内部类不能声明静态成员,除非它们是常量 变量(第 4.12.4 节),或者发生编译时错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么静态字段(不是final)在java的内部类中受到限制[重复] 的相关文章

随机推荐