1

私のプログラム

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 "); // this is line# 1
}

House(String name) {
    this(); // This is line#2
    System.out.print("hn " + name);
}

public static void main(String[] args) {
    new House("x ");
}
}

super()コンパイラーが子クラスのコンストラクターの最初の行として呼び出しを書き込むことがわかっています。したがって、出力は次のようにすべきではありません。

b(コンパイラからの呼び出し、super() への呼び出し、行 #2 の前)

b(再度、コンパイラーが記述した super() への呼び出しから、行番号 1 の前)

h hn x

しかし、出力は

b h hn x

何故ですか?

4

5 に答える 5

5

thisコンストラクターが別のコンストラクター (または)の呼び出しで始まる場合super、コンパイラーはスーパークラスの既定のコンストラクターへの呼び出しを挿入しません。したがって、呼び出しツリーは次のようになります。

main
 \-> House(String)                (explicit call)
      |-> House()                 (explicit call)
      |    |-> Building()         (implicit call)
      |    |    |-> Object()      (implicit call)
      |    |    \-> print "b "
      |    \-> print "h "
      \-> print "hn x"
于 2012-12-19T16:58:45.890 に答える
3

JLS 8.8.7 による

コンストラクター本体が明示的なコンストラクター呼び出しで始まらず、 宣言されているコンストラクターが基本クラス Object の一部でない場合、コンストラクター本体はスーパークラス コンストラクター呼び出し "super();" で暗黙的に開始されます。

于 2012-12-19T17:01:31.223 に答える
1

コンストラクターが をHouse(string name)呼び出しHouse()、それが を呼び出しますBuilding()Building(string name)呼び出されることはありません。

を明示的に呼び出したい場合Building(string name)は、House(string name)コンストラクターで次のように追加できsuper(name);ます。this();

于 2012-12-19T17:00:46.737 に答える
1

コードのビジュアル コントロール フローは次のとおりです。

new House("x ")---> House(args)---> House() --->Building()--->Object()
                               ^^this()    ^implicit      ^implicit super() call 
                                             super()
                                             call

---> 呼び出しを表します

出力: b(from building no-args), h(from no-args House), hn x (from args House) bh hn x

私が知っていることから、スーパーへの暗黙的な呼び出しは this() の前にあるはずですよね? 私のコードの2行目

編集:

コンストラクターの最初の行は、super() を使用したスーパー クラス コンストラクターへの呼び出し、または this() を使用したオーバーロードされたコンストラクターへの呼び出しのいずれかです。this() を使用してオーバーロードされたコンストラクターへの呼び出しがある場合、super() への呼び出しはありません。

于 2012-12-19T17:01:54.260 に答える
0
House(x) -> House() + "hn" + "x"
            Building() + "h" + "hn" +"x"
            "b" + "h" + "hn" + "x"

スーパークラスへの呼び出しは 1 回だけ呼び出されます。

呼び出されたい場合Building(string name)は、明示的に呼び出す必要があります。

super()代わりに使いやすいと思いますthis()

于 2012-12-19T17:02:36.180 に答える