【问题标题】:Initialization block with extends带有扩展的初始化块
【发布时间】:2012-03-24 10:21:55
【问题描述】:

这是我的代码 sn-p,我对初始化块充满信心

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 Child 运行它

这是我的输出:

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...

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

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

感谢任何帮助 谢谢 阿尔贝托

【问题讨论】:

  • 我试过了,static init block of Child 只打印了一次(使用 OpenJDK 运行时环境 (IcedTea6 1.9.13) (6b20-1.9.13-0ubuntu1~10.10.1))。您确定您收到了两次使用此代码的消息吗?

标签: java initialization


【解决方案1】:

无法重现 - 这是我从命令行运行您的代码得到的输出:

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...

你没有说你是如何运行代码的,但我怀疑要么输出不是你想象的那样,或者你以某种奇怪的方式运行它.

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

【讨论】:

  • 实际上,我的意外输出问题与我的类路径中存在另一个子类(与上述不同)有关。我还不太了解这个其他子类如何干扰输出,但可以肯定的是:删除这个其他子类可以解决意外输出。
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多