考虑下面的例子 当对内部类继承静态变量没有任何限制时,为什么我们被限制在内部类中声明静态成员变量?
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;
}
那么在内部类中限制静态变量的原因是什么?可以通过继承来实现? 我错过了一些非常基本的东西吗?
答案 0 :(得分:2)
来自oracle网站:
1)与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。
2)因为内部类与实例相关联,所以它本身不能定义任何静态成员。
我这样理解:
如果内部类有自己的静态字段,静态字段必须在类实例化之前初始化;
但是一个内部类只存在一个outterclass实例,所以它不能在实例化之前初始化它的静态成员,然后在Contradiction中。
答案 1 :(得分:1)
因为为了访问静态字段,您需要一个Outer
类的实例,您必须从该实例创建非静态Inner
类的实例。
static
字段不应绑定到实例,因此会收到编译错误。
JLS 8.1.3指定:
内部类可能不会声明静态初始化器或成员 接口,或发生编译时错误。
内部类可能不会声明静态成员,除非它们是常量 变量,或发生编译时错误。
答案 2 :(得分:0)
很可能声明静态变量的目的与在内部类中声明任何变量的目的相反。静态变量旨在静态 - 在任何其他静态方法和类中使用,而内部类意味着这些类仅为其外部类服务。
我猜 Java 的创造者只是想要这样。