014 継承(protected修飾子) 016 解答例

// Animal クラスの定義
class Animal {
    // protected 修飾子を持つ name インスタンス変数
    protected String name;

    // コンストラクタ:name を設定する
    public Animal(String name) {
        this.name = name;
    }

    // name を取得するメソッド
    protected String getName() {
        return name;
    }
}

// Dog クラス:Animal クラスを拡張
class Dog extends Animal {
    // Dog クラスのコンストラクタ
    public Dog(String name) {
        // 親クラスのコンストラクタを呼び出し
        super(name);
    }

    // Dog の名前を設定するメソッド
    public void setDogName(String name) {
        // name を設定
        this.name = name;
    }
}

// Cat クラス:Animal クラスを拡張
class Cat extends Animal {
    // Cat クラスのコンストラクタ
    public Cat(String name) {
        // 親クラスのコンストラクタを呼び出し
        super(name);
    }

    // Cat の名前を設定するメソッド
    public void setCatName(String name) {
        // name を設定
        this.name = name;
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // Dog インスタンスの生成
        Dog myDog = new Dog("バディ");

        // メッセージの表示と Dog の元の名前を取得
        System.out.println("犬の元の名前: " + myDog.getName());

        // 犬の名前を変更
        myDog.setDogName("マックス");

        // メッセージの表示と犬の更新後の名前を取得
        System.out.println("犬の更新後の名前: " + myDog.getName());

        // Cat インスタンスの生成
        Cat myCat = new Cat("ウィスカーズ");

        // メッセージの表示と Cat の元の名前を取得
        System.out.println("猫の元の名前: " + myCat.getName());

        // 猫の名前を変更
        myCat.setCatName("ミトンズ");

        // メッセージの表示と猫の更新後の名前を取得
        System.out.println("猫の更新後の名前: " + myCat.getName());
    }
}

Animalクラスは、動物を表す基本的なクラスです。protected修飾子を持つnameというインスタンス変数を持ち、コンストラクタとgetNameメソッドが定義されています。

DogクラスはAnimalクラスを拡張しています。Dogクラス自体は、動物の一種である犬を表します。setDogNameメソッドによって、犬の名前を設定できます。このクラスでは、親クラスのコンストラクタをsuper(name)として呼び出しています。

CatクラスもAnimalクラスを拡張しています。Catクラスは、動物の一種である猫を表します。setCatNameメソッドによって、猫の名前を設定できます。同様に、親クラスのコンストラクタを呼び出しています。

Mainクラスは、実際の使用例を示しています。DogおよびCatのインスタンスを生成し、それぞれの名前を表示します。setNameメソッドを通じて、名前を変更し、再び表示しています。

protected修飾子

protected修飾子は、Javaにおけるアクセス修飾子の一つであり、クラスメンバー(フィールドやメソッド)を同じパッケージ内のクラスや、そのクラスを継承したサブクラスからアクセス可能にします。以下に、protected修飾子の主な特徴と使用法について解説します。

  1. 同じパッケージ内からのアクセス可能:
    • protected修飾子をつけたメンバーは、同じパッケージ内のクラスからは通常のアクセス修飾子と同様にアクセスできます。
  2. サブクラスからのアクセス可能:
    • protected修飾子をつけたメンバーは、クラスを継承したサブクラスからもアクセス可能です。これにより、継承関係にあるクラスで共有されるメンバーを指定できます。
  3. クラス外からのアクセスは制限:
    • protected修飾子をつけたメンバーは、同じパッケージ内でないかつ継承関係にないクラスからはアクセスできません。クラス外からはアクセスできないため、一定の情報の隠蔽(カプセル化)が保たれます。
  4. フィールドやメソッドに適用可能:
    • protected修飾子はフィールドやメソッドに適用できます。例えば、親クラスのフィールドを子クラスで利用する場合や、親クラスのメソッドをオーバーライドする場合に使用されます。

以下は、protected修飾子を使用した例の一部です:

// 親クラス
class Animal {
    // protected 修飾子を持つフィールド
    protected String name;

    // protected 修飾子を持つコンストラクタ
    protected Animal(String name) {
        this.name = name;
    }

    // protected 修飾子を持つメソッド
    protected void eat() {
        System.out.println(name + " is eating.");
    }
}

// 子クラス
class Dog extends Animal {
    // 子クラスのコンストラクタ
    public Dog(String name) {
        // 親クラスのコンストラクタを呼び出し
        super(name);
    }

    // 親クラスのメソッドをオーバーライド
    @Override
    protected void eat() {
        System.out.println(name + " the dog is eating.");
    }
}

この例では、Animalクラスのnameフィールドとeatメソッドがprotected修飾子を持っています。これにより、DogクラスがAnimalクラスを継承し、nameフィールドとeatメソッドを利用できます。

「014 継承」問題集リスト