• 検索結果がありません。

第4回 クラスとインスタン ス

N/A
N/A
Protected

Academic year: 2021

シェア "第4回 クラスとインスタン ス"

Copied!
48
0
0

読み込み中.... (全文を見る)

全文

(1)

第4回 クラスとインスタン ス

~手続き指向からオブジェクト指向へ

( )

Ⅰ ~

(2)

学習目標

クラスとインスタンスの簡単な説明が できる

クラスとインスタンスの違いを説明できる

クラスとインスタンスを使って、変数をま とめたプログラムが書ける

クラスとインスタンスを使って、メソッド をまとめたプログラムが書ける

(3)

そろそろ商品名、価格を扱お う

1001 は販売中です 1003 は販売中です

1001: コーラ :120 円は販売中です

1003: お茶 :120 円は販売中です

(4)

引数がいっぱい

例題4-1

(Example4_1.java)

public static void add(int[]

targetIdArray,String[]targetNameArray,

int[] targetPriceArray,int addID, String addName,int addPrice)

(Example3_2.java先週

public static void add(int[] targetArray,int addID)

(5)

意味が明確なプログラムに

本当にやりたいこと

「商品種類」を「追加」する

(6)

データは意味ごとにまとめる

配列とのちがいは?

商品番号 =1001

商品名 =" コーラ "

価格 =120

商品番号 =1002

商品名 =" ソーダ "

価格 =120

商品番号 =1003

商品名 =" お茶 "

価格 =120

(7)

オブジェクトとして考えよう

コイツラはみなオブジェクト(もの)

意味のあるデータをまとめてオブジェ クトにする→オブジェクト指向の基本 です

商品番号 =1001

商品名 =" コーラ "

価格 =120

商品番号 =1002

商品名 =" ソーダ "

価格 =120

商品番号 =1003

商品名 =" お茶 "

価格 =120

(8)

オブジェクトを作るには?

Java

によるオブジェクト指向プログラ ミングでは、いきなりオブジェクトは 作れません。

クラスという概念を使います

(9)

クラスって何?(1)

オブジェクトを製造する型のことです

型がないとオブジェクトは作れない。インスタンス化

クラス(タイヤキの型) インスタンス

(実際のタイヤキ)

(10)

クラスって何?(2)

クラスは、「変数」を複数まとめて セットで定義することができます。

int 商品番号 ; String 商品名 ; int 価格 ;

(11)

クラスとインスタンスを使お う!

今回は、クラスとインスタンスを使っ て、商品名と商品番号をセットで扱い ましょう。

商品番号 =1002

商品名 =" ソーダ "

価格 =120

商品番号 =1001

商品名 =" コーラ "

価格 =120

商品番号 =1003

商品名 =" お茶 "

価格 =120

クラス インスタンス

int 商品番号 ; String 商品名 ; int 価格 ;

(12)

Java でプログラミングしてみ よう!

1. クラスを定義する

2. クラスをインスタンス化してオブジェ クトを作る

3. オブジェクトの変数に代入する

(13)

クラスを定義する ( 1 )

/*** 商品種類クラス

*/

public class ItemType{

そのクラスの「可視性」(あとで説明します)を定義します。}

「クラス」を定義しますよと言う意味です。省略できません。

クラスの名前です。省略できません。任意の名前を付ける ことができますが、慣習として、頭文字は大文字にします。

(第1回の命名規則を参考に)

①   ②   ③

(14)

クラスを定義する(2)

変数を定義します

public class ItemType{

  int id;// 商品番号

String name;// 商品名 int price;// 価格

}

商品番号を整数型 (int) 商品名を文字列型 (String)

価格を整数型 (int) で定義します

< 商品種類 >

商品番号:

商品名:価格 :

これらをクラス “属性”と呼び ます

(15)

クラスごとに別ファイルに

Example4_1.java ItemType.java

public class Example4_1{

        …     … }

public class ItemType{

  …}

ファイル名とクラス名を同じにすること!

(16)

クラス完成!

これでクラスは完成です。

ItemType

クラスを使うプログラム

(Example4_1)

をコンパイルすれば、自動 的に

ItemType

もコンパイルされます。

ただし、同じフォルダに入れておくこと!

(17)

オブジェクトを作る

オブジェクトは

Example4_1

クラスの

main()

メソッドで作ります。

public class Example4_1 {

public static void main(String[] args) { // 商品種類(コーラ)をインスタンス化する

ItemType cola;

cola = new ItemType();

cola.id = 1001;

cola.name = “ コーラ” ;    cola.price=120;

} }

例題 4-1

(18)

クラスは変数の型になる

クラスは

int,String

などと同じように変 数の型として考えます。

ItemType cola;

cola

ItemType 型 cola という名前の、

ItemType が入る変数を宣言する

(19)

オブジェクトを生成する

オブジェクトを一つ作るには、

new

算子を使います。

new ItemType();

id=name=

price=

ItemType クラスのオブジェクトを

一つ作る

(20)

ItemType cola = new ItemType();

オブジェクトに名前を付ける

作っただけでは使えません。宣言しておいた変数に 代入するとオブジェクトに名前を付けることができ ます。

cola

ItemType 型

id=name=

price=

ItemType cola;

cola = new ItemType();

1 行で書くと

(21)

オブジェクトが持つ変数に代入する には

cola

ItemType 型

id=1001 name=

price=

「オブジェクト名

.

変数名」

cola.id = 1001;

cola という変数に入っている

オブジェクトの、 id 変数に 1001 を代入する

(22)

オブジェクトを作って

表示するだけのプログラム

public class Example4_2 {

//メイン

public static void main(String[] args) { //自動販売機プログラムの開始を知らせる

System.out.println(“自動販売機のサービスを開始しました。 ");

// 商品種類を追加する

// コーラ商品種類クラスをインスタンス化(生成)して追加する ItemType cola = new ItemType();

cola.id = 1001;

cola.name = "コーラ ";

cola.price = 120;

//コーラを表示してみる

System.out.println(cola.id+":"+cola.name+":"+cola.price+" は販売中です ");

} }

例題4-2

(Example4_2.java)

(23)

前回のプログラムで

商品名を扱えるようにする

前回までのプログラムでは、

int

の配列 を使って、商品種類の管理を行いまし た。

手続き指向になっているカナ??

今回は、

ItemType

の配列を使って、商 品種類の管理を行います。

商品名が扱えるようになります。

(24)

ItemType の配列を作る

itemTypeArray( 配列全体の名前 )

ItemType [0] [1] [2] [3] [4] [5]

続くよ

(25)

クラスの配列を作る (Java での記法 )

int

の時と基本的には同じです。

ItemType

ItemType[] itemTypeArray = new ItemType[10];

[0] [1] [2] [3] [4] [5]

続くよ

(26)

int の配列との大きな違い

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

0 0 0 0 0 0 0

0 0

0 int

int

の配列のとき、配列には初期値として、

0

が入りました。

(27)

ItemType 型の初期値

ItemType

初期値には「何も入っていません!!」

オブジェクトが何も入っていない状態のことを null といいます。

だから前回までは「 -1 が入っていたら、商品種類リストが入っていない」

ということでしたが、

今回からは「何も入っていなかった (null) ら、商品種類リストが 入っていない」ということになります。

[0] [1] [2] [3] [4] [5]

続くよ

(28)

ItemType 配列への代入

ItemType[] itemTypeArray = new ItemType[10];// 配列を作る itemTypeArray[0] = new ItemType();//ItemType オブジェクト       を作って配列へ代入

itemTypeArray[0].id = 1001;

itemTypeArray[0].name = “ コーラ” ;

[0] [1] [2] [3] [4] [5]

続くよ

id=1001

name="コーラ "

price=120

(29)

入ってない (null の )

変数に、代入 / 参照するな!

次のプログラムを実行してみましょう

// これはまずいプログラム

public class FailProgram{

public static void main(String[] args){

ItemType[] itemTypeArray = new ItemType[10];// 配列を作る //itemTypeArray[0] null

itemTypeArray[0].id = 1001;

itemTypeArray[0].name = “ コーラ” ; itemTypeArray[0].price = 120;

}}

(30)

Java の文法復習⑦ 例外

前ページのプログラムを実行すると、

NullPointerException

と表示がでてプログラムが とまります。

これは、オブジェクトが入っていないのに代入 / 参照 したので、処理できません。プログラムを終了します。

という意味です。あなたのプログラムのバグです。

この他にも例外があります。

ArrayIndexOutOfBoundsException は、配列にはない 番地(例えば 10 個の配列の [10] )を読もうとしまし たよという意味です。あなたのプログラムのバグです

(31)

ItemType 配列を

使った今回の管理プログラム

追加だけを行うプログラム

/** * 商品種類を追加する

*/ public static void add(ItemType[] targetArray,ItemType addItemType){

// 商品種類が入っていない箱をさがして格納する for(int i=0;i<10;i++){

if(targetArray[i] == null){// 入っていない targetArray[i] = addItemType;// 書き込む break;

} } }

例題4-3

(Example4_3.java)

(32)

追加メソッドの変更

前回までの プログラム 今回のプログラム

public static void add(ItemType[] targetArray,ItemType addItemType){

// 商品種類が入っていない箱を探して格納する for(int i=0;i<10;i++){

if(targetArray[i] == null){// 入っていない targetArray[i] = addItemType;//書き込む break;

} } }

