サイズ: 3961
コメント:
|
サイズ: 3123
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 77: | 行 77: |
例として、Itemクラスでメソッドshow()が定義されている場合を考えます。 {{{#!java public class Item { ... void show() ... } }}} ItemクラスのサブクラスとしてFoodクラスを作成しました。 {{{#!java public class Food extends Item { ... public static void main(String[] args) { Food a; a = new Food(); ... a.show(); } }}} Foodクラスのインスタンスに対してshow()を行っています。 このときの動作は、 Foodクラスでメソッドshow()が定義されているかどうかで異なります。 |
メソッドが呼ばれたときの動作はつぎのとおりです。 |
行 111: | 行 85: |
スーパークラス、サブクラスどちらかで定義されていれば、それが使われます。 スーパークラス、サブクラスの両方で定義されているときは、 サブクラスのものが優先されて使われます。 |
継承
すでにあるクラスを拡張して新しいクラスを作ることができます。
このとき、もとのクラスの性質や機能は新しいクラスでも利用できます。
このことを継承といいます。
スーパークラス、サブクラス
クラス1を拡張してクラス2が作られたとき、
- クラス1はクラス2のスーパークラスである
- クラス2はクラス1のサブクラスである
といい、次のような図で表わします。
スーパークラスのことを親クラス、サブクラスのことを子クラスと言うこともあります。
直接の親子でなく、親の親などのときでもスーパークラス、サブクラスと言います。
サブクラスの定義
作成するクラス名の後ろに
- extends スーパークラス名
の形式で記述します。 上の図の関係のクラス2を作る場合は次のようになります。
public class クラス2 extends クラス1 { ... }
属性の継承
スーパークラスで定義された属性はサブクラスに継承されます。
次のようにクラス1とクラス2が定義されている場合、
public class クラス1 { double x; double y; }
public class クラス2 extends クラス1 { double z; }
クラス1のインスタンスは
クラス2のインスタンスは
となります。 クラス1の項目にクラス2で定義された項目が加わった形です。
メソッドの継承
スーパークラスで定義されたメソッドはサブクラスでも利用できます。
メソッドが呼ばれたときの動作はつぎのとおりです。
(1)インスタンスの属するクラスでメソッドが定義されているときは、それが使われます。
(2)インスタンスの属するクラスでメソッドが定義されていないときは、スーパークラスで定義されている同じ名前のメソッドが使われます。
- 直接の親だけでなく、親の親の親...と順に探します。
(3)スーパークラスにもメソッドがみつからないときは、エラーとなります。
スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することを メソッドのオーバーライドといいます。
コンストラクタの継承
コンストラクタは継承されません。
サブクラスのコンストラクタが呼ばれたときは
- スーパークラスのコンストラクタで記述された処理
- サブクラスで記述された処理
の順に両方が行われます。