第4回 クラスとインスタン ス
~手続き指向からオブジェクト指向へ
( )
Ⅰ ~学習目標
クラスとインスタンスの簡単な説明が できる
クラスとインスタンスの違いを説明できる
クラスとインスタンスを使って、変数をま とめたプログラムが書ける
クラスとインスタンスを使って、メソッド をまとめたプログラムが書ける
そろそろ商品名、価格を扱お う
1001 は販売中です 1003 は販売中です
1001: コーラ :120 円は販売中です
1003: お茶 :120 円は販売中です
引数がいっぱい
例題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)
意味が明確なプログラムに
本当にやりたいこと
「商品種類」を「追加」する
データは意味ごとにまとめる
配列とのちがいは?
商品番号 =1001
商品名 =" コーラ "
価格 =120
商品番号 =1002
商品名 =" ソーダ "
価格 =120
商品番号 =1003
商品名 =" お茶 "
価格 =120
オブジェクトとして考えよう
コイツラはみなオブジェクト(もの)
意味のあるデータをまとめてオブジェ クトにする→オブジェクト指向の基本 です
商品番号 =1001
商品名 =" コーラ "
価格 =120
商品番号 =1002
商品名 =" ソーダ "
価格 =120
商品番号 =1003
商品名 =" お茶 "
価格 =120
オブジェクトを作るには?
Java
によるオブジェクト指向プログラ ミングでは、いきなりオブジェクトは 作れません。クラスという概念を使います
クラスって何?(1)
オブジェクトを製造する型のことです
。
型がないとオブジェクトは作れない。インスタンス化
クラス(タイヤキの型) インスタンス
(実際のタイヤキ)
クラスって何?(2)
クラスは、「変数」を複数まとめて セットで定義することができます。
int 商品番号 ; String 商品名 ; int 価格 ;
クラスとインスタンスを使お う!
今回は、クラスとインスタンスを使っ て、商品名と商品番号をセットで扱い ましょう。
商品番号 =1002
商品名 =" ソーダ "
価格 =120
商品番号 =1001
商品名 =" コーラ "
価格 =120
商品番号 =1003
商品名 =" お茶 "
価格 =120
クラス インスタンス
int 商品番号 ; String 商品名 ; int 価格 ;
Java でプログラミングしてみ よう!
1. クラスを定義する
2. クラスをインスタンス化してオブジェ クトを作る
3. オブジェクトの変数に代入する
クラスを定義する ( 1 )
/*** 商品種類クラス
*/
public class ItemType{
① そのクラスの「可視性」(あとで説明します)を定義します。}
② 「クラス」を定義しますよと言う意味です。省略できません。
③ クラスの名前です。省略できません。任意の名前を付ける ことができますが、慣習として、頭文字は大文字にします。
(第1回の命名規則を参考に)
① ② ③
クラスを定義する(2)
変数を定義します
public class ItemType{
int id;// 商品番号
String name;// 商品名 int price;// 価格
}
商品番号を整数型 (int) で 商品名を文字列型 (String)
価格を整数型 (int) で定義します
< 商品種類 >
商品番号:
商品名:価格 :
これらをクラス の“属性”と呼び ます
クラスごとに別ファイルに
Example4_1.java ItemType.java
public class Example4_1{
… … }
public class ItemType{
… …}
ファイル名とクラス名を同じにすること!
クラス完成!
これでクラスは完成です。
ItemType
クラスを使うプログラム(Example4_1)
をコンパイルすれば、自動 的にItemType
もコンパイルされます。 ただし、同じフォルダに入れておくこと!
オブジェクトを作る
オブジェクトは
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
クラスは変数の型になる
クラスは
int,String
などと同じように変 数の型として考えます。ItemType cola;
cola
ItemType 型 cola という名前の、
ItemType が入る変数を宣言する
オブジェクトを生成する
オブジェクトを一つ作るには、
new
演 算子を使います。new ItemType();
id=name=
price=
ItemType クラスのオブジェクトを
一つ作る
ItemType cola = new ItemType();
オブジェクトに名前を付ける
作っただけでは使えません。宣言しておいた変数に 代入するとオブジェクトに名前を付けることができ ます。
cola
ItemType 型
id=name=
price=
ItemType cola;
cola = new ItemType();
1 行で書くと
オブジェクトが持つ変数に代入する には
cola
ItemType 型
id=1001 name=
price=
「オブジェクト名
.
変数名」cola.id = 1001;
cola という変数に入っている
オブジェクトの、 id 変数に 1001 を代入する
オブジェクトを作って
表示するだけのプログラム
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)
前回のプログラムで
商品名を扱えるようにする
前回までのプログラムでは、
int
の配列 を使って、商品種類の管理を行いまし た。 手続き指向になっているカナ??
今回は、
ItemType
の配列を使って、商 品種類の管理を行います。 商品名が扱えるようになります。
ItemType の配列を作る
itemTypeArray( 配列全体の名前 )
ItemType 型 [0] [1] [2] [3] [4] [5]
続くよ
クラスの配列を作る (Java での記法 )
int
の時と基本的には同じです。ItemType 型
ItemType[] itemTypeArray = new ItemType[10];
[0] [1] [2] [3] [4] [5]
続くよ
int の配列との大きな違い
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 0 0 0 0 0
0 0
0 int 型
int
の配列のとき、配列には初期値として、0
が入りました。ItemType 型の初期値
ItemType 型
初期値には「何も入っていません!!」
オブジェクトが何も入っていない状態のことを null といいます。
だから前回までは「 -1 が入っていたら、商品種類リストが入っていない」
ということでしたが、
今回からは「何も入っていなかった (null) ら、商品種類リストが 入っていない」ということになります。
[0] [1] [2] [3] [4] [5]
続くよ
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
入ってない (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;
}}
Java の文法復習⑦ 例外
前ページのプログラムを実行すると、
NullPointerException
と表示がでてプログラムが とまります。 これは、オブジェクトが入っていないのに代入 / 参照 したので、処理できません。プログラムを終了します。
という意味です。あなたのプログラムのバグです。
この他にも例外があります。
ArrayIndexOutOfBoundsException は、配列にはない 番地(例えば 10 個の配列の [10] )を読もうとしまし たよという意味です。あなたのプログラムのバグです
。
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)
追加メソッドの変更
前回までの プログラム 今回のプログラム
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;
} }
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)
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;
コンストラクタ(1)宣言
// 簡単なコンストラクタをつけた ItemType クラス public class ItemType{
int id;
String name;
int price;
public ItemType(){
}
} ☆ クラス名と同じ名前で、メソッドのようなものを 宣言します。
☆ メソッドと違って void などの返り値宣言 がいりません。( static もいりません)
同じ名前にすること!
例題4-4 (ItemType.java)
コンストラクタ(2)引数
// 引数をつけたコンストラクタのある ItemType クラス public class ItemType{
int id;
String name;
int price;
public ItemType(int newId,String newName,int newPrice){
} }
コンストラクタにも引数を書くことができます。
例題4-4 (ItemType.java)
コンストラクタ(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)
属性はクラススコープの変数
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;
} }
// コンストラクタを呼び出してインスタンス化する例のプログラム 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)
もっと簡略化
// 前ページの例を余計な変数を使わないようにしたプログラム public class Example{
public static void main(String[] args){
ItemType[] itemTypeArray = new ItemType[10];
add(itemTypeArray, new ItemType(1001,” コーラ” ,120));
}
…} cola という変数をあとで使う必要がないので、
インスタンス化して、そのままメソッドの実引数 として使います。
ここまででできたプログラム
コンストラクタを使ったリスト
例題
4-4(ItemType.java)
main()
をコンストラクタを呼び出すことで読みやすくし、追加されているか どうか確認するために、表示メソッド を付け加えたリスト
例題
4-4(Example4_4.java)
クラスを利用して
プログラムを分割する
クラス(オブジェクト)はメソッドも 持つことができる
クラスは変数のほかに、メソッドも複数ま とめてセットで取り扱うことができます。
main() add()
display()
… Example クラス
クラスを利用して
プログラムを分割する
5
つのメソッドをプログラムの意味を考 えて分類するとしたらどうなりますか? Example{
main();
add();
delete();
search();
display();
}
商品種類の管理役
Example{
main();
add();
delete();
search();
display();
}
「商品種類リスト」クラスを作り、商 品管理のメソッドを移して、仕事を分 担しましょう。Example{
main();
}
ItemTypeList{
add();
delete();
search();
display();
商品種類リスト (ItemTypeList)}
クラス導入
導入した 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)
メソッドが
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)
「クラスとオブジェクト」ま とめ
クラスはオブジェクトを作るための型で ある
クラスからオブジェクトが生成される
雛型がクラスで、実際に値をもつのはオブ ジェクト
クラスは変数をまとめたり、メソッドを まとめたりすることができる。
クラスは変数の型になる