SlideShare una empresa de Scribd logo
1 de 262
Descargar para leer sin conexión
やさしい
末澤裕希
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! World!");
9 }
10
11 }
12
Javaのおさらい
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のおさらい
クラス
8
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
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 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
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 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
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
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 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
キャッチボール
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
キャッチボール
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
キャッチボール
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
キャッチボール
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
キャッチボール
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
キャッチボール
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
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
キャッチボール
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
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
クラスとメソッドを
つくってみよう
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.out.println("コケコッコー!");
9 }
10 }
クラスの中身
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 }
クラスの中身
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 }
クラス
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
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
メモリの中
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
あれ?
オブジェクトと
インスタンスって?
Javaのおさらい
45
だいたい同じ
とりあえず今は
インスタンス=オブジェクト
で覚える
Javaのおさらい
46
メモリの中
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
メモリの中
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
クラスとは
オブジェクトの設計図
Javaのおさらい
本当は
49
メモリの中
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
オブジェクトは、参照型と呼ばれます
Javaのおさらい
スタック領域
Chicken cはヒープ領域の1番
Dubk dはヒープ領域の2番
ヒープ領域
オブジェクトの実体は
ここに格納されない
1:Chickenインスタンス
2:Duckインスタンス
注:本当は番号ではなくて
メモリのアドレスが書かれています
52
なんでこんなことするの?
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
5 public String sing(String feeling){
6 if feeling.equals("元気"){
7 String s = "コケコッコー!!!"
8 return s
9 }
10 }
11 }
55
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
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
もし参照型でないと...
Javaのおさらい
スタック領域
Chicken a = Checkenインスタンス1
Checken b =Checkenインスタンス1
Checken c =Checkenインスタンス1
めちゃくちゃメモリを食う!
58
もし参照型でないと...
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
参照型だと...
Javaのおさらい
スタック領域
Chicken aはヒープ領域の1番
Chicken bはヒープ領域の1番
Chicken cはヒープ領域の1番
ヒープ領域
オブジェクトの実体は
ここに格納されない
1:Chickenインスタンス
Checkenインスタンス1の変更しよっ
と♪
メモリ食わない+変更が容易
60
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
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
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
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
新しいインスタンスが出来るのは、
       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
参照型の動きを
みてみよう
Javaのおさらい
実習
66
参考
 オブジェクトではないもの
Javaのおさらい
byte
short
int
long
char
float
double
boolean
こいつらだけです
Javaではクラス名の最初を大文字にする
慣習があるよ!
Stringの最初も大文字でしょ
オブジェクトはみんな大文字ではじまるよ
67
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 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
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
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
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
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.println("飛べません!");
7 }
8 }
1 package study;
2
3 public class Bird {
4 // メソッド
5 public void fly(){
6 System.out.println("飛んでます!");
7 }
8 }
次にかもクラスを作ります
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 }
次にかもクラスを作ります
かもは飛べないので、fly()
に 飛べません と出力させたい
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()
に 飛べません と出力させたい
同じメソッド名だ!
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 }
さてどうなる?
Personクラス
Duck d = new Duck();
d.fly();
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();
飛べません!
出力
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();
飛べません!
90
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)はダメ!
注:実は、戻り値のクラスのサブクラスを指定
するのは大丈夫...
例:スーパークラス Bird method()
サブクラス Duck method()
96
余談
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.com/javase/jp/6/api/java/lang/Object.html
98
余談
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
余談
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
余談
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
余談
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
余談
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
余談
実はprintln(オブジェクト)を実行したら...
toString()メソッドで返ってきた文字列を
返します!
Javaのおさらい
104
余談
Javaのおさらい
study.Chicken@35a8767
出力
Duckオブジェクトです
出力
オーバーライド後は
Duckクラスの
toString()が呼ばれます
オーバーライド前は
Objectクラスの
toString()が呼ばれます
ObjectクラスのtoString
メソッドは変なの返すね
継承
105
余談
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("java:comp/env/
jdbc/***");
3 con = ds.getConnection();
4
5 String sql = "SELECT * FROM TEST";
6 stmt = con.prepareStatemant(sql);
110
余談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
余談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
余談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
余談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
余談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
Javaのおさらい
DB利用クラス
mainメソッ
ド
DataSource
Connection
Context
オブジェクトキャッチボール
String
PreparedStatement
オブジェクトを作ってはオブジェクトを渡しあう
116
余談2
Javaはオブジェクトの渡し合いで
          プログラムを行う
オブジェクトを投げたら、
オブジェクトが返ってくる!
参考:メソッドの説明
Javaのおさらい
117
余談2
どんなオブジェクトを投げたら、
どんなオブジェクトが戻ってくるか?
それさえ知っていれば、実際の処理のことは知らなくても使える
(カプセル化)
データベース接続のことを知らなくても、
接続するためのクラスを使ってましたよね?
Javaのおさらい
118
余談2
複数人でプログラムするときも楽ちん
Javaのおさらい
私はDuckオブジェクトを受け取ったら、
好きな食べ物を返すメソッドを作ります
私は食べ物クラスを作ります
相手の処理の中身は考えなくてもよい
119
余談2
修正も楽!
Javaのおさらい
メソッドにバグがありました
そうですか。
ただ、私には関係ありません。
うまく受け渡しが出来るように直しておいて下さい
受け渡しでしか相手のクラスと関わらない。
渡すときと受けるときの形式だけ決めておけばよい。
相手のクラスのバグは、相手だけの責任
120
Javaのきほん5
手続き型:処理を中心に考える
オブジェクト指向:
オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
Javaのおさらい
121
Javaのきほん5
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
122
クラス・メソッド
インスタンス・オブジェクト
継承
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 Chicken();
7 Chicken c2; //Chicken型の新しい変数を定義
8 c2 = c;
9
10 c2.weight = 30;
11 System.out.println(c.weight);
12 }
13 }
型
Chicken型に、Chickenインスタンス(の参照)
をぶちこむ!
133
「型」の話
次に変なことをします
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();
8 }
9 }
Javaのおさらい
型
インスタンス
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のおさらい
型
インスタンス
スタック領域
Bird bはヒープ領域の1番目
ヒープ領域
1: Duckインスタンス
136
Javaのおさらい
?
137
ヒープ領域
「型」の話
スーパークラスの型に、サブクラスのインスタンス
(の参照)を入れられます
Javaのおさらい
スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
Duck
fly()
sleep()
Bird
fly()
継承
138
ヒープ領域
注意点
「型」の話
スーパークラスの型を使った場合、
スーパークラスに存在しているメソッド・変数
しか呼び出せません
Javaのおさらい
スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
Duck
fly()
sleep()
Bird
fly()
継承
139
注意点
「型」の話
スーパークラスの型を使った場合、
スーパークラスに存在しているメソッド・変数
しか呼び出せません
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
Javaのおさらい
fly()はどちらにも存在するよね。
fly()はどういう動作をするの?
Duck
fly()
sleep()
Bird
fly()
継承
141
注意点
「型」の話
オーバーライドされている場合は、
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
注意点
「型」の話
オーバーライドされている場合は、
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
多様性まとめ
スーパークラスの型に
サブクラスのインスタンス(の参照)
をいれたとき
サブクラスの動作が優先される
Javaのおさらい
ヒープ領域スタック領域
Bird bはヒープ領域の1番目 1: Duckインスタンス
だってインスタンス(実体)は
Duckだもん
144
多様性を
体験してみよう
Javaのおさらい
実習
145
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
これです
146
クラス・メソッド
インスタンス・オブジェクト
継承・多様性(ポリモフィズム)
Javaのおさらい
いままでで分かったこと
100%
おめでとう!
147
これでJavaの基本はおしまいです
Javaのおさらい
100%
148
Javaのおさらい
納得いかない。
多様性って何が便利なの?
149
ウソをついていました
・データベース
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
ウソをついていました
・データベース
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
データベース
Javaのおさらい
Postgre
SQL
MySQL Oracle
色んな製品があります
使い方はそれぞれ違います
152
だけど、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
だけど、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
だけど、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
実際の実装をみてみよう
(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
実際の実装をみてみよう
(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
インターフェースとは
メソッドの中身が
記載されていないクラス
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
インターフェースとは
メソッドの名前・戻り値は記載されている
これを継承(実装)したクラスは、
絶対にインターフェースに存在するメソッ
ドをオーバーライドしなければならない
Javaのおさらい
インターフェースを「継承」する
ことを実装と呼ぶよ
159
インターフェースとは
何が便利なの?
実装するクラスには、
メソッドの名前と戻り値、
つまり、必要な機能(オブジェクトの受け渡し)
を強制できる
Javaのおさらい
160
インターフェースとは
インターフェースを実装しているサブクラスは、インターフェースに書かれている
メソッドを全てオーバーライドしなければならない
Javaのおさらい
MySQLConnecttion
Connection
インターフェース
OracleConnection
PostgreSQLConnection
161
インターフェースとは
インターフェースを実装しているサブクラスは、インターフェースに書かれている
メソッドを全てオーバーライドしなければならない
だから、Connectionインターフェースのことだけ
知っていれば、具体的なクラスの裏の処理の
ことは知らなくても、使い方が分かる!
今まで使ったことのない製品も
同じ方法で使える!
Javaのおさらい
MySQLConnecttion
Connection
インターフェース
OracleConnection
PostgreSQLConnection
162
ポリモフィズムの利点
オブジェクトの受け渡し方法が
同じだから、全部使い方は同じ!
意識しないで、サブクラスを利用できる!
Javaのおさらい
163
ポリモフィズムの利点
もしデータベース製品を変更しても
プログラムの修正箇所はなし!
↓
オブジェクトの受け渡しだけ意識していればよい
相手の処理は関係ない
Javaのおさらい
164
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
これです
165
クラス・メソッド
インスタンス・オブジェクト
継承・多様性(ポリモフィズム)
Javaのおさらい
本当に完了!
100%
おめでとう!
166
Javaのきほん
Javaのおさらい
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
167
流れ
•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();
継承
オーバーライド
179
Strategy(戦略)パターン
あれ、
武器の数が100だとしたら?
180
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
Strategy(戦略)パターン
騎士と山賊も剣を使えたら?
182
剣士
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
剣士
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
Strategy(戦略)パターン
さて、
アップデートで職業クラスに
逃げる機能を付けることになりました
錆びた剣を持つ騎士
fight();
run();
錆びた剣を持った剣士は
逃げ出した!
185
剣士
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
剣士
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
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()
メソッドを実行します
191
Strategy(戦略)パターン
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
Arms
インターフェース
useArms();
3.arm変数に武器オブジェクトを
格納するためのメソッドを準備
192
Strategy(戦略)パターン
Arms
インターフェース
useArms();
普通の剣
useArms();
勇者の剣
useArms();
錆びた剣
useArms();
普通の剣を
使いました!
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
5.具体的な武器クラスを
実装します 継承
193
Strategy(戦略)パターン
完成!
Arms
インターフェース
useArms();
普通の剣
useArms();
勇者の剣
useArms();
錆びた剣
useArms();
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
継承
194
使い方
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
使い方
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
使い方
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
使い方
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
使い方
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
剣士
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
剣士
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
剣士
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
剣士
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
剣士
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
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
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
Strategyパターン
を実装してみよう
207
Javaのおさらい
クラス
メソッド
インスタンス・ オブジェクト
継承
委譲
多様性実はStrategyパターンはこれでした
208
Strategy(戦略)パターン
委譲
オブジェクトが、
他のオブジェクトに
振る舞いをまかせること=
209
Strategy(戦略)パターン
委譲
オブジェクトが、
他のオブジェクトに
振る舞いをまかせること
=
剣士
fight(){
arm.useArms();
}
setArms(Arms a){
arm = a;
}
Arms型のarm変数
armは普通の剣の参照を持っている!!
普通の剣
useArms();
参照
普通の剣を
使いました!
と表示するメソッド
今回は、剣士オブジェクトが普通の剣
オブジェクトに振る舞いを
まかせていました
210
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(Component com)
print()
String name
ArrayList list
String name
Member
実装
219
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
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
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
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
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
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
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
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
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
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
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
Compositeパターン
これでもう、この構造を実現できます
営業1部
営業本部
営業2部
中田
本部長
高橋
副本部長
吉永
部長
田中
鈴木
部長
中島
231
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
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
Compositeパターン
add(Compon
Component
add(Compon
Group
add(Compon
String name String name
Member
どのクラスで、それぞれのオブジェクトを作る?
営業1部
営業本部
営業2部
中田
本部長
高橋
副本部長
吉永
部長
田中
鈴木
部長
中島
Group
Group GroupMemeber
Memeber
Memeber Memeber MemeberMemeber
234
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
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
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
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
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
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
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
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
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
営業本部
出力
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
営業本部
中田本部長
出力
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
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
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
営業本部
中田本部長
高橋副本部長
営業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
営業本部
中田本部長
高橋副本部長
営業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
営業本部
中田本部長
高橋副本部長
営業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
営業本部
中田本部長
高橋副本部長
営業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
営業本部
中田本部長
高橋副本部長
営業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
営業本部
中田本部長
高橋副本部長
営業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
Compositeパターン
ほとんどクラスを作っていないのに、
柔軟な部署の構造を
持たせることが出来た
これも多様性(ポリモフィズム)
のおかげだね
255
そして...
Componentパターンを
理解することが出来たなら、
Javaの基本は理解できている!
256
おつかれさまでした
これでJavaの勉強会は終了です
つかれたあ
257
Javaのきほん
1.すべてクラスで出来ている
2.メソッドには戻り値がある
3.オブジェクトは参照型
4.親クラスと別のことがしたかったらオーバーライド!
5.オブジェクトを中心に考える。
オブジェクトの受け渡しで解決する。
258
応用
Strategyパターン
変動する部分を切り離す
Compositeパターン
容器と中身を同じように扱う
今回は部署を容器、中身をメンバーとして実装しました
ど
ち
どちらも多様性(ポリモフィズム)
を使うことによって実現
259
【補足】
今回やっていないけど
知っておいた方がいいこと
抽象クラス
static
アクセス修飾子
オーバーロード
ぐぐってね!
260
Javaまとめ
オブジェクトの投げ合いで、
たくさんのことが実現できる
261
Thank you!
262

Más contenido relacionado

Destacado

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destacado (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Java基礎勉強会