第4回 クラスとオブジェクト

第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);
}
}
「クラスとオブジェクト」まとめ

クラスはオブジェクトを作るための型である




クラスからオブジェクトが生成される
雛型がクラスで、実際に値をもつのはオブジェ
クト
クラスは変数をまとめたり、メソッドをまとめ
たりすることができる。
クラスは変数の型になる