サーチ…


前書き

必須ではありませんが、Javaのコンストラクタは、オブジェクトの役割に不可欠なクラスの特定の値をインスタンス化するためにコンパイラによって認識されるメソッドです。このトピックでは、Javaクラス・コンストラクターの適切な使用法を示します。

備考

Java言語仕様では、コンストラクタのセマンティクスの正確な性質について、長らく言及しています。それらはJLS§8.8で見つけることができます

デフォルトコンストラクタ

コンストラクタの "デフォルト"は引数がないことです。あなたが任意のコンストラクタを指定しない場合、コンパイラはあなたのためのデフォルトコンストラクタを生成します。
これは、次の2つのスニペットが意味的に同等であることを意味します。

public class TestClass {
    private String test;
}
public class TestClass {
    private String test;
    public TestClass() {

    }
}

デフォルトコンストラクタの可視性は、クラスの可視性と同じです。したがって、クラス定義されたパッケージはプライベートにパッケージプライベートのデフォルトのコンストラクタを持っています

しかし、デフォルト以外のコンストラクタを使用している場合、コンパイラはデフォルトのコンストラクタを生成しません。したがって、これらは同等ではありません:

public class TestClass {
    private String test;
    public TestClass(String arg) {
    }
}
public class TestClass {
    private String test;
    public TestClass() {
    }
    public TestClass(String arg) {
    }
}

生成されたコンストラクタは非標準初期化を実行しないことに注意してください。つまり、初期化子がない限り、クラスのすべてのフィールドにデフォルト値が設定されます。

public class TestClass {

    private String testData;

    public TestClass() {
        testData = "Test"
    }
}

コンストラクターは次のように呼び出されます。

TestClass testClass = new TestClass();

引数を持つコンストラクタ

コンストラクターは任意の種類の引き数で作成できます。

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }
}

このように呼び出された:

TestClass testClass = new TestClass("Test Data");

クラスは、異なるシグネチャを持つ複数のコンストラクタを持つことができます。コンストラクタ呼び出し(インスタンス化時に同じクラスの別のコンストラクタを呼び出す)を連鎖させるには、 this()使用します。

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }

    public TestClass() {
        this("Test"); // testData defaults to "Test"
    }
}

このように呼び出された:

TestClass testClass1 = new TestClass("Test Data");
TestClass testClass2 = new TestClass();

親コンストラクタを呼び出す

ParentクラスとChildクラスがあるとします。 Childインスタンスを構築するには、常に、Childコンストラクタの非常にgebinningで実行されるいくつかのParentコンストラクタが必要です。最初の子コンストラクタ文として適切な引数を指定してsuper(...)を明示的に呼び出して、必要なParentコンストラクタを選択できます。これにより、Childクラスのコンストラクタで同じコードを書き換えるのではなく、Parentクラスのコンストラクタを再利用して時間を節約できます。

super(...) メソッド なし

(暗黙のうちに、引数なしのバージョンsuper()は目に見えないものと呼ばれます)

class Parent {
    private String name;
    private int age;
    
    public Parent() {} // necessary because we call super() without arguments
    
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
    public Child() {
        // compiler implicitly calls super() here
        name = "John";
        age = 42;
    }
}

super() メソッド:

class Parent {
    private String name;
    private int age;
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

class Child extends Parent {
    public Child() {
        super("John", 42);   // explicit super-call
    }
}

注意:別のコンストラクタ(連鎖)またはスーパーコンストラクタへの呼び出しは、コンストラクタ内の最初の文でなければなりません(MUST )。

super(...)コンストラクターを明示的に呼び出すと、一致する親コンストラクターが存在する必要があります(これは単純ですが、そうではありません)。

super(...)コンストラクタを明示的に呼び出さない場合、親クラスには引数なしのコンストラクタが必要です。親クラスが提供しない場合はコンパイラによって明示的に作成されるか、デフォルトとして作成されます任意のコンストラクタ。

class Parent{
    public Parent(String tName, int tAge) {}
}

class Child extends Parent{
    public Child(){}
}

クラスParentにはデフォルトのコンストラクタがないため、コンパイラは子コンストラクタにsuperを追加できません。このコードはコンパイルされません。あなたは両方の側面に合うようにコンストラクタを変更しなければなりません、あるいはあなた自身のsuperコールを以下のように書く必要があります:

class Child extends Parent{
    public Child(){
          super("",0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow