繁体   English   中英

用构造函数创建新对象

[英]Creating new object with constructor

以下代码在编译和运行时给出的输出为“ 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(); ?
    }
}

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

有关信息
构造函数调用层次结构是先调用parent的构造函数,然后再调用child的构造函数。 但是,如果您调用方法,则会在子类中对其进行搜索。 如果在子类中未找到,则在父类中搜索该方法。

参考
构造函数调用的顺序

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

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

让我稍微重写一下您的构造函数, 结果字节码没有变化

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

现在应该立即清除执行的内容和执行顺序。

如果存在类的层次结构,则子类的构造函数(在这种情况下为SubSubAlpha )始终(首先)调用超类的构造函数(在本例中为Alpha

所以实际上是:

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

因此,这使得:

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

使字符串“ alpha subsub”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM