非公共类Out
中的静态初始化块未运行,但静态嵌套类snOut
中的静态初始化块仍在运行。这可能是怎么回事?
public class staticNested {
static{
System.out.println("In staticNested");
}
static class sn{
static{
System.out.println("sn in staticNested");
}
void p(){
System.out.println("In static nested class method p");
}
}
public static void main(String [] args){
sn n = new sn();
n.p();
Out.snOut no = new Out.snOut();
no.p();
}
}
class Out{
static{
System.out.println("In Out"); //Skips this
System.out.println("Here"); //Skips this
}
static class snOut{
static {
System.out.println("In snOut in Out");
}
private int x;
void p(){
System.out.println("In snOut in outside Class out: " + x);
}
}
}
这是输出:
In staticNested
sn in staticNested
In static nested class method p
In snOut in Out
In snOut in outside Class out: 0
答案 0 :(得分:3)
内部类 I 的实例,其声明发生在静态上下文中没有词汇封闭实例。
在您的代码中,您尝试访问静态的类 sn ,因此它不会根据规范包含任何封闭类。这就是为什么静态的封闭类块没有执行的原因。
答案 1 :(得分:1)
实际上,在您的代码中,您并没有使用类Out
。这是一个原因,为什么Java没有初始化它并且没有调用它的静态部分。
UPD。:解释。您的代码会导致类Out.snOut
的初始化,但这不是初始化类Out
的原因。
答案 2 :(得分:1)
你的内在类是静态的。这意味着它们就像外部类一样,它们的类型对象可以在不需要父对象的情况下进行初始化。所以这里永远不会初始化父对象,也不会执行静态初始化块。