次のコードの出力結果を答えてください
abstract class Fish {
String name = "SAKANA";
abstract void setName(String na);
abstract String getName();
}
class SABA extends Fish{
String name = "";
void setName(String na) {
name = na;
}
String getName() {
return name;
}
}
public class TestFish {
public static void main(String[] args) {
Fish fish1 = new SABA();
SABA fish2 = new SABA();
fish1.setName("Tarako");
fish2.setName("Maguro");
System.out.println(fish1.name);
System.out.println(fish1.getName());
System.out.println(fish2.name);
System.out.println(fish2.getName());
}
}
答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
SAKANA
Tarako
Maguro
Maguro
fish1.setName("Tarako")により、サブクラスのsetNameメソッドが呼び出されサブクラスのnameフィールドが"Tarako"に設定されますが、fish1.getName()が呼び出される際には、Fish型の変数のためFishクラス(スーパークラス)のnameフィールドが参照されるため、"SAKANA"が出力されます。
fish2.setName("Maguro")により、サブクラスのsetNameメソッドが呼び出されサブクラスのnameフィールドfish2のnameフィールドが"Maguro"に設定されます。SABAクラスのgetName()メソッドはSABAクラスのnameフィールドを返すため、"Maguro"が出力されます。
サブクラスSABAのnameフィールドメンバがない場合
abstract class Fish {
String name = "SAKANA";
abstract void setName(String na);
abstract String getName();
}
class SABA extends Fish{
// フィールド name を削除
void setName(String na) {
name = na;
}
String getName() {
return name;
}
}
public class ExampleFive {
public static void main(String[] args) {
Fish fish1 = new SABA();
SABA fish2 = new SABA();
fish1.setName("Tarako");
fish2.setName("Maguro");
System.out.println(fish1.name);
System.out.println(fish1.getName());
System.out.println(fish2.name);
System.out.println(fish2.getName());
}
}
出力結果
Tarako
Tarako
Maguro
Maguro
fish1.setName()によりサブクラスのメソッドが呼び出されますが、
サブクラスのフィールドnameが無いため、スーパークラスのフィールドnameに"Tarako"が代入されます。