![Eye catch](https://alis.to/d/api/articles_images/25kit6/34ZmbJezer7l/39ee69c9-88b3-4e37-94b8-1fb2cc33d489.png?d=592x296)
ハイ、3ヶ月ぶりかな?
残り100ページぐらい・・・
後どれくらいで終われるだろ…
個人的には 10月あたりまでには終わろうと思うけど…
で、今回はポリモーフィズムについてやっていきます。
スーパークラスとサブクラスは、共通するメンバ(フィールド変数とメソッド)
を持っている。
特にサブクラスはスーパークラスから継承したメンバを持っているので、スーパークラスとして扱ってもいいのでは?と・・・
コレが、代入とキャストの問題です。
また、オーバーライドはサブクラスでスーパークラスのメソッド機能を書き換えることですが、オーバーライドしたメソッドはオブジェクトに固有なメソッドになり代入やキャストを行っても変わりません。
最終的に、代入とキャスト、オーバーライドの特質から導き出されるポリモーフィズムについてわかりやすく解説します。
ポリモーフィズムはカプセル化継承と並んでオブジェクト指向の3大要素です。
これらのことを踏まえてまずは、代入とキャストについてやっていきます。
======================================
型は違っても同じ種類に属す型があります。
例えば、int とdoubleはどちらも数値型という同じ種類の型。
同じ種類の型であれば、次のように自動変換による代入やキャストができます。
double date = 20; //自動変換
int number = (double)15.3; //キャストによる強制型変換
で、オブジェクトに同じ種類の型があったかというと・・・・・・
実は、オブジェクトでは、継承関係にある型同士が同じ種類の型です。
継承関係を図で示すと次のようになります。
実際に代入やキャストを行い、何が可能で何が不可能なのか確かめてみます。
まずは、次の式を見ていきます。
Member member = new Student(118, "田中 宏","A711");
言葉で説明してもわかりにくいと思うので実際にやっていきますwww
package sample18_01;
public class Exec {
public static void main(String[] args) {
Member member = new Student(118, "田中 宏", "A711");
System.out.println(member.getId()+"/"+member.getName());
}
}
コレが今回のコードですが、
実行するとコンソールに表示されます。
Student型オブジェクトをMember型の変数memberに代入しgetIdとgetNameメソッドを使ってフィールド変数の値を表示しています。
getIdとgetNameは、Memberクラスのメンバなので、変数memberを通してアクセスできます。
ただ、Studentクラスで拡張したメンバにはアクセスできません。
で、まとめると次のようになります。
サブクラスのオブジェクトをスーパークラス型の変数に代入でき
オブジェクトは代入によって変化しないので、サブクラスの拡張部分は存在する
スーパークラス型の変数では、サブクラスで拡張したメンバにはアクセスできない
次は逆のの例を試していきます。
スーパークラスのオブジェクトをサブクラスに代入するケースです。
Student student = new Member(118,"田中 宏");
変数studentよりもMember型オブジェクトが小さい点に注意!!!
このまま代入すると不足する部分があり、student型なら必ずある
フィールド変数 studentId、discount、getStudentId がありません。
このままでは、変数内に隙間ができてしまいます。
オブジェクトは不変!!!
代入によりより不足分が自動的に拡張されることはありません。
そのため、変数studentは不完全なもの・・・
コレは不正な代入になります。
結果は、コンパイルエラーとなるわけです。
エクリプスのバージョンによって多少は違うかも
スーパークラスのオブジェクトは
サブクラス型の変数に代入できない!!!
スーパークラスのオブジェクトを キャスト すればコンパイルエラーにならずに
サブクラスの型の変換に代入できます。キャストは強制的な型変換です。
Student student = (Student)(new Member("田中 宏"));
コレはできるというだけです。コンパイルが通っただけで、実行するとエラーの確率が高いですwww
多くの場合、プログラムを実行すると不正な型変換をしたという実行時例外が発生します。
これは、サブクラス型へのキャストでダウンキャストといいます。
ダウンキャストは危険な操作なので避けなければいけません。
次回、もう一度ダウンキャストについて詳しく説明していきます。
ここまでご覧いただきありがとうございました。
参考書は__________________________________
川場 隆 Kawaba Takashi
秀和システム
______________________________________
BY マんタ