継承の基本
「継承」という概念はなぜ生まれたのか?
たくさんクラスを作るうちに「以前作ったクラスによく似ているが、一部だけ違うクラス」というのが出てくる
→一部しか違わないのに同じようなコードを何度も書くのは面倒...
ex.前記述したクラスと比べて、フィールドは2つ多いが他は全て一緒
メソッドが1つ多いが他は全て一緒
コピペだと追加時間もかかるし、元のコード部分を修正すると他のコピペした部分も全て手作業で修正しないといけない
また、コピペをしていると、コードも長くなり、把握や管理が難しくなる
そのような面倒さを解消するために生まれたのが「継承」
〈構文〉
class クラス名 extends 基準となるクラス名{
基準となるクラスから新たに追加したいメンバ
}
ex. public class SuperHero extends Hero{
//Heroクラスを基準に新たにSuperHeroクラスを作成する
private boolean flying; ; //新たに追加したいフィールド
public void fly( ){
this.flying=true;
System.out.println("飛んだ!");
} //追加したいメソッドとその内容
}
この構文を使うと、基準となるクラスのコードは、記述しなくても自動追加される
基準となるクラスから自動的にコードが引き継がれているように見えるので、
「継承」と名付けた
※ 基準となるクラスのメソッドやフィールドが変更された場合は、継承されるクラスも自動で変更される
〈継承関係を図で表す〉
☆ SuperHeroクラスはHeroクラスの継承関係にあるとき
( Heroクラスを元にして、SuperHeroクラスを作成)
Hero(親クラス)
↑
Super Hero(子クラス)
※ 図で表す時は矢印の向きが逆になるので注意
☆ 1つのクラスを元にして複数のクラスも作成可
Hero(親クラス)
↑ ↑
SuperHero HyperHero (子クラス)
☆ 継承したクラスを元にして、さらに+αを加えて、
さらに継承することも可
Hero(親クラス)
↑
SuperHero (子クラス)
↑
UrtraHero(孫クラス)
★ ただし、親クラスを複数にして、子クラスを作る事は不可
これを「多重継承」と呼ぶ
Hero Enemy(親クラス)
↓ ↓
HumanTypeMonster(子クラス)