クラスの継承を理解する
シンプルに言えば
- 既存のクラスで定義されている変数やメソッドを受け継いだクラスを作成すること。
となりま す。誤解を恐れずに喩えれば、「遺伝」のようなものです。ただし、親から継承するものは、public・protectedな変数やメソッドのみです。親 がもっているpublic・protectedな変数やメソッドは、子供のクラスにおいて宣言することなく、利用することができます。
継承を利用する際のおもな目的は、
- 既存のクラスの機能を受け継ぎ、さらに拡張する(変数やメソッドを追加、修正する)
ことです。
「クラスYがクラスXを継承している(Xが親、Yが子)」場合には、
- クラスYはクラスXのサブクラスである
- クラスXはクラスYのスーパークラスである
という関係が成り立ちます。
継承の記述方法
sample4_1.java
class Robot{
void turnRight(){
System.out.println("右に曲がります");
}
}
class Robot2 extends Robot{
void turnLeft(){
System.out.println("左に曲がります");
}
}
public class sample4_1{
public static void main(String[] args) {
Robot2 r = new Robot2();
r.turnLeft();
r.turnRight();
}
}
(解説)
- Robot, Robot2, Sample4_1 という3つのクラスを作成しています
- Robot2はRobotを継承しています。
- sample4_1はRobot2クラスを生成しています。
メソッドのオーバーライド
継承する際には、ただそのメソッドを引き継ぐだけでなく変更(再定義)することができます。つまり、宣言しなおすことで、親の定義とはことなるふるまいのメソッドを作成することができます。
sample4_2.java
class Robot{
//コンストラクタ
Robot(){
}
void turnRight(){
System.out.println("右に曲がります");
}
}
class Robot2 extends Robot{
void turnLeft(){
System.out.println("左に曲がります");
}
void turnRight(){
System.out.println("華麗に右に曲がります");
}
}
public class sample4_2{
public static void main(String[] args) {
Robot2 r = new Robot2();
r.turnLeft();
r.turnRight();
}
}
親クラスのメソッドの呼び出し
オーバーライドした際に、親クラスのメソッドも呼びたいという時があるでしょう。サブクラスからは、スーパークラスのメソッドをsuperを利用して呼び出すことができます。
Javaの継承の制約
継承という概念は、Javaにかかわらず他のオブジェクト指向言語においても実装されています。しかしながら、Javaの継承には制約があります。それは、
- 継承は1つのクラスからのみできる(=多重継承はできない。つまり、親は一人)
という制約があります。多重継承できたほうが便利そうですが、逆に複雑になって混乱するデメリットのほうがい多いので、近年のオブジェクト指向言語では採用されない傾向があります。(といっても、流行りのRubyは多重継承をうまく採用しているようですが。。。)
演習問題
(1)上記のRobotクラスをベースに、その名前を格納するname(Stringクラス)というメンバ変数と、それに対応する単純なアクセサメソッドを追加し、そのJavaコードとUMLを書き、その動作検証をするmain関数を含んだクラスを作成して実行せよ。
(2)以下の仕様を満たすRobot3 クラスのJavaコードとUMLを書きなさい。そして、動作検証をしなさい。
- (1)のRobotクラスを継承する
- コンストラクタで名前を指定できる(引数で受け取る)ように、コンストラクタを追加する。
- setName()メソッドにおいて、指定された名前が10文字以上の場合は falseを返すようにする