1

次のコードがあるとします

class C {
    int i;
    String s;

    C(){
        System.out.println("In main constructor");
        // Other processing
    }

    C(int i){
        this(i,"Blank");
        System.out.println("In parameterized constructor 1");
    }

    C(int i, String s){
        System.out.println("In parameterized constructor 2");
        this.i = i;
        this.s = s;
        // Other processing 
        // Should this be a copy-paste from the main contructor? 
        // or is there any way to call it? 
    }
    public void show(){
        System.out.println("Show Method : " + i + ", "+ s);
    }
}

知りたいのですが、パラメーター化されたコンストラクター(つまりC(int i, String s)この場合)からmain(デフォルト)コンストラクターを呼び出す方法はありますか?

または、上記のコードのコメントに示されているように、メイン(デフォルト)コンストラクターからパラメーター化されたコンストラクターにコンテンツ全体をコピーして貼り付けただけですか?

ノート

処理にはこれらの変数が含まれるため、変数の後にデフォルトコンストラクターを呼び出す必要がありi、パラメーター化されたコンストラクターで設定されます。s

編集

この投稿を見ると、最初の行として配置this()するとデフォルトのコンストラクターが呼び出されると書かれています。しかし、値を設定した後で呼び出す必要があります。

4

9 に答える 9

4

呼び出しthis()は機能しますが、これはコンストラクターの最初のステートメントでなければならないことに注意してください。例: 以下のコードは違法であり、コンパイルされません:

class Test {
    void Test() { }
    void Test(int i) {
        i = 9;
        this();
    }
}
于 2013-01-03T08:00:35.437 に答える
2

オプションとして、デフォルトのコンストラクターからパラメーター化されたコンストラクターを呼び出すこともできます。

C(){
    this(0, "Blank");
}

C(int i){
    this(i,"Blank");
}

C(int i, String s){
    this.i = i;
    this.s = s;
}

このパターンを使用すると、より具体的なコンストラクターへの引数が少ないコンストラクターのデフォルトを指定できます。

また、コンストラクターの連鎖は、別のコンストラクターの最初の呼び出しとして実行する必要があることに注意してください。変数を初期化した後、別のコンストラクターを呼び出すことはできません。

C(int i, String s){
    this.i = i;
    this.s = s;
    this();     // invalid!
}

本当にこのようなことをしたい場合は、initメソッドを検討してください。

C() {
    init();
}
C(int i, String s) {
    this.i = i;
    this.s = s;
    init();
}
于 2013-01-03T08:05:36.727 に答える
1

すべてのコードをメイン コンストラクターから何らかのメソッド、たとえば mainProcessing() に移動できます。

C()
{
    System.out.println("In main constructor");
    mainProcessing();
}

private void mainProcessing()
{
    // Move your code from main constructor to here.
}

これで、パラメーター化されたコンストラクター 2 で、このメソッド mainProcessing() を目的の場所で呼び出すことができます。

C(int i, String s)
{
    System.out.println("In parameterized constructor 2");
    this.i = i;
    this.s = s;
    mainProcessing();
}
于 2013-01-03T08:46:16.467 に答える
1

他のコンストラクターの最初のステートメントthis()として呼び出すだけで十分です。

C(int i, String s)
{
   this();
   // other stuff.
}
于 2013-01-03T07:58:45.463 に答える
1

ドキュメントの引用:

別のコンストラクターの呼び出しは、コンストラクターの最初の行である必要があります。

いいえ、それは不可能です。this() を最初の行で使用します。

于 2013-01-03T08:00:09.503 に答える
0

コンストラクタ ny this(); を呼び出すだけです。デフォルトのコンストラクターの最初の行としてのステートメント....

于 2013-01-03T07:57:42.447 に答える
0

this();デフォルトのコンストラクターを呼び出すために使用できます

C(int i, String s){
   this(); // call to default constructor
   // .....       
}
于 2013-01-03T07:59:08.460 に答える
0

パラメーター化されたコンストラクターの 最初の行でthis() を使用します

C(int i, String s){
    this();
    System.out.println("In parameterized constructor 2");
    this.i = i;
    this.s = s;
    // Other processing
    // Should this be a copy-paste from the main contructor?
    // or is there any way to call it?
}
于 2013-01-03T07:59:53.077 に答える
0

this()最初のステートメントで呼び出して、任意のパラメーター化されたコンストラクターで既定のコンストラクターを呼び出すことができます。

Notethis()はコンストラクター定義の最初の行にする必要があります

C(int i, String s){
   this();
    . . . . 
}

ただし、値の設定後に呼び出す必要があります。

それは不可能。コンストラクターの呼び出しは、最初のステートメントでなければなりません。

このリンクをたどることができます:コンストラクターの呼び出しは最初の行でなければなりません

于 2013-01-03T08:00:51.157 に答える