LoginSignup
0
0

Java silver向け 例題 継承 ポリモーフィズム 2

Posted at

次のコードの出力結果を答えてください

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"が代入されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0