2
class Building{
    Building(){
        System.out.print("b ");
    }
    Building(String name){
        this();
        System.out.print("bn "+name);
    }
}
public class House extends Building{
    House(){
        System.out.print("h ");
    }
    House(String name){
        this();
        System.out.print("hn "+name);
    }
    public static void main(String[] args){
        new House("x ");
    }
}

出力はb bn h hn xでなければならないと思いました。しかし、出力はbh hn xです。

よくわかりません。この出力がどのように来るか。助けて

4

2 に答える 2

3

super()おそらく、Java がコンストラクターに挿入する暗黙の呼び出しについて考えているでしょう。ただし、Java がこれを行うのは、必要な場合 (つまり、別のコンストラクターを自分で呼び出さない場合) だけであることを覚えておいてください。this()引数が 1 つのコンストラクターを呼び出すと、House既に別のコンストラクターを延期しているため、Java はsuper()そこへの呼び出しを挿入しません。

対照的に、引数なしのコンストラクターでは、またはHouse()の呼び出しで開始しません。そのため、Javaはあなたのために挿入します。this(...)super(...)super()

結論として、Java は決して を呼び出しませんBuilding(String)。オブジェクトの初期化中に呼び出されるスーパークラス コンストラクターは 1 つだけで、それは引数のないコンストラクターです。

于 2010-07-13T03:59:15.203 に答える
0

コンストラクター呼び出しチェーンの順序は次のとおりです。 1. House(文字列名) 2. House() 3. Building()

出力 bh hn の生成

その後に printf ステートメントが続きます。x 最終出力 **bh hn x **

それの訳は; 1. House(String name) でコンストラクタ this() への明示的な呼び出しがあります。これにより、Java が挿入する super() への暗黙の呼び出しが回避されます。2. コンストラクター House() に明示的なコンストラクター呼び出しがないため、Java はそのスーパー クラス コンストラクター Building() への暗黙的な呼び出しを挿入します。これにより、House() の printf ステートメント **h ** の前に **b ** が出力されます。

于 2010-07-13T06:01:59.767 に答える