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

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
プログラミング基礎I(再) 山元進.
Applet 岡部 祐典 鈴木 敬幸.
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
第14回 GUIの構成とイベント・ドリブン ~GUIを使ったプログラム(Ⅰ)~.
構造体.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
オブジェクト指向入門.
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
コンパイラの解析 (2) GCJのデータ構造 - 1.
~手続き指向からオブジェクト指向へ[Ⅱ]~
第11回 アプリケーションの構成 ~CUI自動販売機の完成!~.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test5)】
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
第1回 プログラムの基本 他人が読めるプログラムを書く.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
5.9 メソッドのオーバーロード 5.10 変数の引渡し 2003/11/21 紺野憲一
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
オブジェクト プログラミング 第2回 プログラムの基本.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
ポインタとポインタを用いた関数定義.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとプログラミング (Algorithms and Programming)
サブゼミ第7回 実装編① オブジェクト型とキャスト.
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
オブジェクト・プログラミング 第10回 オブジェクト指向設計のキモ.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

~手続き指向からオブジェクト指向へ(Ⅰ)~ 第4回 クラスとインスタンス ~手続き指向からオブジェクト指向へ(Ⅰ)~

学習目標 クラスとインスタンスの簡単な説明ができる クラスとインスタンスの違いを説明できる クラスとインスタンスを使って、変数をまとめたプログラムが書ける クラスとインスタンスを使って、メソッドをまとめたプログラムが書ける

そろそろ商品名、価格を扱おう 1001は販売中です 1003は販売中です 1001:コーラ:120円は販売中です 1003:お茶:120円は販売中です

引数がいっぱい public static void add(int[] targetArray,int addID) 先週 (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 商品名="コーラ" 商品番号=1002 商品名="ソーダ" 価格=120

オブジェクトとして考えよう 意味のあるデータをまとめてオブジェクトにする→オブジェクト指向の基本です コイツラはみなオブジェクト(もの) 商品番号=1003 商品名="お茶" 価格=120 商品番号=1001 商品名="コーラ" 価格=120 商品番号=1002 商品名="ソーダ" 価格=120

オブジェクトを作るには? Javaによるオブジェクト指向プログラミングでは、いきなりオブジェクトは作れません。 クラスという概念を使います

クラスって何?(1) オブジェクトを製造する型のことです。 型がないとオブジェクトは作れない。 インスタンス化 クラス (タイヤキの型) (実際のタイヤキ)

クラスって何?(2) クラスは、「変数」を複数まとめてセットで定義することができます。 int 商品番号; String 商品名;

クラスとインスタンスを使おう! 今回は、クラスとインスタンスを使って、商品名と商品番号をセットで扱いましょう。 クラス インスタンス 商品番号=1001 商品名="コーラ" 価格=120 int 商品番号; String 商品名; int 価格; 商品番号=1003 商品名="お茶" 価格=120 商品番号=1002 商品名="ソーダ" 価格=120 クラス インスタンス

Javaでプログラミングしてみよう! クラスを定義する クラスをインスタンス化してオブジェクトを作る オブジェクトの変数に代入する

クラスを定義する(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{ …  … } Example4_1.java ItemType.java ファイル名とクラス名を同じにすること!

クラス完成! これでクラスは完成です。 ItemTypeクラスを使うプログラム(Example4_1)をコンパイルすれば、自動的にItemTypeもコンパイルされます。 ただし、同じフォルダに入れておくこと!

オブジェクトを作る オブジェクトはExample4_1クラスのmain()メソッドで作ります。 例題4-1 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

オブジェクトを生成する オブジェクトを一つ作るには、new演算子を使います。 new ItemType(); id= name= price= ItemTypeクラスのオブジェクトを 一つ作る

オブジェクトに名前を付ける 作っただけでは使えません。宣言しておいた変数に代入するとオブジェクトに名前を付けることができます。 id= name= price= ItemType cola; cola = new ItemType(); cola ItemType型 1行で書くと ItemType cola = new ItemType();

オブジェクトが持つ変数に代入するには 「オブジェクト名.変数名」 cola.id = 1001; cola ItemType型 name= price= cola ItemType型 cola.id = 1001; colaという変数に入っている オブジェクトの、id変数に1001を代入する

オブジェクトを作って 表示するだけのプログラム 例題4-2 (Example4_2.java) 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+"は販売中です"); }

