クラスの継承
継承すると親クラスのフィールドとメソッドが使える。
例1:子クラスにフィールド(name)の記述はないが、子クラスで使える。
// Oya.java public class Oya { public String name; } // Ko.java public class Ko extends Oya{ } // Test.java public class Test { public static void main(String[] args) { Ko k = new Ko(); System.out.println(k.name); // null } }
例2:子クラスにコンストラクタはないが裏ではある。
// Oya.java public class Oya { Oya(){ System.out.print("Oya"); } } // Ko.java public class Ko extends Oya{ } // Test.java public class Test { public static void main(String[] args) { Ko k = new Ko(); // Oyaと表示 } }
書いてないが Ko(){super();} がある。
例3:親に引数有りコンストラクタがなくても、子には引数有りコンストラクタを作れる。
// Oya.java public class Oya { public String name; } // Ko.java public class Ko extends Oya{ Ko(String name){ super.name = name; //もしくは this.name = name; } } // Test.java public class Test { public static void main(String[] args) { Ko k = new Ko("Mike"); System.out.println(k.name); //Mikeと表示 } }
例4:親に引数なしコンストラクタの記述がなく、引数ありコンストラクタがある場合、子には引数ありコンストラクタが必要。
// Oya.java public class Oya { String name; Oya(String name){ System.out.print("Oya"); } } // Ko.java public class Ko extends Oya{ }
上記はエラー。 子クラスに Ko(String name){ super(name); } の追記が必要。
例5:親と子に同じ名前のインスタンス変数がある場合は注意。
// Oya.java public class Oya { public String name; } // Ko.java public class Ko extends Oya{ public String name; Ko(){ super.name = "Oya Mike"; this.name = "Ko Cate"; } } // Test.java public class Test { public static void main(String[] args) { Oya o = new Ko(); System.out.println(o.name); // Oya Mike と表示 Ko k = new Ko(); System.out.println(k.name); // Ko Cate と表示 } }
- 親のフィールドに入れる場合は super. と記述。
- 子のフィールドに入れる場合は this. と記述。
- 親の型に入れた子の場合は親のフィールドに値が入る
- 子の型に入れた子の場合は子のフィールドに値が入る。