为什么我们被限制在java中的内部类中声明静态成员变量?

Sau*_*akh 6 java inheritance

考虑下面的例子为什么在内部类中继承静态变量没有任何限制,我们被限制在内部类中声明静态成员变量?

public class Outer {

    public class Inner {

        public static String notAllowed;
        /* Above line give following compilation error 
         The field notAllowed cannot be declared static in a non-static inner type, unless initialized with a constant expression
         */

    }

}
Run Code Online (Sandbox Code Playgroud)

但是现在如果我的内部类扩展了包含静态变量的其他类,那么这样可以正常工作.考虑以下代码:

public class Outer {

    public class Inner extends InnerBase {
        /* Since it extends InnerBase so we can access Outer.Inner.allowed */ 
        public Inner(){
             Outer.Inner.allowed = null; // Valid statement
        }
    }

}

public class InnerBase {

    public static String allowed;

}
Run Code Online (Sandbox Code Playgroud)

那么在内部类中限制静态变量的原因是什么,因为它可以通过继承来实现?我错过了非常基本的东西吗?

Kon*_*kov 1

因为为了访问静态字段,您将需要该类的实例Outer,您必须从中创建非静态Inner类的实例。

static字段不应绑定到实例,因此您会收到编译错误。

JLS 8.1.3规定:

内部类不能声明静态初始化器或成员接口,否则会发生编译时错误。

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