スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
新しい記事を書く事で広告が消せます。
[Java]スーパークラス型変数へのサブクラスインスタンス代入時の挙動
スーパークラス型の変数にサブクラスのインスタンスを代入した時の挙動について。
以下の様なあるクラス(Superクラス)とそのクラスを継承したクラス(Subクラス)を作成する。
○Superクラス(スーパークラス)
○Subクラス(サブクラス)
そして、以下の様にSuperクラス型変数instanceにSubクラスのインスタンスを代入し、showMessageメソッドを実行するとどうなるか。
上記を実行すると、コンソールには以下の様にメッセージが表示される。
サブクラスのメソッドが実行されました。
変数instanceはSuperクラス型だが、参照先はSubクラスのインスタンスであり、showMessageメソッドはSubクラスでオーバーライドされている為、Subクラス側のメソッドが実行されることになる。
では、Subクラスでのみ実装されているshowMessageOfSubメソッドはどうか。
上記を実行すると、コンパイルエラーとなってしまう。
上述の通り変数instanceはSuperクラス型であり、SuperクラスにはshowMessageOfSubメソッドが存在しない為、実行することができない。
以上の挙動は、メソッドの引数の場合も同様である。
以下の様にSubクラス型変数instanceをtestMethodメソッドの引数として渡してみる。
上記を実行すると、先の例と同様にコンソールには以下の様にメッセージが表示される。
サブクラスのメソッドが実行されました。
testMethodメソッドの仮引数objectはSuperクラス型、実引数instanceはSubクラス型である為、showMessageメソッドはSubクラス側のメソッドが実行され、showMessageOfSubメソッドは実行することができない(9行目のコメントアウトを解除するとコンパイルエラーとなってしまう)。
以下の様なあるクラス(Superクラス)とそのクラスを継承したクラス(Subクラス)を作成する。
○Superクラス(スーパークラス)
1 2 3 4 5 6 7 8 | public class Super { public Super () { } public void showMessage() { System .out.println( "スーパークラスのメソッドが実行されました。" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Sub extends Super { public Sub () { } @Override public void showMessage() { System .out.println( "サブクラスのメソッドが実行されました。" ); } public void showMessageOfSub() { System .out.println( "サブクラス独自のメソッドが実行されました。" ); } } |
1 2 3 4 5 6 | public class Main { public static void main( String [] args) { Super instance = new Sub (); instance.showMessage(); } } |
サブクラスのメソッドが実行されました。
変数instanceはSuperクラス型だが、参照先はSubクラスのインスタンスであり、showMessageメソッドはSubクラスでオーバーライドされている為、Subクラス側のメソッドが実行されることになる。
では、Subクラスでのみ実装されているshowMessageOfSubメソッドはどうか。
1 2 3 4 5 6 | public class Main { public static void main( String [] args) { Super instance = new Sub (); instance.showMessageOfSub(); } } |
上述の通り変数instanceはSuperクラス型であり、SuperクラスにはshowMessageOfSubメソッドが存在しない為、実行することができない。
以上の挙動は、メソッドの引数の場合も同様である。
以下の様にSubクラス型変数instanceをtestMethodメソッドの引数として渡してみる。
1 2 3 4 5 6 7 8 9 10 11 | 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行目のコメントアウトを解除するとコンパイルエラーとなってしまう)。
- 関連記事
-
- [Java]byte型数値を符号なし数値として扱う
- [Java]InputStreamの読み出しデータを格納した配列型変数の状態
- [Java]スーパークラス型変数へのサブクラスインスタンス代入時の挙動
- [Java]配列やArrayListの要素数の最大値
- [Java]Singletonパターン
プロフィール
Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。
ブログランキング
ブログランキング参加中。是非クリックお願いします。
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード