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

时间:2014-01-09 11:41:30

标签: 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
         */

    }

}

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

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;

}

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

3 个答案:

答案 0 :(得分:2)

来自oracle网站:

1)与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。

2)因为内部类与实例相关联,所以它本身不能定义任何静态成员。

我这样理解:

如果内部类有自己的静态字段,静态字段必须在类实例化之前初始化;

但是一个内部类只存在一个outterclass实例,所以它不能在实例化之前初始化它的静态成员,然后在Contradiction中。

答案 1 :(得分:1)

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

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

JLS 8.1.3指定:

  

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

     

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

答案 2 :(得分:0)

很可能声明静态变量的目的与在内部类中声明任何变量的目的相反。静态变量旨在静态 - 在任何其他静态方法和类中使用,而内部类意味着这些类仅为其外部类服务。

我猜 Java 的创造者只是想要这样。