20120609 java oo道場(ネタのメモ)

580
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
580
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20120609 java oo道場(ネタのメモ)

  1. 1. Java&OO道場(StartUp編 その2)(全2回)のメモ 2012-06-09(土) by munch
  2. 2. この勉強会の目的は・・・ ・オブジェクト・クラス・インスタンス、について  説明ができない。  ・継承とインタフェースの使い分けができない。 ・そもそもインタフェースって何?何が嬉しいの? ・デザインパターンの良さがわからない。⇒ の、様な疑問に対して「自分なりの解答(もしくはヒント)を   持ち帰ってもらう、でしたが、どうでしょう?
  3. 3. 本日のキーワード「 お 笑 い」 ではなく、、、
  4. 4. 今回も、 シンプル」 「シンプル」 Surtout faites simple(出来る限り単純に作りなさい)エスコフィエの料理の哲学より
  5. 5. 軽く復習も兼ねて「オブジェクト指向」でよく出てくる考え方1.OOA、OOD、OOP 長くなるので、詳細省略2.オブジェクト(データと操作)3.メッセージパッシング 前回やったので、4.カプセル化(情報隠蔽、部品化、再利用) 詳細は省略5.クラス・インスタンス6.階層構造7.継承8.ポリモーフィズム(多相性、多様性、多態性) 今回のキモ
  6. 6. その前に 軽くJavaの文法の復習を(その1)Java 言語において「データ型」と呼ばれるものは3種類存在する 基本データ型 プリミティブ型 基本データ型(プリミティブ型) データ ・・・boolean, char, byte, short, int, long, float, double の    8種類 参照型(リファレンス型 参照型(リファレンス型) ・・・String、Date 等のJavaのライブラリに含まれたものや    それぞれの開発者が作成したクラス 配列型 これには次のシートの ・・・若干特殊な参照型 3種類が存在する
  7. 7. その前に 軽くJavaの文法の復習を(その2) Java 言語において「クラス」と呼ばれるものは3種類存在するイン 高 Interface(インタフェース) (インタフェース)スタ  ン   ・・・定数と抽象メソッドのみを持つス  生成 抽不可 象 AbstractClass(抽象クラス) (抽象クラス) クラス能 度   ・・・定数と変数、抽象メソッド・具象メソッドを持つ       可  能 低 Class(クラス or 具象クラス) ( 具象クラス クラス) ・・・定数と変数、具象メソッドのみを持つ(※)「抽象メソッド」・・・「実装を持たない(≠実装が空)メソッド」 持たない
  8. 8. さっきの内容を表にすると・・・ フィールド メソッド 定数 変数 抽象メソッド 具象メソッドInterface(インタフェース) インタフェース) ○ × ○ ×AbstractClass ○ ○ ○ ○(抽象クラス) 抽象クラス) クラスClass(クラス or 具象クラス) 具象クラス クラス) ○ ○ × ○
  9. 9. ここらで、一発軽い コーディングを
  10. 10. そうです、継承についてです
  11. 11. 「継承」についてのコーディング(その1)●3つのクラス「Oya」「Ko」「KeisyoMain」があります。  ⇒ 「http://bit.ly/L5Zs3y」にコードがあります。問1.「KeisyoMain」クラスの1つ目のコメントアウトを解除して下さい   ⇒ 「Ko」クラスが「Oya」クラスを継承するように修正して下さい Oya printOya() printZaisan() 継承させる KeisyoMain Ko uses main() printKo() printZaisan()
  12. 12. 「継承」についてのコーディング(その2)問2.「KeisyoMain」クラスの2つ目のコメントアウトを解除して   実行結果を確認してみて下さい。   また、「Ko」でオーバーライドされた「printZaisan()」の結果と、   「Oya」の「printZaisan()」の結果を確認してみて下さい Oya printOya() 実行結果の printZaisan() super.printZaisa 確認 n() というコード を追加してみま しょう KeisyoMain Ko usesmain() printKo() printZaisan()
  13. 13. 「継承」についてのコーディング(その3)問3.「Oya」クラスを型として、「Ko」のインスタンスを作成した場合の   実行結果を確認してみて下さい   ⇒「Ko」クラス内に存在する「printKo()」は使用できたでしょうか? Oya printOya() printZaisan() 実行結果の 確認 uses KeisyoMain Ko main() printKo() printZaisan()
  14. 14. 「継承」についてのコーディング(その4)問4.「Oya」クラスを型として、「Ko」のインスタンスを作成した物を、   「Ko」クラスの型へ「ダウンキャスト」した時の実行結果を   確認してみて下さい   ⇒「Ko」クラス内に存在する「printKo()」は使用できたでしょうか? Oya printOya() printZaisan() 実行結果の 確認 uses KeisyoMain Ko main() printKo() printZaisan()
  15. 15. 「継承」についてのコーディング(番外編)●「Ko」に対して、2つ以上の親クラスを継承させようとするとどうなるでしょう? Oya1 Oya2 printOya() printOya() printZaisan() printZaisan() Ko printKo() printZaisan()●「Oya1」が「Oya2」を継承し、「Oya2」が「Oya3」を継承するような関係の  場合、「Oya1」を継承した「Ko」の動きはどうなるでしょう? Oya3 Oya2 Oya1 printOya3() printOya2() printOya() printZaisan() printZaisan() printZaisan() Ko printKo() 後は、各メソッドのアクセス修飾子を printZaisan() 変えてみたりしても面白いかも
  16. 16. 「継承」のポイント●「Oya」(親クラス=スーパークラス)と「Ko」(子クラス=サブクラス)の  関係は理解できましたか?●継承されたときの子クラス(サブクラス)の利用法についてはどうでしょう?  ⇒ 親クラスのメソッドが使えます(アクセス修飾子については要注意)  ⇒ 親クラスのメソッドが子クラスでオーバーライドされる場合があります。●Javaでは「単一継承」しかできません●アップキャスト、ダウンキャストした時の動きについてはどうでしょう? 継承には弱点がある には弱点⇒ 以上を踏まえて、「継承には弱点がある」という話を少々。   (「継承」を考える前に、「委譲」の可能性を検討する)
  17. 17. 「継承」のおまけ(単一継承と多重継承) 単一継承(Java とか) 多重継承(C++とか) Oya Oya1 printOya() printOya() printZaisan() printZaisan() Ko1 Ko2printKo() printKo() Oya1 Oya2printZaisan() printZaisan() printOya() printOya() printZaisan() printZaisan() Ko3 Ko4 Ko printKo() printKo() printKo() printZaisan() printZaisan() printZaisan() (※)「親」「子」というのはそれぞれの相対 的な関係において定義されます。 ダイヤモンド継承問題
  18. 18. ここらで、もう一発軽い コーディングを
  19. 19. 「インタフェース」についてのコーディング(その1)●5つのクラス(及びインタフェース)「Drivable」「Racable」  「Cycle」 「Train」「TestIFMain」があります。  ⇒ 「http://bit.ly/KCuFPj」にコードがあります。問1.「TestIFMain」クラスの1つ目のコメントアウトを解除して下さい   ⇒ 「Cycle」クラスが「Drivable」インタフェースを実装するように     修正して下さい <Drivable> <Racable> start() start() 実装させるTestIFMain Cycle Train usesmain() start() start() turn() stop()
  20. 20. 「インタフェース」についてのコーディング(その2)問2.「Cycle」クラスについて、「Racable」インタフェースも    実装するように修正して下さい <Drivable> <Racable> start() start() 実装させるTestIFMain Cycle Train usesmain() start() start() turn() stop()
  21. 21. 「インタフェース」についてのコーディング(その3)問3.「Cycle」クラスと「Train」クラスについて、実行結果を確認して下さい <Drivable> start() usesTestIFMain Cycle Trainmain() start() start() turn() stop()
  22. 22. 以上を踏まえて、いよいよ今回の一番の メインディッシュを
  23. 23. 白板で説明したネタのメモです <Comedian> <Writer> uses performance() write() Publisher main() 99 Mr.Mperformance() performance() uses Mr.K write() Hall produce() write() main()
  24. 24. 白板で説明したネタのメモですインタフェース利用時インタフェース利用時 インタフェース非 インタフェース非利用時
  25. 25. 「インタフェース」のポイント●インタフェースについては理解できましたか?●ココでも「シンプル」「疎結合」という単語が出てきました●継承と比較してどういう違いがあるでしょうか?●「暗黙の期待」についてはどうでしょうか?⇒ 以上を踏まえて、「デザインパターン」に進みたいんですが、   その前に「例外」についてのお話を少々。  一つだけ。「抽象クラス」は、まだ登場していませんがそれを利用すれば  何が嬉しいのでしょうか?(彼はどんな場面で活躍できるのでしょうか?)
  26. 26. 例外について(階層構造)Object Throwable Error 非チェック例外 Exception RuntimeException チェック例外 その他 その他のException (参考)「Java言語プログラミングレッスン 下巻」(結城浩著)
  27. 27. 例外について(処理方法)●「try~catch」して処理する●「throws」で呼び出し元に処理を任せる 例外は例外発生時のみの処理とする のみの処理⇒ いずれにせよ「例外は例外発生時のみの処理とする」のが重要!   ∵例外発生時以外の処理を含めると、「ホントに例外か?」という状況に。。。    (そもそも「例外」なんて無いに越したことは無い)    「例外による脱出口が沢山ある」=「メソッドからの返り値が複数ある」    という事に繋がりかねず、設計が複雑になってしまう(シンプルさ、重要!)   (個人的経験としては「例外」についてのポリシーがイケてないシステムは、    大概その他もイケてないので要注意!) (参考)「Java言語プログラミングレッスン 下巻」      「達人プログラマー」「Javaの格言」
  28. 28. 白板で説明したネタのメモです「はがき」を書くためのクラスを作ってみる はがき」 くためのクラスを クラス抽象化する

×