オーバーライド
今回はオーバーライドについてみていきます。「継承」の記事で、サブクラスはスーパークラスの「拡張や変更」部分のみを記載したクラスと説明しました。オーバーライドはこの変更処理になります。
オーバーライドとは
※wikipedia引用
オブジェクト指向プログラミングにおいてオーバーライド (override)とは、スーパークラスで定義されたメソッドをサブクラスで定義しなおし動作を上書きすることである。
あるクラスAにメソッドMethodがあり、あるクラスSubAがクラスAを継承したとする。そのとき、クラスSubAはクラスAにあるメソッドMethodをオーバーライドすることにより、再定義することができる。これはオブジェクト指向プログラミングにおけるポリモーフィズムを実現する際によく使われる。

動物ロボットの設計図をサンプルとして考え方を説明します。
(1)動物ロボットの設計図
動物ロボットの機能を集めた設計図です。「食べる・寝る」といった機能仕様が書かれています。
(2)哺乳類動物ロボット、鳥類動物ロボットの拡張設計
「犬は歩き、鳥は空を飛び、魚は泳ぐ」など動物ロボットの種類によっては特有の属性や機能がでてきます。また「寝る」という機能も動物によって違いがでてきます。そのような場合、ベースとなる動物ロボット設計図はそのまま利用し、属性や機能の拡張部分や変更部分を別の設計図として作ります。サンプルでは犬や猫などの哺乳類ロボット設計図には「歩く」という機能を追加し、鳥類ロボットの設計図には「飛ぶ」という機能を追加しました。また鳥類ロボットは「寝る」という機能を変更しています。
(3)設計図の見方
設計図にはベースとなる部分が書かれたものと、拡張や変更が書かれたものがあります。実際にロボット製作するときは当然両方の設計図をみて作成します。サンプルでは、哺乳類ロボットはベース部分に「歩く」という機能が追加されたもの、鳥類ロボットはベース部分に「飛ぶ」という機能が追加されたものができます。また鳥類ロボットは「寝る」という機能が変更されていますので変更内容も反映します。
サンプル
【Animal.java】
class Animal {
//メソッド
void eat(){ //食べる
System.out.println("食べています ムシャムシャ");
}
void sleep(){ //寝る
System.out.println("寝ています ZZzz…");
}
}

動物ロボットの共通機能を集めた設計図です。「eat : 食べる」と「sleep : 寝る」の2つのメソッドがあります。
【Mammal.java】
class Mammal extends Animal {
//メソッド
void walk(){
System.out.println("歩いています");
}
}
【Birds.java】
class Birds extends Animal {
//メソッド
void fly(){
System.out.println("飛んでいます");
}
void sleep(){ //※オーバーロード
System.out.println("寝ています。すやすや ");
}
}

哺乳類ロボットの拡張部分の「Mammal」クラスと、鳥類ロボットの拡張部分「Birds」クラスです。「Birds」クラスにはスーパークラスと同じメソッド名の「sleep」があります。これはサブクラスで「sleep」メソッドを上書きしています。サブクラスでスーパークラスと同じメソッド名を定義することにより、スーパークラスのメソッド内容を変更することができます。この上書き定義を「オーバーライド」といいます。
【Sample.java】
public class Sample {
public static void main(String[] args) {
Mammal mammal_robot = new Mammal();
Birds birds_robot = new Birds();
mammal_robot.sleep();
System.out.println("--------------");
birds_robot.sleep();
}
}
--------------
寝ています。すやすや

6行目では「mammal」クラスのインスタンスのsleepメソッドを実行しています。8行目では「Birds」クラスのインスタンスのsleepメソッドを実行しています。同じsleepメソッドですが実行結果が違います。「mammal」クラスはスーパークラスのsleepメソッドを継承しそのまま内容を実行しています。それに対して「Birds」クラスはスーパークラスのsleepメソッドを上書きし、上書きした内容が実行されています。
2010 年 6 月 14 日 月曜日 【 カテゴリー: Javaの基本 】
