試験に向けて課題だったところの備忘録と知識の整理を兼ねて
特に沼だったところ
- ポリモーフィズム
- コンストラクタ
ポリモーフィズム
コードの例
class Animal {
void eat() { System.out.println("食べる"); }
}
class Cat extends Animal {
@Override
void eat() { System.out.println("魚を食べる"); }
void meow() { System.out.println("ニャー"); }
}
public class Test {
public static void main(String[] args) {
Animal a = new Cat();
a.eat(); // 何が出力される?
// a.meow(); // これはエラー? OK?
}
}
上のようなコードがあるとき、
- 今まではCatでnewしていたのでCatがもつメソッドは使えると思っていた。 →実際はAnimal型で宣言しているため、Animal型で定義したメソッドしか使えない(実行内容はCat)
得たこと
変数型はメガネのようなもの(newしたオブジェクトにかかわらず使えるメソッドは型次第)
コンストラクタ
こちらもコードの例
// 記事用のサンプルコード
class Animal {
String name;
Animal(String name) {
this.name = name;
System.out.println("1. Animalコンストラクタ: " + name);
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name);
this.breed = breed;
System.out.println("2. Dogコンストラクタ: " + breed);
}
}
class Poodle extends Dog {
String color;
Poodle(String name, String breed, String color) {
super(name, breed);
this.color = color;
System.out.println("3. Poodleコンストラクタ: " + color);
}
}
public class Test {
public static void main(String[] args) {
Poodle p = new Poodle("ポチ", "プードル", "白");
// Q: 出力順序は?
}
}
上のようなコードで
- poodle → dog → animalと呼ばれると思っていた。
super()がコンストラクタの最初でされる(暗黙的、あるいは明示的)ためスーパークラスから実行される。- また、
super()はsuper(name)のように引数付きで既にある場合は自動で実行されないので定義する必要がある。