0

以下代码在编译和运行时将输出作为“alpha subsub”。 SubSubAlpha();构造函数应该将“subsub”添加到变量s中,这应该是输出。

为什么输出是“ alpha subsub”?

class Alpha {
    static String s = " ";

    protected Alpha() {
       s += "alpha "; 
    }
}

public class SubSubAlpha extends Alpha {
    private SubSubAlpha() { 
       s += "subsub "; 
    }

    public static void main(String[] args) {
        new SubSubAlpha();
        System.out.println(s);
        // This prints as " alpha subsub".
        //Shouldn't this one be printed as " subsub"
        //Who made the call to Alpha(); ?
    }
}
4

4 回答 4

1

这是因为当您创建对象时,会调用 parent 的构造函数并将其上升到 Object 类。您的 Alpha 在内部扩展了 Object 类。因此,首先调用 SubSubAlpha 构造函数,该构造函数调用 Alpha 构造函数,后者又调用 Object 构造函数,执行从 Object 流经 Alpha,最后是 SubSubAlpha

对于信息
构造函数调用层次结构是调用父构造函数,然后调用子构造函数。但是如果你调用一个方法,它会在子类中被搜索。如果在子类中未找到,则在父类中搜索该方法。

构造函数调用的引用
顺序

于 2013-06-05T13:02:30.010 回答
1

当调用子类的构造器时,第一条指令是对超类构造器的调用。

因此,当您创建SubSubAlpha对象时,Alpha构造函数将 alpha 添加到s属性,然后SubSubAlpha构造函数添加 subsub

于 2013-06-05T13:02:31.753 回答
1

让我稍微重写你的构造函数,生成的字节码没有变化

private SubSubAlpha() { super(); s += "subsub "; }

现在应该立即清楚什么被执行以及以什么顺序执行。

于 2013-06-05T13:02:58.323 回答
1

当存在类的层次结构时,子类的构造函数,在这种情况下SubSubAlpha,总是(首先)调用超类的构造函数,在这种情况下Alpha

所以实际上发生的是:

private SubSubAlpha() { 
    super();
    s += "subsub ";
}

因此,这使得:

s += "alpha ";
s += "subsub ";

制作字符串“alpha subsub”

于 2013-06-05T13:04:26.370 回答