为什么java不允许在非静态内部类中使用静态初始化块进行静态声明?
在下面的代码中,尽管做了同样的事情,outer2将工作而inner2将不会工作。有任何想法吗?我不是在寻找一种解决方法,我只是想了解为什么java无法做到这一点。
public class WhyUNoStatic {
public static final String outer1 = "snth"; // ok
public static final String outer2; // ok
static
{
outer2 = "snth";
}
public class Inner {
public static final String inner1 = "snth"; // still ok!
public static final String inner2; // FAILURE TIME
static
{
inner2 = "snth";
}
}
}
编辑:请注意inner1
可以正常使用。它并不是java禁止内部类中的静态变量,它只是禁止声明它们。
答案 0 :(得分:2)
JLS, Section 8.1.3,不允许这种行为。
如果内部类声明了静态初始化程序(第8.7节),那么这是一个编译时错误。
如果内部类声明一个显式或隐式静态的成员,那么这是一个编译时错误,除非该成员是一个常量变量(§4.12.4)。
您在内部类中声明了static
个变量final
,这没关系,但那里禁止使用静态初始值设定项。
答案 1 :(得分:2)