クラスの継承
クラスの継承とは
クラスを継承して新しいクラスを作ってみましょう。
extends
目次
1. クラスの継承とは
継承という言葉は
これまでもチラホラ
出てきてますよね。
そうだな。
ここら辺で少し
まとめておこう。
クラスの継承とは、
親になるクラスのメンバを引き継いで新しいクラスを作る事です。
「似ているけれど、ちょっとだけ違うクラス」を作りたい場面で、
変更や追加する部分だけを記述します。
クラスの継承は、オブジェクト指向のプログラム言語の特徴の一つです。
2. スーパークラスとサブクラス
ここでは言葉だけ
覚えてくれ。
重要
スーパークラス
継承関係にあるクラスの継承元のクラス(親クラス)のことを「スーパークラス」といいます。
重要
サブクラス
継承先のクラス(子クラス)のことは「サブクラス」といいます。
3. 継承の書式
クラスを継承する場合は、クラス名の後ろに「extends スーパークラス名」と記述します。
継承の書式
class サブクラス名 extends スーパークラス名 {
//メソッドの追加や上書きなど
}
こんなところに
書いちゃうんすね。
「継承されたクラスを宣言する」
って感じで覚えるといい。
4. スーパークラスを作る
説明はさておき、
実際に試してみよう。
スーパークラスを用意します。
スーパークラスは特別なクラスでなくて構いません。
ここでは、↓ Animal_01クラスをスーパークラスにして説明します。
クラス変数 (group)
インスタンス変数 (name)
クラスメソッド (printGroup)
インスタンスメソッド (printName)
コンストラクタは2種類用意した。
//Animal_01.java
public class Animal_01{
protected static String group = "生き物です。";
protected String name;
public Animal_01(){
this("無名");
}
public Animal_01(String name){
this.name = name;
}
public static void printGroup(){
System.out.println(group);
}
public void printName(){
System.out.println(name + "だぞ! ガオー!");
}
}
一応動作確認を
しておくか。
Animal_01クラスを
インスタンス化して、
printNameメソッドの実行っすね。
//Driver_00.java
public class Driver_00{
public static void main(String[] args){
Animal_01[] animalArray = new Animal_01[3];
animalArray[0] = new Animal_01("ゴン太くん");
animalArray[1] = new Animal_01("ふなっしー");
animalArray[2] = new Animal_01();
//すべての要素で printNameメソッドを実行
for(int i=0; i<animalArray.length; i++){
animalArray[i].printName();
}
}
}
2つのファイルを wsフォルダに保存して実行します。
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Driver_00.java
ws>java Driver_00
ゴン太くんだぞ! ガオー!
ふなっしーだぞ! ガオー!
無名だぞ! ガオー!
5. Animalクラスを継承してみる
今度は、Animal_01クラスを継承して、
Dog_01クラスと Cat_21クラス(サブクラス)を作ります。
Driver_01でそれぞれの動作を確認してみましょう。
詳しい説明は
あとにしよう。
//Dog_01.java
public class Dog_01 extends Animal_01{
public Dog_01(String name){
super(name);
}
//上書きしたメソッド
@Override
public void printName(){
System.out.println(name + "だワン!");
}
}
//Cat_21.java
public class Cat_21 extends Animal_01{
public Cat_21(String name){
super(name);
}
//追加したメソッド
public void sayWish(){
System.out.println(name + "は小判が欲しいのにゃ!");
}
}
//Driver_01.java
public class Driver_01{
public static void main(String[] args){
Animal_01 animal01 = new Animal_01("アニマル浜口");
Dog_01 dog_01 = new Dog_01("フレンダー");
Cat_21 cat_21 = new Cat_21("ニャース");
animal01.printName(); //スーパークラスのメソッド
dog_01.printName(); //上書きしたメソッド
cat_21.printName(); //継承したメソッド
cat_21.sayWish(); //追加したメソッド
}
}
Animal_01.java、
Dog_01.java、
Cat_21.java、
Driver_01.java、の4つのファイルを
wsフォルダに保存して実行します。
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Driver_01.java
ws>java Driver_01
アニマル浜口だぞ! ガオー! ← スーパークラスのメソッド
フレンダーだワン! ← 上書きしたメソッド
ニャースだぞ! ガオー! ← 継承したメソッド
ニャースは小判が欲しいのにゃ! ← 追加したメソッド
- nameは、すべてのサブクラスに継承されていて、
インスタンス化したときに、それぞれのインスタンスに割り当てられています。
- Cat_21クラスに printNameメソッドが記述されていませんが、
これも Animal_01クラスから継承されています。
- Dog_01クラスは、Animal_01クラスから継承された printNameメソッドを上書きして、
処理内容を変更しています。
- Cat_21クラスには、Animal_01クラスには無い sayWishメソッドを追加しています。
えーと。
extendsしたクラスが
ベースになってるのよね?
何となく
気持ちはわかるだろ?
継承したメソッド、
上書きしたメソッド、
追加したメソッドも、とりあえず動きました。
次のページから、少しずつ解説していきますね。
お疲れ様でした。