// 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
修飾子の主な特徴と使用法について解説します。
- 同じパッケージ内からのアクセス可能:
protected
修飾子をつけたメンバーは、同じパッケージ内のクラスからは通常のアクセス修飾子と同様にアクセスできます。
- サブクラスからのアクセス可能:
protected
修飾子をつけたメンバーは、クラスを継承したサブクラスからもアクセス可能です。これにより、継承関係にあるクラスで共有されるメンバーを指定できます。
- クラス外からのアクセスは制限:
protected
修飾子をつけたメンバーは、同じパッケージ内でないかつ継承関係にないクラスからはアクセスできません。クラス外からはアクセスできないため、一定の情報の隠蔽(カプセル化)が保たれます。
- フィールドやメソッドに適用可能:
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
メソッドを利用できます。