search
教育・子育て

java chapter 18 ポリモーフィズム ①

マんタ's icon'
  • マんタ
  • 2024/06/28 00:17

ハイ、3ヶ月ぶりかな?

残り100ページぐらい・・・

後どれくらいで終われるだろ…

個人的には 10月あたりまでには終わろうと思うけど…

 

で、今回はポリモーフィズムについてやっていきます。

スーパークラスとサブクラスは、共通するメンバ(フィールド変数とメソッド)

を持っている。

特にサブクラスはスーパークラスから継承したメンバを持っているので、スーパークラスとして扱ってもいいのでは?と・・・

コレが、代入とキャストの問題です。

また、オーバーライドはサブクラスでスーパークラスのメソッド機能を書き換えることですが、オーバーライドしたメソッドはオブジェクトに固有なメソッドになり代入やキャストを行っても変わりません。

 

最終的に、代入とキャスト、オーバーライドの特質から導き出されるポリモーフィズムについてわかりやすく解説します。

ポリモーフィズムはカプセル化継承と並んでオブジェクト指向の3大要素です。

これらのことを踏まえてまずは、代入とキャストについてやっていきます。

======================================

1⃣.代入とキャスト(型変換)

型は違っても同じ種類に属す型があります。

例えば、int とdoubleはどちらも数値型という同じ種類の型。

同じ種類の型であれば、次のように自動変換による代入やキャストができます。

 

double  date = 20;                    //自動変換
int        number = (double)15.3;    //キャストによる強制型変換

 

で、オブジェクトに同じ種類の型があったかというと・・・・・・

実は、オブジェクトでは、継承関係にある型同士が同じ種類の型です。

 

継承関係を図で示すと次のようになります。

Content image

 

実際に代入やキャストを行い、何が可能で何が不可能なのか確かめてみます。

1.スーパークラス型への代入

 

まずは、次の式を見ていきます。

 

Member member = new  Student(118, "田中 宏","A711");

Content image

言葉で説明してもわかりにくいと思うので実際にやっていきます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());
 }
}

 

コレが今回のコードですが、

Content image

実行するとコンソールに表示されます。

 

Student型オブジェクトをMember型の変数memberに代入しgetIdとgetNameメソッドを使ってフィールド変数の値を表示しています。

getIdとgetNameは、Memberクラスのメンバなので、変数memberを通してアクセスできます。

ただ、Studentクラスで拡張したメンバにはアクセスできません。

 

で、まとめると次のようになります。

★スーパークラス型変換への代入

サブクラスのオブジェクトをスーパークラス型の変数に代入でき

 

オブジェクトは代入によって変化しないので、サブクラスの拡張部分は存在する

 

スーパークラス型の変数では、サブクラスで拡張したメンバにはアクセスできない

 

2.サブクラス型への代入(コンパイルエラー)

 

次は逆のの例を試していきます。

スーパークラスのオブジェクトをサブクラスに代入するケースです。

 

Student student = new Member(118,"田中 宏");

 

Content image

変数studentよりもMember型オブジェクトが小さい点に注意!!!

このまま代入すると不足する部分があり、student型なら必ずある

フィールド変数 studentId、discount、getStudentId  がありません。

このままでは、変数内に隙間ができてしまいます。

オブジェクトは不変!!!

代入によりより不足分が自動的に拡張されることはありません。

そのため、変数studentは不完全なもの・・・

コレは不正な代入になります。

結果は、コンパイルエラーとなるわけです。

エクリプスのバージョンによって多少は違うかも

 

スーパークラスのオブジェクトは

     サブクラス型の変数に代入できない!!! 

 

3.キャストによる強制的な代入とinstanceof演算子

 

スーパークラスのオブジェクトを キャスト すればコンパイルエラーにならずに

サブクラスの型の変換に代入できます。キャストは強制的な型変換です。

 

Student student = (Student)(new Member("田中 宏"));

コレはできるというだけです。コンパイルが通っただけで、実行するとエラーの確率が高いですwww

多くの場合、プログラムを実行すると不正な型変換をしたという実行時例外が発生します。

これは、サブクラス型へのキャストでダウンキャストといいます。

ダウンキャストは危険な操作なので避けなければいけません。

 

次回、もう一度ダウンキャストについて詳しく説明していきます。

 

ここまでご覧いただきありがとうございました。

 

参考書は__________________________________

新わかりやすい Java

川場 隆  Kawaba Takashi

秀和システム

______________________________________

BY マんタ

Supporter profile iconSupporter profile icon
Article tip 2人がサポートしています
獲得ALIS: Article like 113.72 ALIS Article tip 23.20 ALIS
Article registration Article registration
マんタ's icon'
  • マんタ
  • @25kit6
4月突入!春らしくなってきたけどなんか寒い(><)油断すると風邪ひきそうだから服装もそこそこにしないとね(^O^)

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
ビジネス

海外企業と契約するフリーランス広報になった経緯をセルフインタビューで明かす!

Semapho 2021/09/14
Like token Tip token
16.10 ALIS
Eye catch
教育・子育て

【科学(化学)】進化に必要だった猛毒のガス~酸素~

KTAG 2021/02/11
Like token Tip token
25.63 ALIS
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

kaya 2021/10/06
Like token Tip token
61.20 ALIS
Eye catch
クリプト

Bitcoinの価値の源泉は、PoWによる電気代ではなくて"競争原理"だった。

CryptoChick 2020/03/07
Like token Tip token
159.32 ALIS
Eye catch
他カテゴリ

機械学習を体験してみよう!(難易度低)

nonstop-iida 2020/03/04
Like token Tip token
124.82 ALIS
Eye catch
他カテゴリ

BCAAは本当に必要なのか?徹底的調査

Jimmy 2020/07/05
Like token Tip token
1.20 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

大田コウキ 2021/04/06
Like token Tip token
947.13 ALIS
Eye catch
他カテゴリ

テレビ番組で登録商標が「言えない」のか考察してみる

連獅子 2021/10/09
Like token Tip token
31.20 ALIS
Eye catch
他カテゴリ

京都のきーひん、神戸のこーへん

yamaeigh 2020/02/15
Like token Tip token
12.10 ALIS
Eye catch
他カテゴリ

防犯意識 マーキング 下書き供養④

しろしろ 2021/04/20
Like token Tip token
24.07 ALIS
Eye catch
トラベル

無料案内所という職業

bansu 2019/06/11
Like token Tip token
84.20 ALIS
Eye catch
教育・子育て

【科学】アリストテレスにデカルトにニュートンに…みな光に取り憑かれた~光学の発展~

KTAG 2021/09/25
Like token Tip token
23.75 ALIS