前回のプログラムで 商品名を扱えるようにする 前回までのプログラムでは、intの配列を使って、商品種類の管理を行いました。 手続き指向になっているカナ?? 今回は、ItemTypeの配列を使って、商品種類の管理を行います。 商品名が扱えるようになります。

ItemTypeの配列を作る [0] [1] [2] [3] [4] [5] 続くよ ItemType型 itemTypeArray(配列全体の名前)

クラスの配列を作る (Javaでの記法) intの時と基本的には同じです。 [0] [1] [2] [3] [4] [5] 続くよ ItemType型 ItemType[] itemTypeArray = new ItemType[10];

intの配列との大きな違い intの配列のとき、配列には初期値として、 0が入りました。 [0] [1] [2] [3] [4] [5] [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] int型 intの配列のとき、配列には初期値として、 0が入りました。

ItemType型の初期値 [0] [1] [2] [3] [4] [5] 続くよ ItemType型 初期値には「何も入っていません!!」 オブジェクトが何も入っていない状態のことをnullといいます。 だから前回までは「-1が入っていたら、商品種類リストが入っていない」 ということでしたが、 今回からは「何も入っていなかった(null)ら、商品種類リストが 入っていない」ということになります。

ItemType配列への代入 [0] [1] [2] [3] [4] [5] 続くよ 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メソッドの変更 まだ3つだからいいけど、 たくさんになったら大変だ。 何とか見やすく方法は ないかな? 例題4-3 (Example4_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; まだ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)宣言 //簡単なコンストラクタをつけたItemTypeクラス public class ItemType{ 例題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){ } コンストラクタにも引数を書くことができます。

id,name,priceに値が代入されます。 コンストラクタ(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に値が代入されます。

属性はクラススコープの変数 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)呼び出し 1001と"コーラ"と120が実引数として渡され、 コンストラクタが呼ばれることによって、 例題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オブジェクトに変数が既に代入されています

もっと簡略化 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{ main(); add(); delete(); search(); display(); } Example{ main(); } ItemTypeList{ add(); delete(); search(); display(); 商品種類リスト(ItemTypeList) クラス導入

導入したItemTypeListクラス インスタンス化する オブジェクトの メソッドには staticがいりません 例題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; } //商品種類を表示するメソッド public void display(ItemType[] targetArray){ if(targetArray[i] != null){//商品が入っている System.out.println(targetArray[i].name+"は販売中です"); インスタンス化する オブジェクトの メソッドには staticがいりません

メソッドが 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); } インスタンス化された オブジェクトの メソッドの呼び出し オブジェクト名.メソッド名()

他のオブジェクトの メソッドの呼び出し オブジェクト名.メソッド名(引数) まずItemTypeListクラスのitemTypeListオブジェクト生成 //商品種類リストオブジェクトをインスタンス化する ItemTypeList itemTypeList = new ItemTypeList(); 作ったitemTypeListオブジェクトのaddメソッドを呼ぶ //商品種類を追加する itemTypeList.add(itemTypeArray,new ItemType(1001,"コーラ")); (リスト「Example4_5.java」より)

「クラスとオブジェクト」まとめ クラスはオブジェクトを作るための型である クラスは変数をまとめたり、メソッドをまとめたりすることができる。 クラスからオブジェクトが生成される 雛型がクラスで、実際に値をもつのはオブジェクト クラスは変数をまとめたり、メソッドをまとめたりすることができる。 クラスは変数の型になる