FC2ブログ
HOME   »  スポンサー広告  »  スポンサーサイト   »  Java  »  [Java]スーパークラス型変数へのサブクラスインスタンス代入時の挙動

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java]スーパークラス型変数へのサブクラスインスタンス代入時の挙動

スーパークラス型の変数にサブクラスのインスタンスを代入した時の挙動について。

以下の様なあるクラス(Superクラス)とそのクラスを継承したクラス(Subクラス)を作成する。

○Superクラス(スーパークラス)
public class Super {
    public Super() {
    }
    
    public void showMessage() {
    	System.out.println("スーパークラスのメソッドが実行されました。");
    }
}
○Subクラス(サブクラス)
public class Sub extends Super {
    public Sub() {
    }

    @Override
    public void showMessage() {
        System.out.println("サブクラスのメソッドが実行されました。");
    }

    public void showMessageOfSub() {
        System.out.println("サブクラス独自のメソッドが実行されました。");
    }
}
そして、以下の様にSuperクラス型変数instanceにSubクラスのインスタンスを代入し、showMessageメソッドを実行するとどうなるか。
public class Main {
    public static void main(String[] args) {
        Super instance = new Sub();
        instance.showMessage();
    }
}
上記を実行すると、コンソールには以下の様にメッセージが表示される。


サブクラスのメソッドが実行されました。


変数instanceはSuperクラス型だが、参照先はSubクラスのインスタンスであり、showMessageメソッドはSubクラスでオーバーライドされている為、Subクラス側のメソッドが実行されることになる。

では、Subクラスでのみ実装されているshowMessageOfSubメソッドはどうか。
public class Main {
    public static void main(String[] args) {
        Super instance = new Sub();
        instance.showMessageOfSub();
    }
}
上記を実行すると、コンパイルエラーとなってしまう。

上述の通り変数instanceはSuperクラス型であり、SuperクラスにはshowMessageOfSubメソッドが存在しない為、実行することができない。

以上の挙動は、メソッドの引数の場合も同様である。

以下の様にSubクラス型変数instanceをtestMethodメソッドの引数として渡してみる。
public class Main {
    public static void main(String[] args) {
        Sub instance = new Sub();
        testMethod(instance);
    }

    public static void testMethod(Super object) {
        object.showMessage();
        //object.showMessageOfSub();
    }
}
上記を実行すると、先の例と同様にコンソールには以下の様にメッセージが表示される。


サブクラスのメソッドが実行されました。


testMethodメソッドの仮引数objectはSuperクラス型、実引数instanceはSubクラス型である為、showMessageメソッドはSubクラス側のメソッドが実行され、showMessageOfSubメソッドは実行することができない(9行目のコメントアウトを解除するとコンパイルエラーとなってしまう)。


関連記事
Comment
Trackback
Trackback URL
Comment Form
管理者にだけ表示を許可する
プロフィール

まさお

Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。

ブログランキング
ブログランキング参加中。是非クリックお願いします。


にほんブログ村 IT技術ブログ Androidアプリ開発へ

人気ブログランキングへ

ブログランキング



ブログ王

ブログランキング【ブログの惑星】

プログラム人気ブログランキング
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。