- スーパークラスを継承して新しいサブクラスを定義するために、クラス定義の先頭で、クラス名の後に extends というキーワードを用いてスーパークラス名を書き、継承する。例えば、動物スーパークラスAnimalから、鳥類サブクラスBirdを継承するのは、以下のようである。
public class Bird extends Animal { : :
この記述によって Animal というスーパークラスから Birdというサブクラスが生成され、 Animal の持つ性質(動物としての機能)はすべて Bird に継承される。 (もちろん、Birdクラスのメソッドとしては、実際には羽を付けて空を飛べる、という機能(メソッド)を追加することになる?)
継承される性質のルールは以下のとおり。
- スーパークラスで既に定義されたフィールド・メソッドは、サブクラス内に改めて記述しなくても利用可(これが継承の主目的)。
- サブクラスで新しく追加されたフィールド・メソッドは、そのまま機能追加とみなされる(至極当然のことである)。
- サブクラスで新しく追加されたフィールド・メソッド名が、スーパークラスで既に定義されたのと同じ名称であれば、サブクラス側で再定義したものが常に優先される(定義のオーバーライト)。
- 定義のオーバーライトについて:オーバーライトすると、スーパークラスで定義された情報が消えてしまうわけではない。スーパークラス側で定義されていたフィールド・メソッドを呼び出したい(先祖の呼び戻し?)時には、super というキーワードが利用し、性質を呼び戻す。
- ヒント:thisが自分自身のクラスを表したように、superは直接のスーパークラスを指す。
- superを使用する場面:サブクラス側でのメソッド再定義の場合、スーパークラス側の機能に、何か機能追加をする場合が多い。
/** メソッド機能追加 */ public void MethodA() { super.MethodA(); // スーパークラスの機能をsuperで指す : // 以下このサブクラスで追加するメソッドとしての機能 :
- super は、 継承するデータの初期化の処理などを行なう等のため、コンストラクタの記述の中でしばしば現れる。
- サブクラスのコンストラクタの中で スーパークラス側のコンストラクタを呼び出すには、 次のように super() を使用する。
/** サブクラスのコンストラクタ */ public SubClassName() { super(); // スーパークラス側のコンストラクタ呼び出し : // サブクラス側で追加する機能 :
- 一般にコンストラクタは引数の個数や型によって複数定義されている。 super()に引数を渡す場合には、スーパクラスの側に、その引数の指定に合致するコンストラクタの定義が存在する必要がある。
- スーパクラスに明示的にコンストラクタが定義されていない場合でも、 引数なしのコンストラクタの呼び出し super()は可能。 (暗黙のコンストラクタ)
- ただし、スーパクラスにコンストラクタの定義が存在し、しかも引数無しの コンストラクタが定義されていない場合には、引数なしの super()は呼び出せない。
- クラスの継承は何代に渡っても可能。 例えば、上の Bird の更なるサブクラス Chicken (にわとり)やTurkey(ターキー)を作成することができる。(Chickenを継承してサブクラス「名古屋コーチン」を定義し、それは、ようやくnew(具現化)できる)
public class Chicken extends Bird { : :
- Chicken の直接のスーパークラスは Bird だが、 Animal もまた Chicken のスーパークラスである。
- 実際 Javaのプログラムでは、 あるクラスのオブジェクトをそのスーパークラスを参照するための変数に キャストなしに代入することが可能(C言語では、整数int型変数の値を、実数double型変数へ直接代入可能であった)。
Animal val_animal; Bird val_bird; Chicken val_chicken; val_bird = val_chicken; val_animal = val_bird;
- この逆を行う場合には、当然、明示的な「キャスト」が必要となる。 Javaのキャストは、C言語の場合と同じで、型(クラス)名を ( ) で囲み、 オブジェクト変数の前に付けることでキャスト表現をする。
Animal val_animal; Bird val_bird; Chicken val_chicken; val_bird = (Bird)val_animal; val_chicken = (Chicken)val_bird;
Object クラス:Objectは Javaで定義される全てのクラスの、共通のスーパークラスである。クラスの継承を用いずにクラスの定義を記述したつもりでも、実際は、自動的に Objectのサブクラスになっている。 Objectクラスのオブジェクトをそのまま利用することは通常は無い。例: 以下の2つの記述は同じことを表している。
public class ClassA { : : public class ClassA extends Object { : :
- プログラム中、Objectという記述が為された場合、それは、メソッド引数・返り値でやり取りされる データのクラスがはっきり決まっていない(つまり、何でも許される)という意味。 (以下の例では、”動物は何か食する”ことを示しているだけで、”何の種類の食物を食べるか”については述べていない。何の種類の食物を好んで食するかは、具現化するまで継承を経た最終サブクラス(例:名古屋コーチンとか)でないと判然としないからである。しかし、動物の基本機能として”食物から活動エネルギーを得て生きる”ということはスーパークラスの定義として自然であろう)
public class Animal { public void eat( Object food ) { : :
- Objectは全ての配列のオブジェクトのスーパクラスでもあるので、例えば、「任意の型の配列」を引数などの渡したい場合は Objectを用いる。
2003年10月21日 6:20 更新