2012-03-24 86 views
1

这里是我的代码段我'正与初始化块的信心初始化块与延伸

class Father{ 
Father() { 
    System.out.println("Father constructor runs..."); 
} 
static {System.out.println("static init block of Father...");} 
{System.out.println("instance init block of Father...");} 
} 

class Child extends Father { 
Child() { 
    System.out.println("Child constructor runs..."); 
} 
static {System.out.println("static init block of Child ...");} 
{System.out.println("instance init block of Child ...");} 
public static void main (String[] argv) { 
    new Child(); 
} 

}

这两个类被编译成一个单一的类文件:Child.class 我跑它的命令行Java儿童

这是我的输出中:

static init block of Father... 
static init block of Child ... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 

对于这个输出我很好,除了“静态初始化子块...”被打印两次。从java文档我读“静态初始化块运行一次,当第一次加载类”。

那么这是否意味着我的类Child被加载两次?

任何帮助表示赞赏 感谢 阿尔贝托

+2

我试过这个,'Child的静态初始块'只打印一次(使用OpenJDK Runtime Environment(IcedTea6 1.9.13)(6b20-1.9.13-0ubuntu1〜10.10.1))。你确定你用这段代码得到了两次消息吗? – esaj 2012-03-24 10:28:19

回答

2

无法重现 - 这里的输出,通过在命令行中运行它,我从你的代码获得:

static init block of Father... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 

你还没说你怎么'重新运行代码,但我怀疑或者输出结果不是你想象的那样,或者你以某种奇怪的方式运行它。

您的期望是正确的:静态初始化块应该只运行一次。

+0

实际上,我的意外输出的问题与另一个Child类(与上面的不同)存在于我的类路径中。我还没有很好地理解这个其他Child类如何干扰输出,但是肯定的是:移除这个其他的子类可以解决意外的输出。 – 2012-03-24 10:51:58