public static void add(int[] targetArray,int addId){

// 商品種類が入っていない箱を探して格納する for(int i=0;i<10;i++){

if(targetArray[i] == -1){// 入っていない targetArray[i] = addId;// 書き込む

break;

} }

(33)

main メソッドの変更

// 商品種類をインスタンス化する // コーラ

ItemType cola = new ItemType();

cola.id = 1001;

cola.name = “ コーラ” ; cola.price = 120;

// ソーダ

ItemType soda = new ItemType();

soda.id = 1002;

soda.name = “ ソーダ” ; soda.price = 120;

// お茶

ItemType greentea = new ItemType();

greentea.id = 1003;

greentea.name = “ お茶” ; greentea.price = 120;

まだ3つだからいいけど、

たくさんになったら大変だ。

何とか見やすく方法は ないかな?

例題4-3

(Example4_3.java)

(34)

Java の文法復習⑧ コンストラクタ

コンストラクタを使って読みやすくす // 商品種類をインスタンス化する

// コーラ

ItemType cola = new ItemType();

cola.id = 1001;

cola.name = “ コーラ” ; cola.price = 120;

// ソーダ

ItemType soda = new ItemType();

soda.id = 1002;

soda.name = “ ソーダ” ; soda.price = 120;

// お茶

ItemType greentea = new ItemType();

