011 コンストラクタ(別のコンストラクタを呼び出す) 007 解答例

public class Person {
    private String name;
    private int age;

    // デフォルトコンストラクタ
    public Person() {
        // 別のコンストラクタを呼び出す
        this("Unknown", 18);
    }

    // 引数つきコンストラクタ
    public Person(String name, int age) {
        // コンストラクタ本体の実装
        this.name = name;
        this.age = age;
    }

    // 他のコンストラクタを呼び出すメソッド
    public void setDetails(String name, int age) {
        // 別のコンストラクタを呼び出す
        this.name = name;
        this.age = age;
    }

    // ゲッターメソッド(省略)
}

この解答例では、デフォルトコンストラクタが引数つきコンストラクタを呼び出しています。また、新しく setDetails メソッドを追加し、このメソッドを通じても別のコンストラクタを呼び出すことができます。 setDetails メソッド内で別のコンストラクタを呼び出すことで、同じ初期化処理を利用できるようになります。

this

this は、Java言語などの多くのオブジェクト指向プログラミング言語で使用される特殊なキーワードで、クラス内のメソッドやコンストラクタ内で、そのメソッドやコンストラクタが属しているインスタンス(オブジェクト)自体を指す参照です。以下に this の主な用途を解説します。

1.現在のオブジェクトの参照:
this は、そのメソッドやコンストラクタを呼び出しているインスタンスを指します。メソッド内で使用することで、クラス内のインスタンス変数やメソッドにアクセスできます。

public class MyClass {
    private int value;

    public void setValue(int value) {
        // メソッドの引数とクラスのインスタンス変数の名前が同じ場合、thisを使用して区別
        this.value = value;
    }
}

2.コンストラクタ内で別のコンストラクタを呼び出す:
コンストラクタ内で同じクラス内の別のコンストラクタを呼び出す場合、this キーワードを使用します。これにより、コンストラクタチェーンを構築できます。

public class MyClass {
    private int value;

    public MyClass() {
        // 別のコンストラクタを呼び出す
        this(0);
    }

    public MyClass(int value) {
        this.value = value;
    }
}

3.メソッドの中で自分自身のインスタンスを返す:
メソッド内で自分自身のインスタンスを返す場合、return this; のように使用できます。これを利用すると、メソッドチェーンを構築することができます。

public class MyClass {
    private int value;

    public MyClass setValue(int value) {
        this.value = value;
        return this;
    }
}

上記の例では、setValue メソッドが自分自身のインスタンスを返しています。

4.インナークラスの場合:
インナークラス(内部クラス)のメソッド内で外側のクラスのインスタンスを参照する際にも this を使用します。外側のクラスの this と区別するために、外側クラス.this のように指定します。

public class OuterClass {
    private int value;

    public class InnerClass {
        public void setValue(int value) {
            // InnerClass内でOuterClassのインスタンスを参照する
            OuterClass.this.value = value;
        }
    }
}

これらの使い方により、this キーワードはクラス内でのメンバ変数やメソッドへのアクセス、コンストラクタチェーンの構築、メソッドチェーンの実現など、クラス内でのコードの明確性や柔軟性を向上させるのに役立ちます。

コンストラクタでプロパティを初期化するときにthisがなぜいるの?

コンストラクタに引数を渡してプロパティを初期化する際に this キーワードを使用する主な理由は、同じ名前のインスタンス変数(メンバ変数)とコンストラクタの引数名が衝突することを回避するためです。以下に、この理由を詳しく説明します。

1.名前の衝突を回避する:
コンストラクタの引数とクラス内のインスタンス変数が同じ名前の場合、通常の代入文だけではどちらがどちらを指しているのかが明確ではありません。このとき、this キーワードを使って、その値がインスタンス変数であることを明示的に示します。

public class MyClass {
    private int value;

    public MyClass(int value) {
        // 名前の衝突を回避するためにthisを使用
        this.value = value;
    }
}

上記の例では、value という名前がコンストラクタの引数とクラスのフィールドに共通しています。this を使って、value がインスタンス変数であることを示しています。

2.クラス内の他のメソッドとの明確な区別:
this キーワードを使用することで、コンストラクタ内でクラス内の他のメソッドやフィールドとの明確な区別が付きます。これにより、メンバ変数と引数の違いがはっきりし、コードの可読性が向上します。

public class MyClass {
    private int value;

    public MyClass(int value) {
        // インスタンス変数に引数の値を代入
        this.value = value;
        // 他のメソッドを呼び出すなどの操作も可能
        doSomething();
    }

    public void doSomething() {
        // クラス内の他のメソッド
        // ...
    }
}

上記の例では、doSomething メソッドがコンストラクタ内で呼び出されています。this キーワードを使用することで、value がインスタンス変数であることが明示され、同じ名前の引数と区別されます。

このように、this キーワードを使用することで、コンストラクタ内での変数の参照が明確になり、コードの可読性が向上します。

「011 コンストラクタ」問題集リスト