使用构造函数创建新对象

时间:2013-06-05 12:59:13

标签: java constructor scjp

以下代码在编译和运行时将输出显示为“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 个答案:

答案 0 :(得分:1)

这是因为在创建对象时,会调用parent的构造函数,并且它会上升到Object类。你的Alpha内部扩展了Object类。所以首先调用SubSubAlpha构造函数,它调用Alpha构造函数,后者又调用Object构造函数,执行流从Object到Alpha,最后是SubSubAlpha

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

<强>参考
Order of Constructor Call

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

让我稍微重写你的构造函数,而不会改变生成的字节码

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

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

答案 3 :(得分:1)

当存在类的层次结构时,子类的构造函数(在本例中为SubSubAlpha)始终调用(第一个)超类的构造函数,在本例中为Alpha

实际上会发生什么:

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

因此,这使得:

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

使字符串“alpha subsub”