2007年10月15日月曜日

継承(拡張)

オブジェクト指向言語 Java の特徴のひとつに「継承」があます。
継承により、サブクラス(子クラス)はスーパークラス(親クラス)の機能を使用できます。
継承は extends キーワードで宣言します。

class Super {
    int super_x;
    void sayHello() {System.out.println("Hello");}
    void func() {System.out.println("Super");}
}

class Sub extends Super {
    int sub_x;
    void func() {System.out.println("Sub");}
}
__________________

Sub 型でインスタンスの生成
Sub objSub = new Sub();

スーパークラスのメンバーへアクセス
System.out.println(objSub.super_x);
obj.sayHello();

サブクラスの変数へアクセス
System.out.println(objSub.sub_x);
objSub.func();

Super 型でインスタンスの生成
Super objSuper = new Super();

Super 型からサブクラスのメンバーにはアクセスできない。
__________________

is-a 型でインスタンス生成
継承関係にあるスーパークラスとサブクラスの機能をフルに利用するには下記のようにインスタンスを生成します。

Super obj = new Sub();

Super 型で Sub のインスタンスを生成しています。

この場合、is-a 関係が成り立ちます。

is-a 関係とはその名のとおり Sub is a Super という関係です。
__________________

多様性
Super のメソッド func() は Sub でオーバーライドされています。
obj.func() を呼び出すと Super 型の obj から Sub の func() が呼び出されます。
これを多様性といいます。
多様性はインターフェースとそれを実装するサブクラス間でも利用できます。

このような Super 型の obj から Sub 固有のメソッドを呼び出すことは出来ません。
Sub 固有のメソッドを呼び出すには Sub 型にキャストして呼び出します。

((Sub)obj).subFunc();
__________________

<サンプル>
class Super {
    void func() {
        System.out.println("Super");
    }
}
class Sub extends Super {
    @Override
    void func() {
        System.out.println("Override");
    }
    void subFunc() {
        System.out.println("Sub");
}
public class Sample {
    public static void main(String[] args) {
        Super obj1 = new Super();
        Super obj2 = new Sub();
        obj1.func();
        obj2.func();
        ((Sub)obj2).subFunc();
    }
}

<出力結果>
Super
Override
Sub

0 件のコメント: