我认为这是因为Inner类本身不是静态的.从Java的角度来看,它是一个实例变量,我认为(1)类加载器不是设计为爬入内部非静态类来查找和初始化potentiel静态对象.
但它不是不可能的问题,请看下面的例子:
public class Outer {
public static class Inner {
Outer owner;
static String constant;
{
constant = "foo";
}
private Inner(Outer owner) {
if (owner == null) {
throw new NullPointerException();
}
this.owner = owner;
}
}
public Inner newInner() {
return new Inner(this);
}
}
甚至没有警告,因为Inner声明为静态.
但乍一看,它有一个指向封闭外部实例的指针,只能通过Outer创建,因为它只有一个私有构造函数,并且它的所有者不能为null.从程序员的角度来看,它具有非静态内部类的所有约束,并且可以像一个一样使用(除了像Outer.this这样的特殊习语),但从编译器的角度来看它是静态的,静态字段将是静态的在第一次外部初始化时正确初始化.
(1):Pacerier在下面解释了为什么这是不正确的.