0

BruceEckelのThinkingInJava 4th Editionの128ページ、2番目の段落、最後の文に質問があります。

初期化されないオーバーロードされたコンストラクターが定義され、その定義w3に「デフォルト」の初期化がなかった場合はどうなりw3ますか?

この声明は理解しにくいと思いましたが、この本の専門家や読者は私を少し助けてくれますか?ありがとう!

4

4 に答える 4

1

Window w3 = new Window(3);

w3オーバーロードされたコンストラクターで誰かが適切に初期化されない場合、それはただガードしています。このようなフィールドのインスタンス化は、各コンストラクターの先頭に自動的に配置されます。したがって、オーバーロードされたものでも初期化を受け取りw3ます。

Window w3のみを宣言すると、オーバーロードされたコンストラクターが実行されたときにw3残ります。null

この本のコードは次のとおりです。

import static net.mindview.util.Print.*;
    // When the constructor is called to create a
    // Window object, you’ll see a message:
    class Window {
        Window(int marker) 
        { 
            print("Window(" + marker + ")"); 
        } 
    }

   class House { 
       Window w1 = new Window(1); 
       // Before constructor 
       House() {
           // Show that we’re in the constructor:
           print("House()");
           w3 = new Window(33); // Reinitialize w3
       }
        Window w2 = new Window(2); 
        // After constructor void f() { print("f()"); } 
        Window w3 = new Window(3); 
    // At end 
   }
于 2012-10-06T12:20:35.843 に答える
0

Javaのすべてのフィールドタイプには、定義済みのデフォルト値があります。これは、問題のタイプに適用できる場合、それぞれnull、0、またはfalseです。一方、フィールドがの場合、finalデフォルト値はなく、構築時にデフォルト値を提供しないのはコンパイラエラーです。

于 2012-10-06T12:20:38.150 に答える
0

- w3そのフィールドの場合(つまりInstance variable

-オブジェクト参照変数のデフォルト値がnullであるnullため、デフォルトではに初期化されます。

-オーバーロードされたコンストラクターが初期化しない場合、その値はになりますnull

于 2012-10-06T12:21:39.527 に答える
0

私はその本を持っていないし、読んだこともない。したがって、これは単なる推測です。

w3クラスのメンバー変数です

class A {
  public int w3; // w3 has no default initialization

  public B() {
    w3 = 1; // w3 is initialized here
  }

  public B(boolean x) {
    // w3 is not initialized here
  }  
}

あなたはこのようなことをすることができます:

A firstObject = new A();
System.out.println("firstObject.w3 is " + firstObject.w3);
A secondObject = new A(false);
System.out.println("secondObject.w3 is " + secondObject.w3);

出力は次のようになります

firstObject.w3 is 1
secondObject.w3 is 0

説明:に設定さfirstObjectれた最初のコンストラクターで作成されました。パラメータを必要とするオーバーロードされたコンストラクタで作成されました。このコンストラクターはw3を設定しません。また、のデフォルトの初期化もありません。したがって、設定されることはありません。Javaでは、デフォルトの初期化なしで変数に対して次の値を取得します。w31secondObjectbooleanw3

  • int/short/byte0
  • long0L
  • double0.0d
  • float0.0f
  • char\u0000
  • booleanfalse
  • Object(およびすべての派生クラス):null
  • finalフィールド:デフォルト値がなく、デフォルトの初期化がない場合はコンパイラエラーがスローされます
于 2012-10-06T12:24:51.967 に答える