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