やさしい
末澤裕希
1
流れ
•Javaのおさらい
•応用してみよう
2
はじめに
Javaの基本を理解していなければ、いつまでも
Javaを書けるようにはならない!
【目的】
基本事項を新人全員が理解!
3
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
4
よくわかんない...
5
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
6
1
2 package study;
3
4 public class TestClass {
5
6 public static void main(String[] args) {
8 System.out.println("Hello! ...
1
2 package study;
3
4 public class TestClass {
5
6 public static void main(String[] args) {
8 System.out.println("Hello! ...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4
5 public void sing(){
6 System.out.println("コケコッコー!");
7 }
8 }
9
1...
Javaのおさらい
Person
mainメ
ソッド
Chicken
sing()
Duck
sing()
Bird
sing()
クラス
クラス
クラス クラス
10
クラスとは
プログラムの設計図
ここに色んな処理を書きます
Javaのおさらい
とりあえず
11
Javaのきほん1
すべて
クラスで出来ている
Javaのおさらい
12
Javaのきほん1
すべて
クラスで出来ている
Javaのおさらい
すべてって..?
13
Javaのきほん1
17 public final class String
18 implements java.io.Serializable,
Comparable<String>, CharSequence
19 {
20 privat...
Javaのおさらい
Java API仕様
http://docs.oracle.com/javase/jp/6/api/
すべてって..?
15
Javaには最初からたくさん
のクラスが付いてくる
Javaのおさらい
16
Javaには最初からたくさん
のクラスが付いてくる
だから
Javaのおさらい
17
Javaには最初からたくさん
のクラスが付いてくる
だから
たくさんの機能を最初から
使える
Javaのおさらい
18
拡張性が高い!
Javaのおさらい
19
拡張性が高い!
Javaのおさらい
データベースに接続できる
インターネットにも接続できる
人の作ったクラスを再利用できる
20
?
21
Javaのおさらい
とりあえず、ここではクラスの中に
プログラムを書いていくことだけ
理解してください
22
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
23
Javaのおさらい
1 package study;
2
3 public class Chicken {
4
5 public void sing(){
6 System.out.println("コケコッコー!");
7 }
8 }
9
1...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4
5 public void sing(){
6 System.out.println("コケコッコー!");
7 }
8 }
9
1...
Javaのきほん2
メソッドには
戻り値がある
Javaのおさらい
26
Javaのきほん2
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
27
Javaのおさらい
1 package study;
2
3 public class Chicken {
4
5 public void sing(){
6 System.out.println("コケコッコー!");
7 }
8 }
9
1...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sin...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sin...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sin...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sin...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sin...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
OK! Stringが返ってくるから、
Stringに代入されるようにします
3 publi...
3 public class Chicken {
4
5 public String sing(String feeling){
6 if (feeling.equals("元気")){
7 String s = "コケコッコー!!!";
8 ...
キャッチボール
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
strには コケコッコー!!! が入る
3 public class Chicken {
4...
3 public class Chicken {
4
5 public String sing(String feeling){
6 if (feeling.equals("元気")){
7 String s = "コケコッコー!!!";
8 ...
クラスとメソッドを
つくってみよう
Javaのおさらい
実習
38
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
39
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
メモリの中
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 ...
あれ?
オブジェクトと
インスタンスって?
Javaのおさらい
45
だいたい同じ
とりあえず今は
インスタンス=オブジェクト
で覚える
Javaのおさらい
46
メモリの中
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 ...
メモリの中
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 ...
クラスとは
オブジェクトの設計図
Javaのおさらい
本当は
49
メモリの中
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 ...
参照ってなんだよ
51
オブジェクトは、参照型と呼ばれます
Javaのおさらい
スタック領域
Chicken cはヒープ領域の1番
Dubk dはヒープ領域の2番
ヒープ領域
オブジェクトの実体は
ここに格納されない
1:Chickenインスタンス
2:Duckインス...
なんでこんなことするの?
Javaのおさらい
53
同じインスタンスを色んな変数が参照するから
Javaのおさらい
スタック領域
Chicken aはヒープ領域の1番
Chicken bはヒープ領域の1番
ヒープ領域
オブジェクトの実体は
ここに格納されない
1:Chickenインスタンス
54
Javaはオブジェクトの受け渡しを色んなところでする
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
...
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sing(String...
Javaのおさらい
1 Chicken c = new Chicken();
2 String str = c.sing(“元気”);
3 public class Chicken {
4
5 public String sing(String...
もし参照型でないと...
Javaのおさらい
スタック領域
Chicken a = Checkenインスタンス1
Checken b =Checkenインスタンス1
Checken c =Checkenインスタンス1
めちゃくちゃメモリを食う!...
もし参照型でないと...
Javaのおさらい
スタック領域
Chicken a = Checkenインスタンス1
Checken b =Checkenインスタンス1
Checken c =Checkenインスタンス1
めちゃくちゃメモリを食う!...
参照型だと...
Javaのおさらい
スタック領域
Chicken aはヒープ領域の1番
Chicken bはヒープ領域の1番
Chicken cはヒープ領域の1番
ヒープ領域
オブジェクトの実体は
ここに格納されない
1:Chickenインス...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
Javaのおさらい
1 package study;
2
3 public class Person {
4 public static void main(String[] args) {
5
6 Chicken c = new Chicke...
Javaのおさらい
1 package study;
2
3 public class Chicken {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sing(){
8 System...
Javaのおさらい
1 package study;
2
3 public class Person {
4 public static void main(String[] args) {
5
6 Chicken c = new Chicke...
新しいインスタンスが出来るのは、
       new ∼() したときだけ!
Javaのおさらい
ヒープ領域
1:Chickenインスタンス
スタック領域
Chicken aはヒープ領域の1番
Chicken a2はヒープ領域の2番
2:Ch...
参照型の動きを
みてみよう
Javaのおさらい
実習
66
参考
 オブジェクトではないもの
Javaのおさらい
byte
short
int
long
char
float
double
boolean
こいつらだけです
Javaではクラス名の最初を大文字にする
慣習があるよ!
Stringの最初も大...
Javaのきほん3
オブジェクトは
参照型
Javaのおさらい
68
Javaのきほん3
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
69
クラス・メソッド
インスタンス・オブジェクト
Javaのおさらい
いままでで分かったこと
70
クラス・メソッド
インスタンス・オブジェクト
Javaのおさらい
いままでで分かったこと
70%
71
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
70%
あとは継承と多様性が分かれ
ば基本は終了です
72
ほんと!?
73
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
74
継承ってなに?
Javaのおさらい
75
継承ってなに?
別のクラスをコピペして、
新しいクラスを作る方法
Javaのおさらい
とりあえず
76
Javaのおさらい
え?
77
Javaのおさらい
1 package study;
2
3 public class Chicken extends Bird {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sin...
Javaのおさらい
1 package study;
2
3 public class Chicken extends Bird {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sin...
Javaのおさらい
1 package study;
2
3 public class Chicken extends Bird {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sin...
Javaのおさらい
1 package study;
2
3 public class Chicken extends Bird {
4 // メンバ変数
5 int weight = 5
6 // メソッド
7 public void sin...
Javaのきほん3
継承させると
コピークラスが出来る
Javaのおさらい
82
とりあえず
継承させてみよう
Javaのおさらい
実習
83
Javaのおさらい
なるほど
84
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
オーバーライドの話
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.prin...
Javaのおさらい
Duck
fly()
飛べません!
Bird
fly()
飛んでます!
継承
同じメソッドがあったら、
サブクラスを優先します
オーバーライド!
91
Javaのおさらい
サブクラス
スーパークラス
fly()
飛んでます!
うるさい!
私は飛べません
継承
fly()
うるさい!
私は飛べません
オーバーライド!
92
Javaのきほん4
親クラスと別のことがしたかったら、
オーバーライド
Javaのおさらい
93
Javaのきほん4
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
94
継承の良いところ
クラスをコピーして、
一部だけ書き換えられる!
つまり
元のプログラムを再利用できる!
Javaのおさらい
95
注意点
Javaのおさらい
void fly()
飛んでます!
void fly()
飛べません!
オーバーライド!
サブクラスが優先される戻り値と引数は合わせる
fly(String s)はダメ!
注:実は、戻り値のクラスのサブクラスを指定
するの...
余談
Javaのおさらい
実は全てのクラスは、
Objectクラスを継承して
います
Bird
fly()
飛んでます!
継承
java.lang.Object
clone()
equals()
finalize()
.....
97
余談
Javaのおさらい
Bird
fly()
飛んでます!
継承
java.lang.Object
clone()
equals()
finalize()
.....
オブジェクトクラス
Java API
http://docs.oracle.c...
余談
Javaのおさらい
Bird
fly()
飛んでます!
継承
java.lang.Object
clone()
equals()
finalize()
.....
オブジェクトクラス
Java API
http://docs.oracle.c...
余談
Javaのおさらい
1 package study;
2
3 public class Duck {
4 // メソッド
5 public void fly(){
6 System.out.println("飛べません!");
7 }
8...
余談
Javaのおさらい
1 package study;
2
3 public class Duck extends Bird {
4 // メソッド
5 public void fly(){
6 System.out.println("飛べ...
余談
Javaのおさらい
1 package study;
2
3 public class Duck {
4 // メソッド
5 public void fly(){
6 System.out.println("飛べません!");
7 }
8...
余談
Javaのおさらい
1 package study;
2
3 public class Duck {
4 // メソッド
5 public void fly(){
6 System.out.println("飛べません!");
7 }
8...
余談
実はprintln(オブジェクト)を実行したら...
toString()メソッドで返ってきた文字列を
返します!
Javaのおさらい
104
余談
Javaのおさらい
study.Chicken@35a8767
出力
Duckオブジェクトです
出力
オーバーライド後は
Duckクラスの
toString()が呼ばれます
オーバーライド前は
Objectクラスの
toString()が...
余談
Javaはクラスで成り立っている!
クラスの振る舞いは、Systemクラス
(System.out.println()メソッドのクラス)
であっても、同じ!
Javaのおさらい
クラスだから最初大文字
106
余談
いままでの知識を応用すれば、
      Javaはほとんど理解できる!
Javaのおさらい
107
余談2
またまた余談
Javaのおさらい
108
余談2
じつは僕らは、知らないうちに
    多くのクラスを利用していました
Javaのおさらい
文字列作れる
画面出力できる
だけでなく....
データベースを読める
サイトを作れる
全部クラスで実現
109
余談2
・データベース(JDBC)
Javaのおさらい
こんなの書いたよね
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup...
余談2
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:comp/env/...
余談2
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:comp/env/...
余談2
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:comp/env/...
余談2
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:comp/env/...
余談2
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:comp/env/...
Javaのおさらい
DB利用クラス
mainメソッ
ド
DataSource
Connection
Context
オブジェクトキャッチボール
String
PreparedStatement
オブジェクトを作ってはオブジェクトを渡しあう
116
余談2
Javaはオブジェクトの渡し合いで
          プログラムを行う
オブジェクトを投げたら、
オブジェクトが返ってくる!
参考:メソッドの説明
Javaのおさらい
117
余談2
どんなオブジェクトを投げたら、
どんなオブジェクトが戻ってくるか?
それさえ知っていれば、実際の処理のことは知らなくても使える
(カプセル化)
データベース接続のことを知らなくても、
接続するためのクラスを使ってましたよね?
Javaの...
余談2
複数人でプログラムするときも楽ちん
Javaのおさらい
私はDuckオブジェクトを受け取ったら、
好きな食べ物を返すメソッドを作ります
私は食べ物クラスを作ります
相手の処理の中身は考えなくてもよい
119
余談2
修正も楽!
Javaのおさらい
メソッドにバグがありました
そうですか。
ただ、私には関係ありません。
うまく受け渡しが出来るように直しておいて下さい
受け渡しでしか相手のクラスと関わらない。
渡すときと受けるときの形式だけ決めておけば...
Javaのきほん5
手続き型:処理を中心に考える
オブジェクト指向:
オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
Javaのおさらい
121
Javaのきほん5
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決す...
クラス・メソッド
インスタンス・オブジェクト
継承
Javaのおさらい
いままでで分かったこと
90%
123
多様性について
Javaのおさらい
次で最後
90%
124
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
125
Javaのおさらい
委譲やってなくない?
126
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
応用でやります
127
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性
最後の難関
多様性
(ポリモフィズム)
128
「型」の話
Javaのおさらい
129
「型」の話
intとStringは中身が全然違う!
intは足し算できる。けど、Stringは足し算できない。
Javaのおさらい
130
「型」の話
intとStringは中身が全然違う!
intは足し算できる。けど、Stringは足し算できない。
PersonクラスとDuckクラスも全然中身が違う!
      
              だから
Javaのおさらい
131
「型」の話
変数には型が必要
型によって中身が何か、特定します
Javaのおさらい
132
Javaのおさらい
クラス
1 package study;
2
3 public class Person {
4 public static void main(String[] args) {
5
6 Chicken c = new Ch...
「型」の話
次に変なことをします
Javaのおさらい
134
1 package study;
2
3 public class Person {
4 public static void main(String[] args) {
5
6 Bird b = new Duck();
7 b.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();
...
Javaのおさらい
?
137
ヒープ領域
「型」の話
スーパークラスの型に、サブクラスのインスタンス
(の参照)を入れられます
Javaのおさらい
スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
Duck
fly()
sleep()
Bird
fly...
ヒープ領域
注意点
「型」の話
スーパークラスの型を使った場合、
スーパークラスに存在しているメソッド・変数
しか呼び出せません
Javaのおさらい
スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
Duck
fly()...
注意点
「型」の話
スーパークラスの型を使った場合、
スーパークラスに存在しているメソッド・変数
しか呼び出せません
Javaのおさらい
Duck
fly()
sleep()
Bird
fly()
継承
1 package study;
2
3 p...
Javaのおさらい
fly()はどちらにも存在するよね。
fly()はどういう動作をするの?
Duck
fly()
sleep()
Bird
fly()
継承
141
注意点
「型」の話
オーバーライドされている場合は、
Duckのfly()が実行されます
Javaのおさらい
Duck
fly()
sleep()
Bird
fly()
継承
1 package study;
2
3 public class Per...
注意点
「型」の話
オーバーライドされている場合は、
Duckのfly()が実行されます
Javaのおさらい
Duck
fly()
sleep()
Bird
fly()
継承
1 package study;
2
3 public class Per...
多様性まとめ
スーパークラスの型に
サブクラスのインスタンス(の参照)
をいれたとき
サブクラスの動作が優先される
Javaのおさらい
ヒープ領域スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
だってインスタンス(実...
多様性を
体験してみよう
Javaのおさらい
実習
145
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する...
クラス・メソッド
インスタンス・オブジェクト
継承・多様性(ポリモフィズム)
Javaのおさらい
いままでで分かったこと
100%
おめでとう!
147
これでJavaの基本はおしまいです
Javaのおさらい
100%
148
Javaのおさらい
納得いかない。
多様性って何が便利なの?
149
ウソをついていました
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:co...
ウソをついていました
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.lookup("java:co...
データベース
Javaのおさらい
Postgre
SQL
MySQL Oracle
色んな製品があります
使い方はそれぞれ違います
152
だけど、Javaでの使い方は
全て同じです
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.look...
だけど、Javaでの使い方は
全て同じです
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.look...
だけど、Javaでの使い方は
全て同じです
・データベース
Javaのおさらい
1 Context context=new InitialContext();
2 DataSource ds = (DataSource)context.look...
実際の実装をみてみよう
(Connectionインターフェース)
Javaのおさらい
1 package java.sql;
2 import java.util.Properties;
3 public interface Connectio...
実際の実装をみてみよう
(Connectionインターフェース)
Javaのおさらい
1 package java.sql;
2 import java.util.Properties;
3 public interface Connectio...
インターフェースとは
メソッドの中身が
記載されていないクラス
Javaのおさらい
1 package java.sql;
2 import java.util.Properties;
3 public interface Connection...
インターフェースとは
メソッドの名前・戻り値は記載されている
これを継承(実装)したクラスは、
絶対にインターフェースに存在するメソッ
ドをオーバーライドしなければならない
Javaのおさらい
インターフェースを「継承」する
ことを実装と呼ぶよ...
インターフェースとは
何が便利なの?
実装するクラスには、
メソッドの名前と戻り値、
つまり、必要な機能(オブジェクトの受け渡し)
を強制できる
Javaのおさらい
160
インターフェースとは
インターフェースを実装しているサブクラスは、インターフェースに書かれている
メソッドを全てオーバーライドしなければならない
Javaのおさらい
MySQLConnecttion
Connection
インターフェース
Or...
インターフェースとは
インターフェースを実装しているサブクラスは、インターフェースに書かれている
メソッドを全てオーバーライドしなければならない
だから、Connectionインターフェースのことだけ
知っていれば、具体的なクラスの裏の処理の
...
ポリモフィズムの利点
オブジェクトの受け渡し方法が
同じだから、全部使い方は同じ!
意識しないで、サブクラスを利用できる!
Javaのおさらい
163
ポリモフィズムの利点
もしデータベース製品を変更しても
プログラムの修正箇所はなし!
↓
オブジェクトの受け渡しだけ意識していればよい
相手の処理は関係ない
Javaのおさらい
164
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する...
クラス・メソッド
インスタンス・オブジェクト
継承・多様性(ポリモフィズム)
Javaのおさらい
本当に完了!
100%
おめでとう!
166
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する...
流れ
•Javaのおさらい
•応用してみよう
168
応用してみよう
•Strategyパターン
•Compositeパターン
169
パターンって?
色んな人が、
問題解決したときに使った方法
みんな同じようなことを
考え出すんだね
170
今回は、パターンの
本質的な部分を
簡略的に紹介します
171
Strategyパターン
172
Strategy(戦略)パターン
変動しやすい部分を分離
173
Strategy(戦略)パターン
変動しやすい部分を分離
どういうこと?
174
Strategy(戦略)パターン
RPGの話
職業: 剣士, 山賊, 騎士...
武器: 普通の剣, 勇者の剣, 錆びた剣...
175
Strategy(戦略)パターン
1.剣士を実装する
今回は戦うだけのRPGです
176
Strategy(戦略)パターン
1.剣士を実装する
剣士
fight();
177
Strategy(戦略)パターン
1.剣士を実装する
2.武器を実装する
剣士
fight();
普通の剣,勇者の剣,
錆びた剣
例:勇者の剣を振りかざした!
178
Strategy(戦略)パターン
1.剣士を実装する
2.武器を実装する
剣士
fight();
普通の剣,勇者の剣,
錆びた剣
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
錆びた剣を持つ剣士
fight();
継承
オ...
Strategy(戦略)パターン
あれ、
武器の数が100だとしたら?
180
Strategy(戦略)パターン
剣士がたくさん
剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
錆びた剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight...
Strategy(戦略)パターン
騎士と山賊も剣を使えたら?
182
剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の...
剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の...
Strategy(戦略)パターン
さて、
アップデートで職業クラスに
逃げる機能を付けることになりました
錆びた剣を持つ騎士
fight();
run();
錆びた剣を持った剣士は
逃げ出した!
185
剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の...
剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の剣を持つ剣士
fight();
勇者の剣を持つ剣士
fight();
普通の...
Strategyパターン
ここで登場!
188
Strategy(戦略)パターン
Arms
インターフェース
useArms();
1.武器インターフェースを
作成!
189
Strategy(戦略)パターン
剣士
fight();
Arms型のarm変数
Arms
インターフェース
useArms();
2.剣士にAmrs型の変数を
持たせます
190
Strategy(戦略)パターン
剣士
fight(){
arm.useArms();
}
Arms型のarm変数
Arms
インターフェース
useArms();
3.fight()メソッドの中で
arm変数のuseArms()
メソッドを実行し...
Strategy(戦略)パターン
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
Arms
インターフェース
useArms();
3.arm変数に武器オブ...
Strategy(戦略)パターン
Arms
インターフェース
useArms();
普通の剣
useArms();
勇者の剣
useArms();
錆びた剣
useArms();
普通の剣を
使いました!
剣士
fight(){
arm.useA...
Strategy(戦略)パターン
完成!
Arms
インターフェース
useArms();
普通の剣
useArms();
勇者の剣
useArms();
錆びた剣
useArms();
剣士
fight(){
arm.useArms();
}
...
使い方
Strategy(戦略)パターン
1 public class Player{
2 public static void main(String[] args){
3 Swordsman s = new Swordsman();
4 A...
使い方
Strategy(戦略)パターン
1 public class Player{
2 public static void main(String[] args){
3 Swordsman s = new Swordsman();
4 A...
使い方
Strategy(戦略)パターン
1 public class Player{
2 public static void main(String[] args){
3 Swordsman s = new Swordsman();
4 A...
使い方
Strategy(戦略)パターン
1 public class Player{
2 public static void main(String[] args){
3 Swordsman s = new Swordsman();
4 A...
使い方
Strategy(戦略)パターン
1 public class Player{
2 public static void main(String[] args){
3 Swordsman s = new Swordsman();
4 A...
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
使い方
Strategy(戦略)パターン
1 public class Player{
2 public s...
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
使い方
Strategy(戦略)パターン
1 public class Player{
2 public s...
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
使い方
Strategy(戦略)パターン
1 public class Player{
2 public s...
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
使い方
Strategy(戦略)パターン
1 public class Player{
2 public s...
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
使い方
Strategy(戦略)パターン
1 public class Player{
2 public s...
Strategy(戦略)パターン
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
騎士
fight(){
arm.useArms();
}
setArms(A...
Strategy(戦略)パターン
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
騎士
fight(){
arm.useArms();
}
setArms(A...
Strategyパターン
を実装してみよう
207
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性実はStrategyパターンはこれでした
208
Strategy(戦略)パターン
委譲
オブジェクトが、
他のオブジェクトに
振る舞いをまかせること=
209
Strategy(戦略)パターン
委譲
オブジェクトが、
他のオブジェクトに
振る舞いをまかせること
=
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
a...
Strategy
パターン
Strategy(戦略)パターン
多様性(ポリモフィズム)
すごいじゃん!
211
応用してみよう
•Strategyパターン
•Compositeパターン
212
Compositeパターン
213
Compositeパターン
今回の勉強の集大成!
これが理解できたら、今回の勉強の目標は達成!
214
Compositeパターン
会社の話
会社には、部署がある
営業1部
営業本部
営業2部
中田
本部長
高橋
副本部長
吉永
部長
田中
鈴木
部長
中島
215
Compositeパターン
今回は、
  オブジェクトでこの構造を実現
営業1部
営業本部
営業2部
中田
本部長
高橋
副本部長
吉永
部長
田中
鈴木
部長
中島
216
?
217
Compositeパターン
実装しつつ進めましょう
218
Compositeパターン
今回作るクラスとインターフェース
add(Component com)
print()
Component
インターフェース
add(Component com)
print()
Group
add(Componen...
Compositeパターン
今回作るクラスとインターフェース
add(Component com)
print()
Component
インターフェース
add(Component com)
print()
Group
add(Componen...
Compositeパターン
1 public interface Component{
2 void add(Component com);
3 void print();
4 }
add(Component com)
print()
Comp...
Compositeパターン
1 public class Member implements component{
2 String name;
3
4 public Member(String name){
5 this.name = nam...
Compositeパターン
1 public class Member implements component{
2 String name;
3
4 public Member(String name){
5 this.name = nam...
Compositeパターン
1 public class Member implements component{
2 String name;
3
4 public Member(String name){
5 this.name = nam...
Compositeパターン
1 public class Member implements component{
2 String name;
3
4 public Member(String name){
5 this.name = nam...
Compositeパターン
1 public class Member implements component{
2 String name;
3
4 public Member(String name){
5 this.name = nam...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
Compositeパターン
      ここまでできました
add(Component com)
print()
Component
インターフェース
add(Component com)
print()
Group
add(Component...
Compositeパターン
これでもう、この構造を実現できます
営業1部
営業本部
営業2部
中田
本部長
高橋
副本部長
吉永
部長
田中
鈴木
部長
中島
231
Compositeパターン
あとはmainメソッドを作るだけ
add(Component com)
print()
Component
インターフェース
add(Component com)
print()
Group
add(Componen...
Compositeパターン
add(Component com)
print()
Component
インターフェース
add(Component com)
print()
Group
add(Component com)
print()
St...
Compositeパターン
add(Compon
Component
add(Compon
Group
add(Compon
String name String name
Member
どのクラスで、それぞれのオブジェクトを作る?
営業1部
...
Compositeパターン
1 public class MakeMemberList{
2 public static void main(String[] args){
3 Component honbu = new Group("営業本部...
Compositeパターン
1 honbu.add(honbuchou);
2 honbu.add(fukuhoubuchou);
3 honbu.add(ichibu);
4 honbu.add(nibu);
5
6 ichibu.add(y...
Compositeパターン
1 honbu.add(honbuchou);
2 honbu.add(fukuhoubuchou);
3 honbu.add(ichibu);
4 honbu.add(nibu);
5
6 ichibu.add(y...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
Compositeパターン
   honbu.print();
営業1部
営業本
部
営業2部
中田
本部長
高橋
副本部
吉永
部長
田中
鈴木
部長
中島
Group
Memeber
Memeber
Memeber Memeber Meme...
Compositeパターン
   honbu.print();
営業1部
営業本
部
営業2部
中田
本部長
高橋
副本部
吉永
部長
田中
鈴木
部長
中島
Group
Memeber
Memeber
Memeber Memeber Meme...
!!?
なんで部署の名前と
全員の名前が表示されたの!?
241
Compositeパターン
   honbu.print();
本部は、Groupクラスで作られました
営業1部
営業本
部
営業2部
中田
本部長
高橋
副本部
吉永
部長
田中
鈴木
部長
中島
Group
Memeber
Memeber
...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
Compositeパターン
1 public class Group implements Component {
2 ArrayList list = new ArrayList();
3 String name;
4 public Grou...
営業本部
出力
Compositeパターン
add(Compon
Component
add(Compon
Group
add(Compon
String name String name
Member
honbu.print() を実行したあ...
営業本部
中田本部長
出力
Compositeパターン
add(Compon
Component
add(Compon
Group
add(Compon
String name String name
Member
honbu.print() ...
honbu.print() を実行したあとの動き
営業本部
中田本部長
高橋副本部長
出力
add(Compon
Component
add(Compon
Group
add(Compon
String name String name
Mem...
honbu.print() を実行したあとの動き
営業本部
中田本部長
高橋副本部長
営業1部
出力
add(Compon
Component
add(Compon
Group
add(Compon
String name String nam...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
String name Strin...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
田中
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
String name St...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
田中
営業2部
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
String na...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
田中
営業2部
鈴木部長
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
Stri...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
田中
営業2部
鈴木部長
中島
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
S...
営業本部
中田本部長
高橋副本部長
営業1部
吉永部長
田中
営業2部
鈴木部長
中島
honbu.print() を実行したあとの動き
出力
add(Compon
Component
add(Compon
Group
add(Compon
S...
Compositeパターン
ほとんどクラスを作っていないのに、
柔軟な部署の構造を
持たせることが出来た
これも多様性(ポリモフィズム)
のおかげだね
255
そして...
Componentパターンを
理解することが出来たなら、
Javaの基本は理解できている!
256
おつかれさまでした
これでJavaの勉強会は終了です
つかれたあ
257
Javaのきほん
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
258
応用
Strategyパターン
変動する部分を切り離す
Compositeパターン
容器と中身を同じように扱う
今回は部署を容器、中身をメンバーとして実装しました
ど
ち
どちらも多様性(ポリモフィズム)
を使うことによって実現
259
【補足】
今回やっていないけど
知っておいた方がいいこと
抽象クラス
static
アクセス修飾子
オーバーロード
ぐぐってね!
260
Javaまとめ
オブジェクトの投げ合いで、
たくさんのことが実現できる
261
Thank you!
262
Upcoming SlideShare
Loading in...5
×

Java基礎勉強会

568

Published on

同期(新人)に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
568
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Java基礎勉強会

  1. 1. やさしい 末澤裕希 1
  2. 2. 流れ •Javaのおさらい •応用してみよう 2
  3. 3. はじめに Javaの基本を理解していなければ、いつまでも Javaを書けるようにはならない! 【目的】 基本事項を新人全員が理解! 3
  4. 4. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 4
  5. 5. よくわかんない... 5
  6. 6. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 6
  7. 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. 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. 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. 10. Javaのおさらい Person mainメ ソッド Chicken sing() Duck sing() Bird sing() クラス クラス クラス クラス 10
  11. 11. クラスとは プログラムの設計図 ここに色んな処理を書きます Javaのおさらい とりあえず 11
  12. 12. Javaのきほん1 すべて クラスで出来ている Javaのおさらい 12
  13. 13. Javaのきほん1 すべて クラスで出来ている Javaのおさらい すべてって..? 13
  14. 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. 15. Javaのおさらい Java API仕様 http://docs.oracle.com/javase/jp/6/api/ すべてって..? 15
  16. 16. Javaには最初からたくさん のクラスが付いてくる Javaのおさらい 16
  17. 17. Javaには最初からたくさん のクラスが付いてくる だから Javaのおさらい 17
  18. 18. Javaには最初からたくさん のクラスが付いてくる だから たくさんの機能を最初から 使える Javaのおさらい 18
  19. 19. 拡張性が高い! Javaのおさらい 19
  20. 20. 拡張性が高い! Javaのおさらい データベースに接続できる インターネットにも接続できる 人の作ったクラスを再利用できる 20
  21. 21. ? 21
  22. 22. Javaのおさらい とりあえず、ここではクラスの中に プログラムを書いていくことだけ 理解してください 22
  23. 23. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 23
  24. 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. 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. 26. Javaのきほん2 メソッドには 戻り値がある Javaのおさらい 26
  27. 27. Javaのきほん2 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 27
  28. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 38. クラスとメソッドを つくってみよう Javaのおさらい 実習 38
  39. 39. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 39
  40. 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. 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. 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. 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. 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. 45. あれ? オブジェクトと インスタンスって? Javaのおさらい 45
  46. 46. だいたい同じ とりあえず今は インスタンス=オブジェクト で覚える Javaのおさらい 46
  47. 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. 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. 49. クラスとは オブジェクトの設計図 Javaのおさらい 本当は 49
  50. 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. 参照ってなんだよ 51
  52. 52. オブジェクトは、参照型と呼ばれます Javaのおさらい スタック領域 Chicken cはヒープ領域の1番 Dubk dはヒープ領域の2番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス 2:Duckインスタンス 注:本当は番号ではなくて メモリのアドレスが書かれています 52
  53. 53. なんでこんなことするの? Javaのおさらい 53
  54. 54. 同じインスタンスを色んな変数が参照するから Javaのおさらい スタック領域 Chicken aはヒープ領域の1番 Chicken bはヒープ領域の1番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス 54
  55. 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. 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. 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. 58. もし参照型でないと... Javaのおさらい スタック領域 Chicken a = Checkenインスタンス1 Checken b =Checkenインスタンス1 Checken c =Checkenインスタンス1 めちゃくちゃメモリを食う! 58
  59. 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. 60. 参照型だと... Javaのおさらい スタック領域 Chicken aはヒープ領域の1番 Chicken bはヒープ領域の1番 Chicken cはヒープ領域の1番 ヒープ領域 オブジェクトの実体は ここに格納されない 1:Chickenインスタンス Checkenインスタンス1の変更しよっ と♪ メモリ食わない+変更が容易 60
  61. 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. 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. 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. 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. 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. 66. 参照型の動きを みてみよう Javaのおさらい 実習 66
  67. 67. 参考  オブジェクトではないもの Javaのおさらい byte short int long char float double boolean こいつらだけです Javaではクラス名の最初を大文字にする 慣習があるよ! Stringの最初も大文字でしょ オブジェクトはみんな大文字ではじまるよ 67
  68. 68. Javaのきほん3 オブジェクトは 参照型 Javaのおさらい 68
  69. 69. Javaのきほん3 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 69
  70. 70. クラス・メソッド インスタンス・オブジェクト Javaのおさらい いままでで分かったこと 70
  71. 71. クラス・メソッド インスタンス・オブジェクト Javaのおさらい いままでで分かったこと 70% 71
  72. 72. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 70% あとは継承と多様性が分かれ ば基本は終了です 72
  73. 73. ほんと!? 73
  74. 74. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 74
  75. 75. 継承ってなに? Javaのおさらい 75
  76. 76. 継承ってなに? 別のクラスをコピペして、 新しいクラスを作る方法 Javaのおさらい とりあえず 76
  77. 77. Javaのおさらい え? 77
  78. 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. 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. 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. 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. 82. Javaのきほん3 継承させると コピークラスが出来る Javaのおさらい 82
  83. 83. とりあえず 継承させてみよう Javaのおさらい 実習 83
  84. 84. Javaのおさらい なるほど 84
  85. 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. 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. 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. 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. 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. 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. 91. Javaのおさらい Duck fly() 飛べません! Bird fly() 飛んでます! 継承 同じメソッドがあったら、 サブクラスを優先します オーバーライド! 91
  92. 92. Javaのおさらい サブクラス スーパークラス fly() 飛んでます! うるさい! 私は飛べません 継承 fly() うるさい! 私は飛べません オーバーライド! 92
  93. 93. Javaのきほん4 親クラスと別のことがしたかったら、 オーバーライド Javaのおさらい 93
  94. 94. Javaのきほん4 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 94
  95. 95. 継承の良いところ クラスをコピーして、 一部だけ書き換えられる! つまり 元のプログラムを再利用できる! Javaのおさらい 95
  96. 96. 注意点 Javaのおさらい void fly() 飛んでます! void fly() 飛べません! オーバーライド! サブクラスが優先される戻り値と引数は合わせる fly(String s)はダメ! 注:実は、戻り値のクラスのサブクラスを指定 するのは大丈夫... 例:スーパークラス Bird method() サブクラス Duck method() 96
  97. 97. 余談 Javaのおさらい 実は全てのクラスは、 Objectクラスを継承して います Bird fly() 飛んでます! 継承 java.lang.Object clone() equals() finalize() ..... 97
  98. 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. 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. 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. 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. 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. 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. 104. 余談 実はprintln(オブジェクト)を実行したら... toString()メソッドで返ってきた文字列を 返します! Javaのおさらい 104
  105. 105. 余談 Javaのおさらい study.Chicken@35a8767 出力 Duckオブジェクトです 出力 オーバーライド後は Duckクラスの toString()が呼ばれます オーバーライド前は Objectクラスの toString()が呼ばれます ObjectクラスのtoString メソッドは変なの返すね 継承 105
  106. 106. 余談 Javaはクラスで成り立っている! クラスの振る舞いは、Systemクラス (System.out.println()メソッドのクラス) であっても、同じ! Javaのおさらい クラスだから最初大文字 106
  107. 107. 余談 いままでの知識を応用すれば、       Javaはほとんど理解できる! Javaのおさらい 107
  108. 108. 余談2 またまた余談 Javaのおさらい 108
  109. 109. 余談2 じつは僕らは、知らないうちに     多くのクラスを利用していました Javaのおさらい 文字列作れる 画面出力できる だけでなく.... データベースを読める サイトを作れる 全部クラスで実現 109
  110. 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. 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. 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. 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. 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. 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. 116. Javaのおさらい DB利用クラス mainメソッ ド DataSource Connection Context オブジェクトキャッチボール String PreparedStatement オブジェクトを作ってはオブジェクトを渡しあう 116
  117. 117. 余談2 Javaはオブジェクトの渡し合いで           プログラムを行う オブジェクトを投げたら、 オブジェクトが返ってくる! 参考:メソッドの説明 Javaのおさらい 117
  118. 118. 余談2 どんなオブジェクトを投げたら、 どんなオブジェクトが戻ってくるか? それさえ知っていれば、実際の処理のことは知らなくても使える (カプセル化) データベース接続のことを知らなくても、 接続するためのクラスを使ってましたよね? Javaのおさらい 118
  119. 119. 余談2 複数人でプログラムするときも楽ちん Javaのおさらい 私はDuckオブジェクトを受け取ったら、 好きな食べ物を返すメソッドを作ります 私は食べ物クラスを作ります 相手の処理の中身は考えなくてもよい 119
  120. 120. 余談2 修正も楽! Javaのおさらい メソッドにバグがありました そうですか。 ただ、私には関係ありません。 うまく受け渡しが出来るように直しておいて下さい 受け渡しでしか相手のクラスと関わらない。 渡すときと受けるときの形式だけ決めておけばよい。 相手のクラスのバグは、相手だけの責任 120
  121. 121. Javaのきほん5 手続き型:処理を中心に考える オブジェクト指向: オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 Javaのおさらい 121
  122. 122. Javaのきほん5 Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 122
  123. 123. クラス・メソッド インスタンス・オブジェクト 継承 Javaのおさらい いままでで分かったこと 90% 123
  124. 124. 多様性について Javaのおさらい 次で最後 90% 124
  125. 125. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 125
  126. 126. Javaのおさらい 委譲やってなくない? 126
  127. 127. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 応用でやります 127
  128. 128. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性 最後の難関 多様性 (ポリモフィズム) 128
  129. 129. 「型」の話 Javaのおさらい 129
  130. 130. 「型」の話 intとStringは中身が全然違う! intは足し算できる。けど、Stringは足し算できない。 Javaのおさらい 130
  131. 131. 「型」の話 intとStringは中身が全然違う! intは足し算できる。けど、Stringは足し算できない。 PersonクラスとDuckクラスも全然中身が違う!                      だから Javaのおさらい 131
  132. 132. 「型」の話 変数には型が必要 型によって中身が何か、特定します Javaのおさらい 132
  133. 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. 134. 「型」の話 次に変なことをします Javaのおさらい 134
  135. 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. 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. 137. Javaのおさらい ? 137
  138. 138. ヒープ領域 「型」の話 スーパークラスの型に、サブクラスのインスタンス (の参照)を入れられます Javaのおさらい スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス Duck fly() sleep() Bird fly() 継承 138
  139. 139. ヒープ領域 注意点 「型」の話 スーパークラスの型を使った場合、 スーパークラスに存在しているメソッド・変数 しか呼び出せません Javaのおさらい スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス Duck fly() sleep() Bird fly() 継承 139
  140. 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. 141. Javaのおさらい fly()はどちらにも存在するよね。 fly()はどういう動作をするの? Duck fly() sleep() Bird fly() 継承 141
  142. 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. 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. 144. 多様性まとめ スーパークラスの型に サブクラスのインスタンス(の参照) をいれたとき サブクラスの動作が優先される Javaのおさらい ヒープ領域スタック領域 Bird bはヒープ領域の1番目 1: Duckインスタンス だってインスタンス(実体)は Duckだもん 144
  145. 145. 多様性を 体験してみよう Javaのおさらい 実習 145
  146. 146. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 これです 146
  147. 147. クラス・メソッド インスタンス・オブジェクト 継承・多様性(ポリモフィズム) Javaのおさらい いままでで分かったこと 100% おめでとう! 147
  148. 148. これでJavaの基本はおしまいです Javaのおさらい 100% 148
  149. 149. Javaのおさらい 納得いかない。 多様性って何が便利なの? 149
  150. 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. 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. 152. データベース Javaのおさらい Postgre SQL MySQL Oracle 色んな製品があります 使い方はそれぞれ違います 152
  153. 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. 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. 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. 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. 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. 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. 159. インターフェースとは メソッドの名前・戻り値は記載されている これを継承(実装)したクラスは、 絶対にインターフェースに存在するメソッ ドをオーバーライドしなければならない Javaのおさらい インターフェースを「継承」する ことを実装と呼ぶよ 159
  160. 160. インターフェースとは 何が便利なの? 実装するクラスには、 メソッドの名前と戻り値、 つまり、必要な機能(オブジェクトの受け渡し) を強制できる Javaのおさらい 160
  161. 161. インターフェースとは インターフェースを実装しているサブクラスは、インターフェースに書かれている メソッドを全てオーバーライドしなければならない Javaのおさらい MySQLConnecttion Connection インターフェース OracleConnection PostgreSQLConnection 161
  162. 162. インターフェースとは インターフェースを実装しているサブクラスは、インターフェースに書かれている メソッドを全てオーバーライドしなければならない だから、Connectionインターフェースのことだけ 知っていれば、具体的なクラスの裏の処理の ことは知らなくても、使い方が分かる! 今まで使ったことのない製品も 同じ方法で使える! Javaのおさらい MySQLConnecttion Connection インターフェース OracleConnection PostgreSQLConnection 162
  163. 163. ポリモフィズムの利点 オブジェクトの受け渡し方法が 同じだから、全部使い方は同じ! 意識しないで、サブクラスを利用できる! Javaのおさらい 163
  164. 164. ポリモフィズムの利点 もしデータベース製品を変更しても プログラムの修正箇所はなし! ↓ オブジェクトの受け渡しだけ意識していればよい 相手の処理は関係ない Javaのおさらい 164
  165. 165. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 これです 165
  166. 166. クラス・メソッド インスタンス・オブジェクト 継承・多様性(ポリモフィズム) Javaのおさらい 本当に完了! 100% おめでとう! 166
  167. 167. Javaのきほん Javaのおさらい 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 167
  168. 168. 流れ •Javaのおさらい •応用してみよう 168
  169. 169. 応用してみよう •Strategyパターン •Compositeパターン 169
  170. 170. パターンって? 色んな人が、 問題解決したときに使った方法 みんな同じようなことを 考え出すんだね 170
  171. 171. 今回は、パターンの 本質的な部分を 簡略的に紹介します 171
  172. 172. Strategyパターン 172
  173. 173. Strategy(戦略)パターン 変動しやすい部分を分離 173
  174. 174. Strategy(戦略)パターン 変動しやすい部分を分離 どういうこと? 174
  175. 175. Strategy(戦略)パターン RPGの話 職業: 剣士, 山賊, 騎士... 武器: 普通の剣, 勇者の剣, 錆びた剣... 175
  176. 176. Strategy(戦略)パターン 1.剣士を実装する 今回は戦うだけのRPGです 176
  177. 177. Strategy(戦略)パターン 1.剣士を実装する 剣士 fight(); 177
  178. 178. Strategy(戦略)パターン 1.剣士を実装する 2.武器を実装する 剣士 fight(); 普通の剣,勇者の剣, 錆びた剣 例:勇者の剣を振りかざした! 178
  179. 179. Strategy(戦略)パターン 1.剣士を実装する 2.武器を実装する 剣士 fight(); 普通の剣,勇者の剣, 錆びた剣 普通の剣を持つ剣士 fight(); 勇者の剣を持つ剣士 fight(); 錆びた剣を持つ剣士 fight(); 継承 オーバーライド 179
  180. 180. Strategy(戦略)パターン あれ、 武器の数が100だとしたら? 180
  181. 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. 182. Strategy(戦略)パターン 騎士と山賊も剣を使えたら? 182
  183. 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. 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. 185. Strategy(戦略)パターン さて、 アップデートで職業クラスに 逃げる機能を付けることになりました 錆びた剣を持つ騎士 fight(); run(); 錆びた剣を持った剣士は 逃げ出した! 185
  186. 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. 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. 188. Strategyパターン ここで登場! 188
  189. 189. Strategy(戦略)パターン Arms インターフェース useArms(); 1.武器インターフェースを 作成! 189
  190. 190. Strategy(戦略)パターン 剣士 fight(); Arms型のarm変数 Arms インターフェース useArms(); 2.剣士にAmrs型の変数を 持たせます 190
  191. 191. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } Arms型のarm変数 Arms インターフェース useArms(); 3.fight()メソッドの中で arm変数のuseArms() メソッドを実行します 191
  192. 192. Strategy(戦略)パターン 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 Arms インターフェース useArms(); 3.arm変数に武器オブジェクトを 格納するためのメソッドを準備 192
  193. 193. Strategy(戦略)パターン Arms インターフェース useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 普通の剣を 使いました! 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 5.具体的な武器クラスを 実装します 継承 193
  194. 194. Strategy(戦略)パターン 完成! Arms インターフェース useArms(); 普通の剣 useArms(); 勇者の剣 useArms(); 錆びた剣 useArms(); 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 継承 194
  195. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 207. Strategyパターン を実装してみよう 207
  208. 208. Javaのおさらい クラス メソッド インスタンス・ オブジェクト 継承 委譲 多様性実はStrategyパターンはこれでした 208
  209. 209. Strategy(戦略)パターン 委譲 オブジェクトが、 他のオブジェクトに 振る舞いをまかせること= 209
  210. 210. Strategy(戦略)パターン 委譲 オブジェクトが、 他のオブジェクトに 振る舞いをまかせること = 剣士 fight(){ arm.useArms(); } setArms(Arms a){ arm = a; } Arms型のarm変数 armは普通の剣の参照を持っている!! 普通の剣 useArms(); 参照 普通の剣を 使いました! と表示するメソッド 今回は、剣士オブジェクトが普通の剣 オブジェクトに振る舞いを まかせていました 210
  211. 211. Strategy パターン Strategy(戦略)パターン 多様性(ポリモフィズム) すごいじゃん! 211
  212. 212. 応用してみよう •Strategyパターン •Compositeパターン 212
  213. 213. Compositeパターン 213
  214. 214. Compositeパターン 今回の勉強の集大成! これが理解できたら、今回の勉強の目標は達成! 214
  215. 215. Compositeパターン 会社の話 会社には、部署がある 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 215
  216. 216. Compositeパターン 今回は、   オブジェクトでこの構造を実現 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 216
  217. 217. ? 217
  218. 218. Compositeパターン 実装しつつ進めましょう 218
  219. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 231. Compositeパターン これでもう、この構造を実現できます 営業1部 営業本部 営業2部 中田 本部長 高橋 副本部長 吉永 部長 田中 鈴木 部長 中島 231
  232. 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. 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. 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. 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. 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. 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. 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. 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. 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. !!? なんで部署の名前と 全員の名前が表示されたの!? 241
  242. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 255. Compositeパターン ほとんどクラスを作っていないのに、 柔軟な部署の構造を 持たせることが出来た これも多様性(ポリモフィズム) のおかげだね 255
  256. 256. そして... Componentパターンを 理解することが出来たなら、 Javaの基本は理解できている! 256
  257. 257. おつかれさまでした これでJavaの勉強会は終了です つかれたあ 257
  258. 258. Javaのきほん 1.すべてクラスで出来ている 2.メソッドには戻り値がある 3.オブジェクトは参照型 4.親クラスと別のことがしたかったらオーバーライド! 5.オブジェクトを中心に考える。 オブジェクトの受け渡しで解決する。 258
  259. 259. 応用 Strategyパターン 変動する部分を切り離す Compositeパターン 容器と中身を同じように扱う 今回は部署を容器、中身をメンバーとして実装しました ど ち どちらも多様性(ポリモフィズム) を使うことによって実現 259
  260. 260. 【補足】 今回やっていないけど 知っておいた方がいいこと 抽象クラス static アクセス修飾子 オーバーロード ぐぐってね! 260
  261. 261. Javaまとめ オブジェクトの投げ合いで、 たくさんのことが実現できる 261
  262. 262. Thank you! 262
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×