一尘不染

为什么在Java的内部类中限制了静态字段(不是最终的)?

java

我正在浏览规范,并发现不可能在内部类中拥有不是最终编译时间常数的静态成员。

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成员,却不能拥有static方法?它可以从其所有者类继承静态成员。但是为什么不应该呢?OOP的主要原理是什么?


阅读 192

收藏
2020-12-03

共1个答案

一尘不染

您的课程myInnerClassTest未声明为静态。那么,它具有静态场到底意味着什么呢?

可不可能是

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

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

规格

内部类是未显式或隐式声明为static的嵌套类。

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

内部类可能未声明静态初始化器(第8.7节)或成员接口,否则会发生编译时错误。

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

2020-12-03