クラスの継承とは?

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

クラスの継承

親クラスと子クラス

元のクラスも其の侭使いたい時は、元のクラスを改造して終う訳にはいきません。
其処で、元のクラスを拡張して新たなクラスを作ります。
此をクラスの継承と言います。
新しいクラスは元のクラスとは別のクラスですが、元のクラスのフィールドやメソッドを其の侭利用出来ます。
元のクラスを親クラス又はスーパークラスと言い、其れを継承したクラスを子クラス又はサブクラスと言います。
子クラスには、親クラスを継承している事を明記した上で、影の部分だけを記述します。
其れは、親クラスの部分にのみ変更が有った場合に、子クラスは影響を受けなくて済む様にする為です。

単一継承と多重継承

1つの親クラスのみを継承して子クラスを作る事を、単一継承と言います。
此に対し、2つ以上の親クラスを同時に継承する事を多重継承と言います。
javaでは、多重継承が許されていません。

単一継承 1つの親クラスのみを継承
javaでは許されている
多重継承 子クラスは「クラスA」と「クラスB」を両方継承
javaでは許されていない

一方で、親クラスを継承して出来た子クラスを、更に継承して子クラスを作る事が許されています。

継承の禁止

クラスを作った時に、其れを継承したサブクラスを作って欲しくない事が有ります。
其の様な場合には、「final」キーワードを指定して継承を妨げられます。
継承を禁止したクラスをfinalクラスと言います。

例: final class ClassA{
     :
     :
}

finalクラスを継承したサブクラスを定義すると、コンパイルエラーになります。


継承クラスの作成

継承の明記

作成するクラスがサブクラスで有る時、クラス宣言時にどのクラスを継承するかを明記します。

public class クラス名 extends スーパークラス名{
      :
      :
}
例: public class TwoPointsColor extends TwoPoints{
     :
     :
}

フィールドの設計

サブクラスには、スーパークラスに追加するフィールドだけを記述します。
此処では、始点と終点の(x, y)座標値はTwoPointsクラスに既に有りますので、新たに追加する色情報だけを記述します。

Color c; //線の色

コンストラクタの設計

コンストラクタは、クラス名と同名でなければならない為、サブクラスで必要な形式は全て記述します。
此処では、以下の3種類の形式を用意する事にしましょう。

@TwoPointsColor()
ATwoPointsColor(int x1, int y1, int x2, int y2, Color c)
BTwoPointsColor(Point p1, Point p2, Color c)

3つのコンストラクタは、色情報以外のデータの初期化処理をスーパークラスのコンストラクタで記述してあります。
サブクラスでは、スーパークラスで定義されている処理を利用する事にしましょう。
サブクラスからスーパークラスのコンストラクタを呼び出すには、メソッド名を

super(実引数);

とします。
superクラスの呼び出しは、コンストラクタの先頭に書かなければなりません。

メソッドの設計

@セッタメソッドとゲッタメソッド

TwoPointsColorクラスで新たに宣言したクラス変数は、Colorクラスのオブジェクト「c」だけです。
其の為、此のクラスで用意するセッタメソッドとゲッタメソッドは、此のオブジェクト「c」に対して色情報を設定したり、読み出したりするメソッドだけで良い事になります。

void setColor(Color c)
Color getColor()

A操作メソッド

TwoPointsクラスでは、直線を描くメソッドを用意しましたが、TwoPointsColorクラスでは、描画する色を設定してから直線を描くメソッドを作る事にしましょう。

void drawLine(Graphics g)
void drawLine(int dx, int dy, Graphics g)

スーパークラスのTwoPointsクラスで作成したメソッドと、サブクラスで作成しようとしているメソッドは名前も引数の型も同じですが、所属するクラスが違うので両者は違う物です。
サブクラスで作成するdrawLineメソッドは、色を設定する所は新たに書き込む部分ですが、直線を描く部分はスーパークラスで既に作成された物を呼び出して利用出来ます。
サブクラスからスーパークラスのメソッドを呼び出す際に指定するターゲットを「super」と書きます。

super.メソッド名(実引数);

スーパークラスのメソッドをサブクラスで書き換えた同名のメソッド内をメソッドのオーバーライドと言います。

今度はコンストラクタの時と異なり、スーパークラスのメソッドの呼び出しは先頭でなくても良く、プログラムの流れの必要な場所に書けます。
例えば、此処で作成するメソッドで、

色を指定してから→g.setColor
線を描く→スーパークラスの呼び出し

の様に描いた場合、スーパークラスの呼び出しが先に有ったのでは、色の指定が出来ませんね。

サブクラスの利用

サブクラスのオブジェクトは、サブクラスで新たに用意したメソッドだけでなく、スーパークラスのメソッドも呼び出せます。
又、スーパークラスのフィールドも使えます。

例: TwoPointsColor data = new TwoPointsColor();
data.setx1(10);

継承の禁止とオーバーライドの禁止

其れでは、Rectangleクラスを継承し、目玉のプログラムの為にカスタマイズしたMedamaRectangleクラスを作りましょう。
此のクラスは目玉専用のクラスですから、此を更に継承して欲しくないと言う事を明示する為に継承を禁止する事にしましょう。
クラスの宣言は「final」を用いて、

public final class MedamaRectangle extends Rectangle{

の様になります。
クラスの継承が許されている場合でも、其の中の一部のメソッドだけはオーバーライドして欲しくない場合や、継承したクラスにおいても此のメソッドだけは其の侭使って欲しいと言う時は、メソッド宣言の時に「final」を付けて、メソッドのオーバーライドを禁止出来ます。

final 型 メソッド名(仮引数){

}

クラス間のデータの代入

サブクラスのオブジェクトをスーパークラスのオブジェクトに代入出来ます。
下の例の様に「subData」を「superData」に代入すると、「superData」は「subData」が指すサブクラスのオブジェクトの中のスーパークラスの部分を指す事になります。

例: Rectangle superData = new Rectangle();
MedamaRectangle subData = new MedamaRectangle();

superData = subData;

逆に、スーパークラスのオブジェクトをサブクラスのオブジェクトに代入する時は、キャストを付けます
代入後に、「subData」がサブクラスで追加された部分のデータをさんしょうしたりする為には、「superData」が指しているスーパークラスのオブジェクトの周りの追加されたサブクラスの部分も予めインスタンス化されていなければなりません。

例: Rectangle superData = new Rectangle();
MedamaRectangle subData = new MedamaRectangle();

subData =(MedamaRectangle)superData;
subData = superData; ・・・コンパイルエラー

但し、継承関係に無いクラスはキャストを付けても代入出来ません。

例: Rectangle dataR = new Rectangle();
TwoPoints data2P = new TwoPoints();

dataR =(Rectangle)data2P; ・・・コンパイルエラー

ターゲットオブジェクト(this)

クラスメソッド内で、ターゲットで有るオブジェクトを使う時は、「this」を使います。

ソース ダウンロード
HouseCA4.java TwoPoints03.zip
MedamaCA3.java Medama07.zip MedamaCA3.html

戻る