教育・子育て

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
マんタ's icon'
  • マんタ
  • @25kit6
遂に!今年最後の月!!!気温もかなり下がって最低気温一桁だけど、まだなんとか耐えられる!年内に雪降らないトいいけどね( ̄▽ ̄)

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 ALIS
Eye catch
教育・子育て

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

Like token Tip token
25.63 ALIS
Eye catch
クリプト

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

Like token Tip token
947.13 ALIS
Eye catch
ビジネス

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

Like token Tip token
16.10 ALIS
Eye catch
他カテゴリ

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

Like token Tip token
124.82 ALIS
Eye catch
クリプト

続・NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
6.37 ALIS
Eye catch
教育・子育て

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

Like token Tip token
23.75 ALIS
Eye catch
他カテゴリ

警察官が一人で戦ったらどのくらいの強さなの?『柔道編』 【元警察官が本音で回答】

Like token Tip token
114.82 ALIS
Eye catch
他カテゴリ

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

Like token Tip token
1.20 ALIS
Eye catch
クリプト

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

Like token Tip token
159.32 ALIS
Eye catch
他カテゴリ

ALISのシステム概観

Like token Tip token
5.00 ALIS
Eye catch
他カテゴリ

オランダ人が語る大麻大国のオランダ

Like token Tip token
46.20 ALIS