継承
- クラスが持っているメンバ(フィールドやメソッド)を別のクラスに引き継がせる。
- 継承元のクラスをスーパークラス(または親クラス)、引き継いだクラスをサブクラス(または子クラス)
(継承を使用しない例と使用する例のコードも記載されていてわかりやすかった参照元URL)
// 継承の書き方
子クラス extend 親クラス
実例
作成クラス3つ。
- Keisyo_Human1.java:人を表す親クラス
- Keisyo_Takada1.java:親クラスを継承する子クラス
- Keisyo_Main1.java:実行クラス
Keisyo_Human1.java
public class Keisyo_Human1 {
// フィールドの宣言
double weight; // 体重
double height; // 身長
// BMI計算メソッド 修飾子なし=同じパッケージ内であればアクセス可能
double Bmi( double weight, double height) {
return this.weight / (this.height * this.height);
}
}
Keisyo_Takada1.java
// 継承
public class Keisyo_Takada1 extends Keisyo_Human1 {
}
Keisyo_Main1
public class Keisyo_Main1 {
public static void main(String[] args) {
// Keisyo_Takada1クラスのオブジェクト生成
Keisyo_Takada1 takada = new Keisyo_Takada1();
// 体重を設定
takada.weight = 100.0;
// 身長を設定
takada.height = 1.9;
//BMIのメソッド呼び出し
double bmi = takada.Bmi(takada.weight, takada.height);
System.out.println("BMIは" + bmi);
}
}
検証1
継承なしの場合
//コンストラクタが必要になる
package text.section_17;
public class Keisyo_Human1 {
// フィールドの宣言
double weight; // 体重
double height; // 身長
// コンストラクタ
public Keisyo_Human1(double weight, double height) {
this.weight = weight;
this.height = height;
}
// BMI計算メソッド 修飾子なし=
double Bmi( ) {
return this.weight / (this.height * this.height);
}
}
Kida
というオブジェクトを生成
package text.section_17;
public class Keisho_Kida {
public static void main(String[] args) {
//オブジェクトの生成
Keisyo_Human1 Kida = new Keisyo_Human1(70, 1.75);
// // 体重と身長を設定
// Kida.weight = 70.0; // 体重(kg)
// Kida.height = 1.75; // 身長(m)
// BMIを計算して表示
double bmi = Kida.Bmi();
System.out.println("BMI: " + bmi);//メソッドの呼び出し
}
}
検証2
継承だけを設定しているクラスKeisyo_Takada1.java
がなく、
クラスの設定をしているKeisyo_Human1.java
に変更を加えない。そして、
同じクラス内に、継承とオブジェクトの生成・メソッドの実行を記述した場合。
→問題なく同じ実行結果が得られる。
実行結果
継承の使いどころとは?
例えば、女性or男性などの条件分岐を使う表示が必要な場合は、条件分岐ではなく継承でも良いのか?
大規模な開発の場合は継承は使われることも多いが、個人での開発レベルだと素直に条件分岐で書いた方がわかりやすいとベテランのある方に教えていただきました。
参考にした記事
メソッドのオーバーライドとスーパー
オーバーライド
- 子クラスで親クラスのメソッドを上書きすることができる
- ただし、上書きできるのは引数名と処理だけ
- メソッド名、戻り値の型、引数の数、引数の型は親クラスのメソッドと同じにする必要がある
スーパー
- 親クラスのコンストラクタを呼び出すことができる
- 自身のフィード変数を呼び出すのは
this
に対して、継承元の値を呼び出すのがsuper
逆に、this("Kato");
にすると70.0が表示される。
多態性(ポリモーフィズム)
abstract
の親を2つのクラスが継承し、
それぞれoutputメソッドで引数をKato
、もう一方はTanaka
と設定をする。
その後、別クラスでそれぞれが親クラスからオブジェクトを生成。
そしてメソッドを呼び出した結果、オブジェクトごとに別の結果を表示させることができる。