为什么我们被限制在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中的限制已经解除。