greentea.id = 1003;

greentea.name = “ お茶” ; greentea.price = 120;

(35)

コンストラクタ(1)宣言

// 簡単なコンストラクタをつけた ItemType クラス public class ItemType{

int id;

String name;

int price;

public ItemType(){

}

} ☆ クラス名と同じ名前で、メソッドのようなものを 宣言します。

メソッドと違って void などの返り値宣言 がいりません。( static もいりません)

同じ名前にすること!

例題4-4 (ItemType.java)

(36)

コンストラクタ(2)引数

// 引数をつけたコンストラクタのある ItemType クラス public class ItemType{

int id;

String name;

int price;

public ItemType(int newId,String newName,int newPrice){

} }

コンストラクタにも引数を書くことができます。

例題4-4 (ItemType.java)

(37)

コンストラクタ(3)代入

// 引数を代入するコンストラクタを持つ ItemType クラス public class ItemType{

int id;

String name;

int price;

public ItemType(int newId,String newName,int newPrice){

id = newId;

name = newName;

price = newPrice;

}

} id,name,price に値が代入されます。

例題4-4 (ItemType.java)

(38)

属性はクラススコープの変数

id name price の有効範囲

// 引数を代入するコンストラクタを持つ ItemType クラス public class ItemType{

int id;

String name;

int price;

public ItemType(int newId,String newName,int newPrice){

id = newId;

name = newName;

price = newPrice;

} }

(39)

// コンストラクタを呼び出してインスタンス化する例のプログラム public class Example{

public static void main(String[] args){

ItemType[] itemTypeArray = new ItemType[10];

ItemType cola = new ItemType(1001,” コーラ” ,120);

add(itemTypeArray, cola);

} }

コンストラクタ(4)呼び出し

1001 と " コーラ " と 120 が実引数として渡され、

コンストラクタが呼ばれることによって、

できたての cola オブジェクトに変数が既に代入されています

例題4-4

(Example4_4.java)

(40)

もっと簡略化

// 前ページの例を余計な変数を使わないようにしたプログラム public class Example{

