Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们被限制在java的内部类中声明静态成员变量?_Java_Inheritance - Fatal编程技术网

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

为什么我们被限制在java的内部类中声明静态成员变量?,java,inheritance,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

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

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;

}
那么,将内部类中的静态变量限制为可以通过继承实现的原因是什么呢?
我是否遗漏了一些非常基本的内容?

因为为了访问静态字段,您需要一个
外部
类的实例,您必须从中创建一个非静态
内部
类的实例

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

文件规定:

内部类不能声明静态初始值设定项或成员 接口,或发生编译时错误

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

从oracle网站:

  • 与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段
  • 因为内部类与实例关联,所以它本身不能定义任何静态成员
  • 我是这样理解的:

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


    但是inner类只存在一个outterclass的实例,因此它不能在实例化之前初始化它的静态成员,这是自相矛盾的。

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


    我猜Java创建者就是希望这样。

    因为
    内部
    类定义本身不是静态的?请注意,在第二个示例中,您没有在
    内部
    中声明一个
    静态
    字段,这里没有静态字段的内部类定义,也没有继承。静态变量从外部范围可见。Java16中的限制已经解除。