Your SlideShare is downloading. ×

Java基礎勉強会

514

Published on

同期(新人)にJavaの基礎を講義した際の資料。 …

同期(新人)にJavaの基礎を講義した際の資料。
基本事項として
クラス/メソッド/オブジェクト/参照型/継承/オーバーライド/委譲/ポリモフィズム
の説明。
応用として、基本事項を用いたStrategyパターン、Compositeパターンの説明


=====
(僕も初心者なので変なところがあるかもしれません。優しく指摘ください。)

Published in: Engineering
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
514
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. やさしい 末澤裕希 1
  • 2. 流れ •Javaのおさらい •応用してみよう 2
  • 3. はじめに Javaの基本を理解していなければ、いつまでも Javaを書けるようにはならない! 【目的】 基本事項を新人全員が理解! 3
  • 4. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 4
  • 5. よくわかんない... 5
  • 6. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 6
  • 7. 1 2 package study; 3 4 public class TestClass { 5 6 public static void main(String[] args) { 8 System.out.println("Hello! World!"); 9 } 10 11 } 12 Javaのおさらい 7
  • 8. 1 2 package study; 3 4 public class TestClass { 5 6 public static void main(String[] args) { 8 System.out.println("Hello! World!"); 9 } 10 11 } 12 Javaのおさらい クラス 8
  • 9. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 5 public void sing(){ 6 System.out.println("コケコッコー!"); 7 } 8 } 9 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 クラス クラス 9
  • 10. Javaのおさらい Person mainメ ソッド Chicken sing() Duck sing() Bird sing() クラス クラス クラス クラス 10
  • 11. クラスとは プログラムの設計図 ここに色んな処理を書きます Javaのおさらい とりあえず 11
  • 12. Javaのきほん1 すべて クラスで出来ている Javaのおさらい 12
  • 13. Javaのきほん1 すべて クラスで出来ている Javaのおさらい すべてって..? 13
  • 14. Javaのきほん1 17 public final class String 18 implements java.io.Serializable, Comparable<String>, CharSequence 19 { 20 private final char value[]; 21 private final int offset; 22 private final int count; 23 private int hash; // Default to 0 25 26 public String(String original) { 27 int size = original.count; 28 char[] originalValue = original.value; 29 char[] v; 30 if (originalValue.length > size) { 31 int off = original.offset; Javaのおさらい すべてって..? Stringのクラス 14
  • 15. Javaのおさらい Java API仕様 http://docs.oracle.com/javase/jp/6/api/ すべてって..? 15
  • 16. Javaには最初からたくさん のクラスが付いてくる Javaのおさらい 16
  • 17. Javaには最初からたくさん のクラスが付いてくる だから Javaのおさらい 17
  • 18. Javaには最初からたくさん のクラスが付いてくる だから たくさんの機能を最初から 使える Javaのおさらい 18
  • 19. 拡張性が高い! Javaのおさらい 19
  • 20. 拡張性が高い! Javaのおさらい データベースに接続できる インターネットにも接続できる 人の作ったクラスを再利用できる 20
  • 21. ? 21
  • 22. Javaのおさらい とりあえず、ここではクラスの中に プログラムを書いていくことだけ 理解してください 22
  • 23. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 23
  • 24. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 5 public void sing(){ 6 System.out.println("コケコッコー!"); 7 } 8 } 9 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 24
  • 25. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 5 public void sing(){ 6 System.out.println("コケコッコー!"); 7 } 8 } 9 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 メソッド メソッド Javaを実行すると、 まずmainメソッドが 呼ばれるよ 25
  • 26. Javaのきほん2 メソッドには 戻り値がある Javaのおさらい 26
  • 27. Javaのきほん2 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 27
  • 28. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 5 public void sing(){ 6 System.out.println("コケコッコー!"); 7 } 8 } 9 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 メソッド名 戻り値 28
  • 29. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 29
  • 30. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 30
  • 31. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 文字列を付けて 呼び出してね! 31
  • 32. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } sを返すよ! 32
  • 33. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } sをリターンしよう... Stringを返すよ! 33
  • 34. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); OK! Stringが返ってくるから、 Stringに代入されるようにします 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 34
  • 35. 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 35
  • 36. キャッチボール Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); strには コケコッコー!!! が入る 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 36
  • 37. 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if (feeling.equals("元気")){ 7 String s = "コケコッコー!!!"; 8 return s; 9 } 10 return feeling; 11 } 12 } 実は Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); これもメソッド。 sing()と同じ。 Stringクラスの中に書かれています 37
  • 38. クラスとメソッドを つくってみよう Javaのおさらい 実習 38
  • 39. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 39
  • 40. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } クラスの中身 40
  • 41. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } クラスの中身 41
  • 42. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 そういえばこれっ て何してんの? 42
  • 43. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10Stringと書いてたのと 同じ。「型」。 (データの形式) Checkenインスタンス を作ります宣言 43
  • 44. メモリの中 Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 スタック領域 int a = 2 int b = 3 ヒープ領域 Checkenインスタンス を作ります宣言 1:Chickenインスタンス 44
  • 45. あれ? オブジェクトと インスタンスって? Javaのおさらい 45
  • 46. だいたい同じ とりあえず今は インスタンス=オブジェクト で覚える Javaのおさらい 46
  • 47. メモリの中 Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 スタック領域 int a = 2 int b = 3 ヒープ領域 Checkenインスタンス を作ります宣言 1:Chickenインスタンス オブジェクトが できる! 47
  • 48. メモリの中 Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 スタック領域 int a = 2 int b = 3 Chicken cはヒープ領 域の1番 ヒープ領域 1:Chickenインスタンス Chicken型の変数c 48
  • 49. クラスとは オブジェクトの設計図 Javaのおさらい 本当は 49
  • 50. メモリの中 Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 c.sing(); 8 } 9 } 10 スタック領域 int a = 2 int b = 3 Chicken cはヒープ領 域の1番 ヒープ領域 1:Chickenインスタンス Chicken型の変数c 参照 50
  • 51. 参照ってなんだよ 51
  • 52. オブジェクトは、参照型と呼ばれます Javaのおさらい スタック領域 Chicken cはヒープ領域の1番 Dubk dはヒープ領域の2番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス 2:Duckインスタンス 注:本当は番号ではなくて メモリのアドレスが書かれています 52
  • 53. なんでこんなことするの? Javaのおさらい 53
  • 54. 同じインスタンスを色んな変数が参照するから Javaのおさらい スタック領域 Chicken aはヒープ領域の1番 Chicken bはヒープ領域の1番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス 54
  • 55. Javaはオブジェクトの受け渡しを色んなところでする Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if feeling.equals("元気"){ 7 String s = "コケコッコー!!!" 8 return s 9 } 10 } 11 } 55
  • 56. Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if feeling.equals("元気"){ 7 String s = "コケコッコー!!!" 8 return s 9 } 10 } 11 } スタック領域 CheckenクラスのString feeling はヒープ領域の1番です ChickenクラスのString sはヒー プ領域の2番です PersonクラスのString strはヒー プ領域の2番です ヒープ領域 1: 元気 2: コケコッコー!!! 56
  • 57. Javaのおさらい 1 Chicken c = new Chicken(); 2 String str = c.sing(“元気”); 3 public class Chicken { 4 5 public String sing(String feeling){ 6 if feeling.equals("元気"){ 7 String s = "コケコッコー!!!" 8 return s 9 } 10 } 11 } スタック領域 CheckenクラスのString feeling はヒープ領域の1番です ChickenクラスのString sはヒー プ領域の2番です PersonクラスのString strはヒー プ領域の2番です ヒープ領域 1: 元気 2: コケコッコー!!! 複数の変数に参照されている 57
  • 58. もし参照型でないと... Javaのおさらい スタック領域 Chicken a = Checkenインスタンス1 Checken b =Checkenインスタンス1 Checken c =Checkenインスタンス1 めちゃくちゃメモリを食う! 58
  • 59. もし参照型でないと... Javaのおさらい スタック領域 Chicken a = Checkenインスタンス1 Checken b =Checkenインスタンス1 Checken c =Checkenインスタンス1 めちゃくちゃメモリを食う! + スタック領域 Chicken a = Checkenインスタンス1 Checken b = Checkenインスタンス1 Checken c = Checkenインスタンス1 Checkenインスタンス1の変更しよっ と♪ Checkenインスタンス1全てを変更 しなければならない 59
  • 60. 参照型だと... Javaのおさらい スタック領域 Chicken aはヒープ領域の1番 Chicken bはヒープ領域の1番 Chicken cはヒープ領域の1番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス Checkenインスタンス1の変更しよっ と♪ メモリ食わない+変更が容易 60
  • 61. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 Chicken c2; //Chicken型の新しい変数を定義 8 c2 = c; 9 10 c2.weight = 30; 11 System.out.println(c.weight); 12 } 13 } 61
  • 62. Javaのおさらい 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 Chicken c2; //Chicken型の新しい変数を定義 8 c2 = c; 9 10 c2.weight = 30; 11 System.out.println(c.weight); 12 } 13 } スタック領域 Chicken cはヒープ領域の1番 Chicken c2 = 参照なし ヒープ領域 1:Chickenインスタンス スタック領域 Chicken cはヒープ領域の1番 Chicken c2はヒープ領域の1番 新しいインスタンスを作成するので はなく、参照が渡された!! (c2にはcの持つ参照がそのまま渡さ れました)1 2 62
  • 63. Javaのおさらい 1 package study; 2 3 public class Chicken { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッ コー!"); 9 } 10 } クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 Chicken c2; //Chicken型の新しい変数を定義 8 c2 = c; 9 10 c2.weight = 30; 11 System.out.println(c.weight); 12 } 13 } 30 63
  • 64. Javaのおさらい 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 Chicken c2; //Chicken型の新しい変数を定義 8 c2 = c; 9 10 c2.weight = 30; 11 System.out.println(c.weight); 12 } 13 } ヒープ領域 1:Chickenインスタンス スタック領域 Chicken cはヒープ領域の1番 Chicken c2はヒープ領域の1番 1番目のChickenインスタンスの情 報を変更している 結局中身一緒! cとc2両方の weightの情報が 書き換わった! 64
  • 65. 新しいインスタンスが出来るのは、        new ∼() したときだけ! Javaのおさらい ヒープ領域 1:Chickenインスタンス スタック領域 Chicken aはヒープ領域の1番 Chicken a2はヒープ領域の2番 2:Chickenインスタンス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken a = new Chicken(); 7 Chicken a2 = new Chicken(); 8 } 9 } 65
  • 66. 参照型の動きを みてみよう Javaのおさらい 実習 66
  • 67. 参考  オブジェクトではないもの Javaのおさらい byte short int long char float double boolean こいつらだけです Javaではクラス名の最初を大文字にする 慣習があるよ! Stringの最初も大文字でしょ オブジェクトはみんな大文字ではじまるよ 67
  • 68. Javaのきほん3 オブジェクトは 参照型 Javaのおさらい 68
  • 69. Javaのきほん3 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 69
  • 70. クラス・メソッド インスタンス・オブジェクト Javaのおさらい いままでで分かったこと 70
  • 71. クラス・メソッド インスタンス・オブジェクト Javaのおさらい いままでで分かったこと 70% 71
  • 72. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 70% あとは継承と多様性が分かれ ば基本は終了です 72
  • 73. ほんと!? 73
  • 74. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 74
  • 75. 継承ってなに? Javaのおさらい 75
  • 76. 継承ってなに? 別のクラスをコピペして、 新しいクラスを作る方法 Javaのおさらい とりあえず 76
  • 77. Javaのおさらい え? 77
  • 78. Javaのおさらい 1 package study; 2 3 public class Chicken extends Bird { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 1.Birdクラスを作る 78
  • 79. Javaのおさらい 1 package study; 2 3 public class Chicken extends Bird { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 1.Birdクラスを作る 2.Birdクラスを継承する 79
  • 80. Javaのおさらい 1 package study; 2 3 public class Chicken extends Bird { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 1.Birdクラスを作る (fly()メソッドを持つ) 2.Birdクラスを継承する (Chickenにはfly()メソッドはない) Personクラス Chicken c = new Chicken(); c.fly(); 3.Chickenクラスのfly()メ ソッドを呼び出す 80
  • 81. Javaのおさらい 1 package study; 2 3 public class Chicken extends Bird { 4 // メンバ変数 5 int weight = 5 6 // メソッド 7 public void sing(){ 8 System.out.println("コケコッコー!"); 9 } 10 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 1.Birdクラスを作る 2.Birdクラスを継承する Personクラス Chicken c = new Chicken(); c.fly(); 3.Chickenクラスのfly()メ ソッドを呼び出す 飛んでます! 出力 81
  • 82. Javaのきほん3 継承させると コピークラスが出来る Javaのおさらい 82
  • 83. とりあえず 継承させてみよう Javaのおさらい 実習 83
  • 84. Javaのおさらい なるほど 84
  • 85. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 次にかもクラスを作ります 85
  • 86. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } 次にかもクラスを作ります かもは飛べないので、fly() に 飛べません と出力させたい 86
  • 87. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } かもは飛べないので、fly() に 飛べません と出力させたい 同じメソッド名だ! 87
  • 88. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } さてどうなる? Personクラス Duck d = new Duck(); d.fly(); 88
  • 89. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } さてどうなる? Personクラス Duck d = new Duck(); d.fly(); 飛べません! 出力 89
  • 90. オーバーライドの話 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } サブクラスが優先される Personクラス Duck d = new Duck(); d.fly(); 飛べません! 90
  • 91. Javaのおさらい Duck fly() 飛べません! Bird fly() 飛んでます! 継承 同じメソッドがあったら、 サブクラスを優先します オーバーライド! 91
  • 92. Javaのおさらい サブクラス スーパークラス fly() 飛んでます! うるさい! 私は飛べません 継承 fly() うるさい! 私は飛べません オーバーライド! 92
  • 93. Javaのきほん4 親クラスと別のことがしたかったら、 オーバーライド Javaのおさらい 93
  • 94. Javaのきほん4 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 94
  • 95. 継承の良いところ クラスをコピーして、 一部だけ書き換えられる! つまり 元のプログラムを再利用できる! Javaのおさらい 95
  • 96. 注意点 Javaのおさらい void fly() 飛んでます! void fly() 飛べません! オーバーライド! サブクラスが優先される戻り値と引数は合わせる fly(String s)はダメ! 注:実は、戻り値のクラスのサブクラスを指定 するのは大丈夫... 例:スーパークラス Bird method() サブクラス Duck method() 96
  • 97. 余談 Javaのおさらい 実は全てのクラスは、 Objectクラスを継承して います Bird fly() 飛んでます! 継承 java.lang.Object clone() equals() finalize() ..... 97
  • 98. 余談 Javaのおさらい Bird fly() 飛んでます! 継承 java.lang.Object clone() equals() finalize() ..... オブジェクトクラス Java API http://docs.oracle.com/javase/jp/6/api/java/lang/Object.html 98
  • 99. 余談 Javaのおさらい Bird fly() 飛んでます! 継承 java.lang.Object clone() equals() finalize() ..... オブジェクトクラス Java API http://docs.oracle.com/javase/jp/6/api/java/lang/Object.html toString()をオーバーライド してみよう! 99
  • 100. 余談 Javaのおさらい 1 package study; 2 3 public class Duck { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } Personクラス Duck d = new Duck(); System.out.println(d); toString()を オーバーライドしていない状態 でDuckオブジェクトを出力 100
  • 101. 余談 Javaのおさらい 1 package study; 2 3 public class Duck extends Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 } 1 package study; 2 3 public class Bird { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛んでます!"); 7 } 8 } Personクラス Duck d = new Duck(); System.out.println(d); オーバーライドしていない 状態で出力 study.Chicken@35a8767 出力 ( @以降はクラスによって変わるよ ) 101
  • 102. 余談 Javaのおさらい 1 package study; 2 3 public class Duck { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 public String toString(){ return “Duckオブジェクトです” } 8 } Personクラス Duck d = new Duck(); System.out.println(d); toString()を オーバーライドしてDuck オブジェクトを出力 オーバーライド! Objectクラス 102
  • 103. 余談 Javaのおさらい 1 package study; 2 3 public class Duck { 4 // メソッド 5 public void fly(){ 6 System.out.println("飛べません!"); 7 } 8 public String toString(){ return “Duckオブジェクトです” } 8 } Personクラス Duck d = new Duck(); System.out.println(d); toString()を オーバーライドして出力 オーバーライド! Objectクラス Duckオブジェクトです 出力 103
  • 104. 余談 実はprintln(オブジェクト)を実行したら... toString()メソッドで返ってきた文字列を 返します! Javaのおさらい 104
  • 105. 余談 Javaのおさらい study.Chicken@35a8767 出力 Duckオブジェクトです 出力 オーバーライド後は Duckクラスの toString()が呼ばれます オーバーライド前は Objectクラスの toString()が呼ばれます ObjectクラスのtoString メソッドは変なの返すね 継承 105
  • 106. 余談 Javaはクラスで成り立っている! クラスの振る舞いは、Systemクラス (System.out.println()メソッドのクラス) であっても、同じ! Javaのおさらい クラスだから最初大文字 106
  • 107. 余談 いままでの知識を応用すれば、       Javaはほとんど理解できる! Javaのおさらい 107
  • 108. 余談2 またまた余談 Javaのおさらい 108
  • 109. 余談2 じつは僕らは、知らないうちに     多くのクラスを利用していました Javaのおさらい 文字列作れる 画面出力できる だけでなく.... データベースを読める サイトを作れる 全部クラスで実現 109
  • 110. 余談2 ・データベース(JDBC) Javaのおさらい こんなの書いたよね 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); 110
  • 111. 余談2 ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成 スタック領域 Context contextはヒープの1 ヒープ領域 1:InitialContextインスタンス イメージ図 111
  • 112. 余談2 ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成(Context クラスがnew DataSource() を裏でして くれるイメージ) オブジェクト生成(Context クラスがnew DataSource() を裏でして くれるイメージ) スタック領域 Context contextはヒープの1 DataSource dsはヒープの2 ヒープ領域 1:InitialContextインスタンス 2:DataSourceインスタンス イメージ図 112
  • 113. 余談2 ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成 (DataSourceクラスがnew Connection() を裏でして くれるイメージ) 113
  • 114. 余談2 ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成 (Stringの場合のみ これでオブジェクトが作ら れる) 114
  • 115. 余談2 ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 PreparedStatement stmt = con.prepareStatemant(sql); クラス オブジェクト生成 (Connectionクラスの中でnew PreparedStatement()をして くれるイメージ) 115
  • 116. Javaのおさらい DB利用クラス mainメソッ ド DataSource Connection Context オブジェクトキャッチボール String PreparedStatement オブジェクトを作ってはオブジェクトを渡しあう 116
  • 117. 余談2 Javaはオブジェクトの渡し合いで           プログラムを行う オブジェクトを投げたら、 オブジェクトが返ってくる! 参考:メソッドの説明 Javaのおさらい 117
  • 118. 余談2 どんなオブジェクトを投げたら、 どんなオブジェクトが戻ってくるか? それさえ知っていれば、実際の処理のことは知らなくても使える (カプセル化) データベース接続のことを知らなくても、 接続するためのクラスを使ってましたよね? Javaのおさらい 118
  • 119. 余談2 複数人でプログラムするときも楽ちん Javaのおさらい 私はDuckオブジェクトを受け取ったら、 好きな食べ物を返すメソッドを作ります 私は食べ物クラスを作ります 相手の処理の中身は考えなくてもよい 119
  • 120. 余談2 修正も楽! Javaのおさらい メソッドにバグがありました そうですか。 ただ、私には関係ありません。 うまく受け渡しが出来るように直しておいて下さい 受け渡しでしか相手のクラスと関わらない。 渡すときと受けるときの形式だけ決めておけばよい。 相手のクラスのバグは、相手だけの責任 120
  • 121. Javaのきほん5 手続き型:処理を中心に考える オブジェクト指向: オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 Javaのおさらい 121
  • 122. Javaのきほん5 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 122
  • 123. クラス・メソッド インスタンス・オブジェクト 継承 Javaのおさらい いままでで分かったこと 90% 123
  • 124. 多様性について Javaのおさらい 次で最後 90% 124
  • 125. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 125
  • 126. Javaのおさらい 委譲やってなくない? 126
  • 127. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 応用でやります 127
  • 128. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 最後の難関 多様性 (ポリモフィズム) 128
  • 129. 「型」の話 Javaのおさらい 129
  • 130. 「型」の話 intとStringは中身が全然違う! intは足し算できる。けど、Stringは足し算できない。 Javaのおさらい 130
  • 131. 「型」の話 intとStringは中身が全然違う! intは足し算できる。けど、Stringは足し算できない。 PersonクラスとDuckクラスも全然中身が違う!                      だから Javaのおさらい 131
  • 132. 「型」の話 変数には型が必要 型によって中身が何か、特定します Javaのおさらい 132
  • 133. Javaのおさらい クラス 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Chicken c = new Chicken(); 7 Chicken c2; //Chicken型の新しい変数を定義 8 c2 = c; 9 10 c2.weight = 30; 11 System.out.println(c.weight); 12 } 13 } 型 Chicken型に、Chickenインスタンス(の参照) をぶちこむ! 133
  • 134. 「型」の話 次に変なことをします Javaのおさらい 134
  • 135. 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Bird b = new Duck(); 7 b.fly(); 8 } 9 } Javaのおさらい 型 インスタンス 135
  • 136. 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Bird b = new Duck(); 7 b.fly(); 8 } 9 } Javaのおさらい 型 インスタンス スタック領域 Bird bはヒープ領域の1番目 ヒープ領域 1: Duckインスタンス 136
  • 137. Javaのおさらい ? 137
  • 138. ヒープ領域 「型」の話 スーパークラスの型に、サブクラスのインスタンス (の参照)を入れられます Javaのおさらい スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス Duck fly() sleep() Bird fly() 継承 138
  • 139. ヒープ領域 注意点 「型」の話 スーパークラスの型を使った場合、 スーパークラスに存在しているメソッド・変数 しか呼び出せません Javaのおさらい スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス Duck fly() sleep() Bird fly() 継承 139
  • 140. 注意点 「型」の話 スーパークラスの型を使った場合、 スーパークラスに存在しているメソッド・変数 しか呼び出せません Javaのおさらい Duck fly() sleep() Bird fly() 継承 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Bird b = new Duck(); 7 b.sleep(); 8 } 9 } エラー 140
  • 141. Javaのおさらい fly()はどちらにも存在するよね。 fly()はどういう動作をするの? Duck fly() sleep() Bird fly() 継承 141
  • 142. 注意点 「型」の話 オーバーライドされている場合は、 Duckのfly()が実行されます Javaのおさらい Duck fly() sleep() Bird fly() 継承 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Bird b = new Duck(); 7 b.fly(); 8 } 9 }  Birdクラス public void fly(){ System.out.println( 飛びました ); }  Duckクラス public void fly(){ System.out.println( 飛べません ); } 142
  • 143. 注意点 「型」の話 オーバーライドされている場合は、 Duckのfly()が実行されます Javaのおさらい Duck fly() sleep() Bird fly() 継承 1 package study; 2 3 public class Person { 4 public static void main(String[] args) { 5 6 Bird b = new Duck(); 7 b.fly(); 8 } 9 }  Birdクラス public void fly(){ System.out.println( 飛びました ); }  Duckクラス public void fly(){ System.out.println( 飛べません ); } 飛べません 出力 143
  • 144. 多様性まとめ スーパークラスの型に サブクラスのインスタンス(の参照) をいれたとき サブクラスの動作が優先される Javaのおさらい ヒープ領域スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス だってインスタンス(実体)は Duckだもん 144
  • 145. 多様性を 体験してみよう Javaのおさらい 実習 145
  • 146. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 これです 146
  • 147. クラス・メソッド インスタンス・オブジェクト 継承・多様性(ポリモフィズム) Javaのおさらい いままでで分かったこと 100% おめでとう! 147
  • 148. これでJavaの基本はおしまいです Javaのおさらい 100% 148
  • 149. Javaのおさらい 納得いかない。 多様性って何が便利なの? 149
  • 150. ウソをついていました ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成 (DataSourceクラスがnew Connection() を裏でして くれるイメージ) これ、裏でnew Connection()はやっていませ ん 150
  • 151. ウソをついていました ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); クラス オブジェクト生成 (DataSourceクラスがnew Connection() を裏でして くれるイメージ) これ、裏でnew Connection()はやっていませ ん 実はConnectionを継承(実装)した クラスのインスタンスを作ってました 151
  • 152. データベース Javaのおさらい Postgre SQL MySQL Oracle 色んな製品があります 使い方はそれぞれ違います 152
  • 153. だけど、Javaでの使い方は 全て同じです ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); どの製品の接続・利用クラスも DataSourseだったりConnection だったりを継承(実装)しています 製品によって、それぞれ接続・ 利用クラスが提供されています ここで使う製品を決めていま す 153
  • 154. だけど、Javaでの使い方は 全て同じです ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); 製品によって、それぞれ接続・ 利用クラスが提供されています 指定した製品用のインスタンスを newしてくれるメソッドです 154
  • 155. だけど、Javaでの使い方は 全て同じです ・データベース Javaのおさらい 1 Context context=new InitialContext(); 2 DataSource ds = (DataSource)context.lookup("java:comp/env/ jdbc/***"); 3 Connection con = ds.getConnection(); 4 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); 製品によって、それぞれ接続・ 利用クラスが提供されています MySQLConnecttion Connection OracleConnection PostgreSQLConnectionヒープ領域スタック領域 Connection conは ヒープ領域の1番目 1: OracleConnection インスタンス 155
  • 156. 実際の実装をみてみよう (Connectionインターフェース) Javaのおさらい 1 package java.sql; 2 import java.util.Properties; 3 public interface Connection extends Wrapper { 4 Statement createStatement() throws SQLException; 5 PreparedStatement prepareStatement(String sql) throws SQLException; 6 CallableStatement prepareCall(String sql) throws SQLException; 7 String nativeSQL(String sql) throws SQLException; MySQLConnecttion Connection OracleConnection PostgreSQLConnectio n classじゃない!interfaceだ! 156
  • 157. 実際の実装をみてみよう (Connectionインターフェース) Javaのおさらい 1 package java.sql; 2 import java.util.Properties; 3 public interface Connection extends Wrapper { 4 Statement createStatement() throws SQLException; 5 PreparedStatement prepareStatement(String sql) throws SQLException; 6 CallableStatement prepareCall(String sql) throws SQLException; 7 String nativeSQL(String sql) throws SQLException; MySQLConnecttion Connection OracleConnection PostgreSQLConnectio n あ!PreparedStatementだ! 3 Connection con = ds.getConnection(); 5 String sql = "SELECT * FROM TEST"; 6 stmt = con.prepareStatemant(sql); 継承したクラスの機能を ポリモフィズムで使ってたんだなあ 157
  • 158. インターフェースとは メソッドの中身が 記載されていないクラス Javaのおさらい 1 package java.sql; 2 import java.util.Properties; 3 public interface Connection extends Wrapper { 4 Statement createStatement() throws SQLException; 5 PreparedStatement prepareStatement(String sql) throws SQLException; 6 CallableStatement prepareCall(String sql) throws SQLException; 7 String nativeSQL(String sql) throws SQLException; 158
  • 159. インターフェースとは メソッドの名前・戻り値は記載されている これを継承(実装)したクラスは、 絶対にインターフェースに存在するメソッ ドをオーバーライドしなければならない Javaのおさらい インターフェースを「継承」する ことを実装と呼ぶよ 159
  • 160. インターフェースとは 何が便利なの? 実装するクラスには、 メソッドの名前と戻り値、 つまり、必要な機能(オブジェクトの受け渡し) を強制できる Javaのおさらい 160
  • 161. インターフェースとは インターフェースを実装しているサブクラスは、インターフェースに書かれている メソッドを全てオーバーライドしなければならない Javaのおさらい MySQLConnecttion Connection インターフェース OracleConnection PostgreSQLConnection 161
  • 162. インターフェースとは インターフェースを実装しているサブクラスは、インターフェースに書かれている メソッドを全てオーバーライドしなければならない だから、Connectionインターフェースのことだけ 知っていれば、具体的なクラスの裏の処理の ことは知らなくても、使い方が分かる! 今まで使ったことのない製品も 同じ方法で使える! Javaのおさらい MySQLConnecttion Connection インターフェース OracleConnection PostgreSQLConnection 162
  • 163. ポリモフィズムの利点 オブジェクトの受け渡し方法が 同じだから、全部使い方は同じ! 意識しないで、サブクラスを利用できる! Javaのおさらい 163
  • 164. ポリモフィズムの利点 もしデータベース製品を変更しても プログラムの修正箇所はなし! ↓ オブジェクトの受け渡しだけ意識していればよい 相手の処理は関係ない Javaのおさらい 164
  • 165. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 これです 165
  • 166. クラス・メソッド インスタンス・オブジェクト 継承・多様性(ポリモフィズム) Javaのおさらい 本当に完了! 100% おめでとう! 166
  • 167. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 167
  • 168. 流れ •Javaのおさらい •応用してみよう 168
  • 169. 応用してみよう •Strategyパターン •Compositeパターン 169
  • 170. パターンって? 色んな人が、 問題解決したときに使った方法 みんな同じようなことを 考え出すんだね 170
  • 171. 今回は、パターンの 本質的な部分を 簡略的に紹介します 171
  • 172. Strategyパターン 172
  • 173. Strategy(戦略)パターン 変動しやすい部分を分離 173
  • 174. Strategy(戦略)パターン 変動しやすい部分を分離 どういうこと? 174
  • 175. Strategy(戦略)パターン RPGの話 職業: 剣士, 山賊, 騎士... 武器: 普通の剣, 勇者の剣, 錆びた剣... 175
  • 176. Strategy(戦略)パターン 1.剣士を実装する 今回は戦うだけのRPGです 176
  • 177. Strategy(戦略)パターン 1.剣士を実装する 剣士 fight(); 177
  • 178. Strategy(戦略)パターン 1.剣士を実装する 2.武器を実装する 剣士 fight(); 普通の剣,勇者の剣, 錆びた剣 例:勇者の剣を振りかざした! 178
  • 179. Strategy(戦略)パターン 1.剣士を実装する 2.武器を実装する 剣士 fight(); 普通の剣,勇者の剣, 錆びた剣 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 継承 オーバーライド 179
  • 180. Strategy(戦略)パターン あれ、 武器の数が100だとしたら? 180
  • 181. Strategy(戦略)パターン 剣士がたくさん 剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 181
  • 182. Strategy(戦略)パターン 騎士と山賊も剣を使えたら? 182
  • 183. 剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); Strategy(戦略)パターン 大量のクラスが...... 山賊 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 騎士 fight(); 士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 (); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 t(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ剣士 ght(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ山賊 ght(); 勇者の剣を持つ騎士 fight(); 錆びた剣を持つ騎士 fight(); 183
  • 184. 剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); Strategy(戦略)パターン 職業の数 アイテムだけ クラスが必要 山賊 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 騎士 fight(); 士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 (); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 t(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ剣士 ght(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ山賊 ght(); 勇者の剣を持つ騎士 fight(); 錆びた剣を持つ騎士 fight(); 184
  • 185. Strategy(戦略)パターン さて、 アップデートで職業クラスに 逃げる機能を付けることになりました 錆びた剣を持つ騎士 fight(); run(); 錆びた剣を持った剣士は 逃げ出した! 185
  • 186. 剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); Strategy(戦略)パターン 対応したい人いますか 山賊 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 騎士 fight(); 士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 (); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 t(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ剣士 ght(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ山賊 ght(); 勇者の剣を持つ騎士 fight(); 錆びた剣を持つ騎士 fight(); 186
  • 187. 剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); Strategy(戦略)パターン 対応したい人いますか 山賊 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 騎士 fight(); 士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣士 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); つ剣士 ); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 (); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 持つ剣士 t(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); を持つ剣士 ht(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ剣士 ght(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 剣を持つ山賊 ght(); 勇者の剣を持つ騎士 fight(); 錆びた剣を持つ騎士 fight(); いやです 187
  • 188. Strategyパターン ここで登場! 188
  • 189. Strategy(戦略)パターン Arms インターフェース useArms(); 1.武器インターフェースを 作成! 189
  • 190. Strategy(戦略)パターン 剣士 fight(); Arms型のarm変数 Arms インターフェース useArms(); 2.剣士にAmrs型の変数を 持たせます 190
  • 191. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } Arms型のarm変数 Arms インターフェース useArms(); 3.fight()メソッドの中で arm変数のuseArms() メソッドを実行します 191
  • 192. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 Arms インターフェース useArms(); 3.arm変数に武器オブジェクトを 格納するためのメソッドを準備 192
  • 193. Strategy(戦略)パターン Arms インターフェース useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 普通の剣を 使いました! 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 5.具体的な武器クラスを 実装します 継承 193
  • 194. Strategy(戦略)パターン 完成! Arms インターフェース useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 継承 194
  • 195. 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 継承 195
  • 196. 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 剣士オブジェクトを作る 継承 196
  • 197. 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 剣士型の変数sに、 剣士オブジェクトの参照を代入 継承 197
  • 198. 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の (武器クラスを継承した)普通の剣 オブジェクト生成 継承 198
  • 199. 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 武器型の変数armに、 普通の剣オブジェクト参照代入 継承 199
  • 200. 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 剣士オブジェクトの持つ変数armに普通の剣オブジェクトの参照を代入 継承 普通の剣 useArms(); 200
  • 201. 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の 剣士オブジェクトのfightメソッドを 実行! 継承 普通の剣 useArms(); 201
  • 202. 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の armは普通の剣の参照を持っている!! 継承 普通の剣 useArms(); 参照 202
  • 203. 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の armは普通の剣の参照を持っている!! 継承 普通の剣 useArms(); 参照 普通の剣を 使いました! と表示するメソッド 203
  • 204. 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 使い方 Strategy(戦略)パターン 1 public class Player{ 2 public static void main(String[] args){ 3 Swordsman s = new Swordsman(); 4 Arms arm = new NormalSword(); 5 s.setArms(arm); 6 s.fight(); 7 } 8 } Arms useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useAr ms(); } Arms型の armは普通の剣の参照を持っている!! 継承 普通の剣 useArms(); 参照 普通の剣を 使いました! と表示するメソッド 普通の剣を使いました! 出力 204
  • 205. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 騎士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 山賊 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 必要なクラスは、 職業の数+アイテムだけ! 205
  • 206. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 騎士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 山賊 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 必要なクラスは、 職業の数+アイテムだけ!多様性(ポリモフィズム)を利用 同じ型だけど振る舞いが変わる (どの武器も同じように扱える!) arm(Arms型)に 普通の剣が入っていたら、 「普通の剣を使いました!」 勇者の剣が入っていたら、 「勇者の剣を使いました!」 と表示される 206
  • 207. Strategyパターン を実装してみよう 207
  • 208. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性実はStrategyパターンはこれでした 208
  • 209. Strategy(戦略)パターン 委譲 オブジェクトが、 他のオブジェクトに 振る舞いをまかせること= 209
  • 210. Strategy(戦略)パターン 委譲 オブジェクトが、 他のオブジェクトに 振る舞いをまかせること = 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 armは普通の剣の参照を持っている!! 普通の剣 useArms(); 参照 普通の剣を 使いました! と表示するメソッド 今回は、剣士オブジェクトが普通の剣 オブジェクトに振る舞いを まかせていました 210
  • 211. Strategy パターン Strategy(戦略)パターン 多様性(ポリモフィズム) すごいじゃん! 211
  • 212. 応用してみよう •Strategyパターン •Compositeパターン 212
  • 213. Compositeパターン 213
  • 214. Compositeパターン 今回の勉強の集大成! これが理解できたら、今回の勉強の目標は達成! 214
  • 215. Compositeパターン 会社の話 会社には、部署がある 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 215
  • 216. Compositeパターン 今回は、   オブジェクトでこの構造を実現 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 216
  • 217. ? 217
  • 218. Compositeパターン 実装しつつ進めましょう 218
  • 219. Compositeパターン 今回作るクラスとインターフェース add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 実装 219
  • 220. Compositeパターン 今回作るクラスとインターフェース add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 実装 mainメソッド MakeMemberList いつもの mainメソッドです 220
  • 221. Compositeパターン 1 public interface Component{ 2 void add(Component com); 3 void print(); 4 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 221
  • 222. Compositeパターン 1 public class Member implements component{ 2 String name; 3 4 public Member(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 } 10 11 public void print(){ 12 System.out.println(name); 13 } 14 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 222
  • 223. Compositeパターン 1 public class Member implements component{ 2 String name; 3 4 public Member(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 } 10 11 public void print(){ 12 System.out.println(name); 13 } 14 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member コンストラクタ 223
  • 224. Compositeパターン 1 public class Member implements component{ 2 String name; 3 4 public Member(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 } 10 11 public void print(){ 12 System.out.println(name); 13 } 14 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member コンストラクタ 実は... Component com = new Member(); これは、Member()コンストラクタを使って オブジェクトを生成するって意味なのです クラスに クラス名(引数)というコンストラクタ 書いておくと... 好きなコンストラクタを設定することができます 例: Member() Member(String s) Member(Component com)などなど... 224
  • 225. Compositeパターン 1 public class Member implements component{ 2 String name; 3 4 public Member(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 } 10 11 public void print(){ 12 System.out.println(name); 13 } 14 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member thisを付けるとメンバ変数 のnameを意味します こっちは引数のname 225
  • 226. Compositeパターン 1 public class Member implements component{ 2 String name; 3 4 public Member(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 } 10 11 public void print(){ 12 System.out.println(name); 13 } 14 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 226
  • 227. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 227
  • 228. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member ArrayListって? ArrayListは、簡単に言うと便利な配列です。 今の段階では、 add(Object o)メソッドを使うと配列にオブ ジェクトを追加できる get(int i)メソッドを使うと、格納した番号の オブジェクトを取得できるという機能だけ 理解してください 【補足】ArrayListなどのCollectionは、 ジェネリック型やIterator、拡張for文などなどの良い勉強になるよ なに言ってんの add( おはよう ) add( こんにちは ) add( こんばんは ) すると.. get(0)で おはよう get(1)で こんにちは get(2)で こんばんは が取り出せる 228
  • 229. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 229
  • 230. Compositeパターン       ここまでできました add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 実装 mainメソッド MakeMemberList 230
  • 231. Compositeパターン これでもう、この構造を実現できます 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 231
  • 232. Compositeパターン あとはmainメソッドを作るだけ add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member 実装 mainメソッド MakeMemberList 232
  • 233. Compositeパターン add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member mainメソッドでやること 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 これ1つ1つのオブジェクトを このクラスを使って作成します 233
  • 234. Compositeパターン add(Compon Component add(Compon Group add(Compon String name String name Member どのクラスで、それぞれのオブジェクトを作る? 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 234
  • 235. Compositeパターン 1 public class MakeMemberList{ 2 public static void main(String[] args){ 3 Component honbu = new Group("営業本部"); 4 5 Component honbuchou = new Member("中田本部長"); 6 Component fukuhoubuchou = new Member("高橋副本部長"); 7 Component ichibu = new Group("営業1部"); 8 Component nibu = new Group("営業2部"); 9 10 Component yoshinaga = new Member("吉永部長"); 11 Component tanaka = new Member("田中"); 12 Component suzuki = new Member("鈴木部長"); 13 Component nakajima = new Member("中島"); 14 } 15 } 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group とりあえずオブジェクトを 作ろう 1 235
  • 236. Compositeパターン 1 honbu.add(honbuchou); 2 honbu.add(fukuhoubuchou); 3 honbu.add(ichibu); 4 honbu.add(nibu); 5 6 ichibu.add(yoshinaga); 7 ichibu.add(tanaka); 8 9 nibu.add(suzuki); 10 nibu.add(nakajima); 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group Groupの中には、GroupもMember も格納できます (どっちもComponentインター フェースを実装しているから! Component型が使える!) 2 add(Component com) print() Group String name ArrayList list 236
  • 237. Compositeパターン 1 honbu.add(honbuchou); 2 honbu.add(fukuhoubuchou); 3 honbu.add(ichibu); 4 honbu.add(nibu); 5 6 ichibu.add(yoshinaga); 7 ichibu.add(tanaka); 8 9 nibu.add(suzuki); 10 nibu.add(nakajima); 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group Groupの中には、GroupもMember も格納できます (どっちもComponentインター フェースを実装しているから! Component型が使える!) 2 add(Component com) print() Group String name ArrayList list 本部にMemberとGroupオブジェクト格納 1部にMember格納 2部にMember格納 237
  • 238. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member add(Component com)メソッド を使うと、comを ArrayList(便利な配列) の中に格納します Groupクラス 238
  • 239. Compositeパターン    honbu.print(); 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group 本部オブジェクトのprint(); メソッドを実行します 3 add(Component com) print() Group String name ArrayList list 239
  • 240. Compositeパターン    honbu.print(); 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group 本部オブジェクトのprint(); メソッドを実行します 3 add(Component com) print() Group String name ArrayList list 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 営業2部 鈴木部長 中島 出力 240
  • 241. !!? なんで部署の名前と 全員の名前が表示されたの!? 241
  • 242. Compositeパターン    honbu.print(); 本部は、Groupクラスで作られました 営業1部 営業本 部 営業2部 中田 本部長 高橋 副本部 吉永 部長 田中 鈴木 部長 中島 Group Memeber Memeber Memeber Memeber Memeber Memeber Group Group 3 add(Component com) print() Group String name ArrayList list 242
  • 243. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } add(Component com) print() Component インターフェース add(Component com) print() Group add(Component com) print() String name ArrayList list String name Member まず最初に、自分のオブジェクト の名前を出力します Groupクラスのprintメソッドをみてみよう 243
  • 244. Compositeパターン 1 public class Group implements Component { 2 ArrayList list = new ArrayList(); 3 String name; 4 public Group(String name){ 5 this.name = name; 6 } 7 8 public void add(Component com){ 9 list.add(com); 10 } 11 12 public void print(){ 13 System.out.println("¥n" + name); 14 for(int i = 0; i < list.size(); i++){ 15 Component com = (Component)list.get(i); 16 com.print(); 17 } 18 } 19 } 次に、ArrayListに格納されているComponent型のオブジェクトを取り出し、取り出したオブジェクトの print()を実行します Groupクラスのprintメソッドをみてみよう for文で、格納されている全てのオブジェクト のprint()を実行してるよ 244
  • 245. 営業本部 出力 Compositeパターン add(Compon Component add(Compon Group add(Compon String name String name Member honbu.print() を実行したあとの動き 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber print()実行された! 名前を出力し、格納されている オブジェクトのprint()実行! 1 245
  • 246. 営業本部 中田本部長 出力 Compositeパターン add(Compon Component add(Compon Group add(Compon String name String name Member honbu.print() を実行したあとの動き 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber honbuオブジェクトによってprint()が 実行された! Memberなので名前出力だけ 1 2 246
  • 247. honbu.print() を実行したあとの動き 営業本部 中田本部長 高橋副本部長 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber honbuオブジェクトによってprint()が 実行された! Memberなので名前出力だけ 1 2 3 Compositeパターン 247
  • 248. honbu.print() を実行したあとの動き 営業本部 中田本部長 高橋副本部長 営業1部 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber honbuオブジェクトによってprint() が実行された! Groupなので名前出力のあと、格納されているオブジェクトのprint() 実行! 1 2 3 4 Compositeパターン 248
  • 249. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 ichibuオブジェクトによってprint()が 実行された! Memberなので名前出力だけ Compositeパターン 249
  • 250. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 ichibuオブジェクトによってprint()が 実行された! Memberなので名前出力だけ Compositeパターン 6 250
  • 251. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 営業2部 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 Compositeパターン 6 7 honbuオブジェクトによってprint() が実行された! Groupなので名前出力のあと、格納されているオブジェクトのprint() 実行! 251
  • 252. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 営業2部 鈴木部長 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 Compositeパターン 6 7 8 nibuオブジェクトによってprint()が実 行された! Memberなので名前出力だけ 252
  • 253. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 営業2部 鈴木部長 中島 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 Compositeパターン 6 7 8 nibuオブジェクトによってprint()が実 行された! Memberなので名前出力だけ 9 253
  • 254. 営業本部 中田本部長 高橋副本部長 営業1部 吉永部長 田中 営業2部 鈴木部長 中島 honbu.print() を実行したあとの動き 出力 add(Compon Component add(Compon Group add(Compon String name String name Member 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 Group Group GroupMemeber Memeber Memeber Memeber MemeberMemeber 1 2 3 4 5 Compositeパターン 6 7 8 9 出力完了!!!! 254
  • 255. Compositeパターン ほとんどクラスを作っていないのに、 柔軟な部署の構造を 持たせることが出来た これも多様性(ポリモフィズム) のおかげだね 255
  • 256. そして... Componentパターンを 理解することが出来たなら、 Javaの基本は理解できている! 256
  • 257. おつかれさまでした これでJavaの勉強会は終了です つかれたあ 257
  • 258. Javaのきほん 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 258
  • 259. 応用 Strategyパターン 変動する部分を切り離す Compositeパターン 容器と中身を同じように扱う 今回は部署を容器、中身をメンバーとして実装しました ど ち どちらも多様性(ポリモフィズム) を使うことによって実現 259
  • 260. 【補足】 今回やっていないけど 知っておいた方がいいこと 抽象クラス static アクセス修飾子 オーバーロード ぐぐってね! 260
  • 261. Javaまとめ オブジェクトの投げ合いで、 たくさんのことが実現できる 261
  • 262. Thank you! 262

×