public static void main(String[] args){

ItemType[] itemTypeArray = new ItemType[10];

add(itemTypeArray, new ItemType(1001,” コーラ” ,120));

}

} cola という変数をあとで使う必要がないので、

インスタンス化して、そのままメソッドの実引数 として使います。

(41)

ここまででできたプログラム

コンストラクタを使ったリスト

例題

4-4(ItemType.java)

main()

をコンストラクタを呼び出すこ

とで読みやすくし、追加されているか どうか確認するために、表示メソッド を付け加えたリスト

例題

4-4(Example4_4.java)

(42)

クラスを利用して

プログラムを分割する

クラス(オブジェクト)はメソッドも 持つことができる

クラスは変数のほかに、メソッドも複数ま とめてセットで取り扱うことができます。

main() add()

display()

… Example クラス

(43)

クラスを利用して

プログラムを分割する

5

つのメソッドをプログラムの意味を考 えて分類するとしたらどうなります

か? Example{

main();

add();

delete();

search();

display();

}

(44)

商品種類の管理役

Example{

main();

add();

delete();

search();

display();

}

「商品種類リスト」クラスを作り、商 品管理のメソッドを移して、仕事を分 担しましょう。Example{

main();

}

ItemTypeList{

add();

delete();

search();

display();

商品種類リスト (ItemTypeList)}

クラス導入

(45)

導入した ItemTypeList クラス

public class ItemTypeList { // 商品種類を追加するメソッド

public void add(ItemType[] targetArray,ItemType addItemType){

//商品種類が入っていない箱を探す for(int i=0;i<10;i++){

if(targetArray[i] == null){//入っていない targetArray[i] = addItemType;//書き込む break;

} } }

// 商品種類を表示するメソッド

public void display(ItemType[] targetArray){

for(int i=0;i<10;i++){

if(targetArray[i] != null){//商品が入っている

System.out.println(targetArray[i].name+"は販売中です ");

} } } }

インスタンス化する オブジェクトの

メソッドには

static がいりません

例題4-5

(Example4_5.java)

(46)

メソッドが

main ()だけになった Example

public class Example4_5 {

public static void main(String[] args) { //自動販売機プログラムの開始を知らせる

System.out.println("自動販売機が開始しました。 ");

//商品種類を保存するための配列を定義する

ItemType[] itemTypeArray = new ItemType[10];

//商品種類リストを生成する

ItemTypeList itemTypeList = new ItemTypeList();

//商品種類を追加する

itemTypeList.add(itemTypeArray,new ItemType(1001,"コーラ "));

itemTypeList.add(itemTypeArray,new ItemType(1022,"ソーダ "));

itemTypeList.add(itemTypeArray,new ItemType(1033,"お茶 "));

// 商品種類リストを表示する

itemTypeList.display(itemTypeArray);

} }

インスタンス化された オブジェクトの

メソッドの呼び出し

オブジェクト名 . メソッド名 ()

例題4-5

(Example4_5.java)

(47)

「クラスとオブジェクト」ま とめ

クラスはオブジェクトを作るための型で ある

クラスからオブジェクトが生成される

雛型がクラスで、実際に値をもつのはオブ ジェクト

クラスは変数をまとめたり、メソッドを まとめたりすることができる。

クラスは変数の型になる

参照

関連したドキュメント

ROKU KYOTO Autumn Parfait ~ Shine muscat &amp; Jasmine tea ~ ROKU KYOTO

Tsouli, Infinitely many solutions for nonlocal elliptic p-Kirchhoff type equation under Neumann boundary condition, Int. Journal

それでは資料 2 ご覧いただきまして、1 の要旨でございます。前回皆様にお集まりいただ きました、昨年 11

第20回 4月 知っておきたい働くときの基礎知識① 11名 第21回 5月 知っておきたい働くときの基礎知識② 11名 第22回 6月

高圧ガス移動防災対策については、事業者によって組織されている石川県高圧ガス地域防災協議

第7回 第8回 第9回 第10回

第6回赤潮( Skeletonema costatum 、 Mesodinium rubrum 第7回赤潮( Cryptomonadaceae ) 第7回赤潮(Cryptomonadaceae). 第8回赤潮( Thalassiosira

・生物多様性の損失も著しい。世界の脊椎動物の個体数は 1970 年から 2014 年ま での間に 60% 減少した。また、世界の天然林は 2010 年から 2015 年までに年平 均 650