第 3 回 Java 基本技術講義 クラス構造と生成 33 クラスの概念 前回の基本文法でも少し出てきたが, オブジェクト指向プログラミングは という概念をうまく活用した手法である. C 言語で言う関数に似ている オブジェクト指向プログラミングはこれら状態と振る舞いを持つオブジェクトの概念をソフトウェア開発の中に適用し 様々な機能を実現する クラス= = いろんなプログラムで使いまわせる 34
クラスの概念 クラスの構成要素 クラスの構成要素をクラスのメンバーと呼ぶ オブジェクトが持っている状態を表す. 属性, クラス変数, フィールドともいう 上に実体を作る処理. 初期化処理とも呼ばれる オブジェクトの機能 / 働きを記述してあり, オブジェクトを操作する方法 main が含まれるオブジェクトはプログラムの最初に動作するメソッドである 35 クラスの生成 クラスを使ったプログラミング 最も簡単なは C 言語関数のように呼び出して使う方法 public class Room { int fact = 36; System.out.println( クラス実員は +capa+ です ); public class RoomMain { public static void main(string[] args) { Room T3 = new Room(); //(1) オブジェクトT3の生成 System.out.println( 定員は +T3.fact+ です ); //(2) 変数 teiinの参照 T3.member(); //(3) メソッド member の参照 関数と違うのは, 他のクラスを して使うこと パッケージ名 :lec_003 メインクラス名 :RoomMain サブクラス名 : Room 36
クラスの生成 インスタンス化の手順 クラスは単なる であり, インスタンス化して初めてプログラムが使えるオブジェクトとなる Room T3 = new Room(); オブジェクト変数の宣言 ( クラス名オブジェクト変数 ) 元となるクラスを オブジェクトの生成 (new) 作る命令 オブジェクトの初期化 ( コンストラクタ名 ( 初期化値 )) 中身を入れることで している 37 クラスの生成 クラス生成と上の動作 上の動作は C 言語と同じ考え int aaa = 31; Int aaa int が入る箱を作る aaa 箱の名前は aaa Int aaa =31 箱に中身を入れる aaa 11111 Room T3 = new Room(); Room T3 Room が入る箱を作る T3 箱の名前は T3 Room T3 =new Room 箱に中身を入れる T3 capa member() 違うのは変数だけでなく, も空間に入れる 38
オブジェクトの参照 インスタンス化することにより, オブジェクトが持つメンバ変数やメソッドを使えるようになるインスタンス化されたオブジェクトは外部からのアクセスI/Fを持つオブジェクトとのアクセスをメッセージジと呼ぶ ( プログラム ) テンプレート Roomクラス memberメソッド変数 capa 関連 RoomMainクラス T3.member T3.capa 生成 参照 T3.member() 実行 ( 実行 ) 実体 T3 オブジェクト memberメソッド変数 capa System.out.println AAA.member I/F 参照 T3.capa メッセージ http://www.geocities.jp/objectbrain/messagebrain.html 39 メンバ変数とメソッド public class Room { int fact = 36; System.out.println( クラス実員は +fact+ です ); public class Room { int fact = 36; System.out.println( 欠員 = +calculate(capa, fact)); int calculate(int x, int y) { int answer = x-y; return answer; オブジェクトが持っている状態を保持する変数である. 通常は属性を示すアクセス演算子を伴うが, 詳細は次章で触れる オブジェクトの機能 / 働きを担うものである. 引数受けや返値を戻す機能もある. 当然, 同じクラス内だけのやり取りだけでなく, インスタンス化されているものなら他のクラスから呼ぶこともできる 40
コンストラクタ 様々なメンバ変数を持つオブジェクトを生成する場合, コンストラクタの を利用する. public RoomR { int fact; RoomR( int x) { fact = x; System.out.println( クラス欠員 = +(capa-fact)); 前までの例題のように, とりわけ初期化の必要がない時, クラスにおけるコンストラクタの記述は無くとも良い ( 自動で実行され るが, 値はNULLが入る ) public class RoomMainR { パッケージ名 :lec_004 メインクラス名 :RoomMainR サブクラス名 : RoomR RoomMainRとRoomRは lec_003から中身をコピーして改造しなさい public static void main(string[] args) { RoomR T3 = new RoomR(36); T3.menber(); RoomR W3 = new RoomR(32); R3.menber(); 41 コンストラクタの区別 コンストラクタは名前が同じでも, その引数の違いによって全く違う動作をする. 便利である一方で, 間違えやすいので注意すること! public RoomR { int fact; RoomR( int x) { fact = x; RoomR( ) { System.out.println( 全員います! ); public class RoomMainR { RoomR( int x, int y) { public static void main(string[] args) { capa = x; RoomR T3 = new RoomR(36); fact = y; T3.menber(); System.out.println( もともと +(capa-fact))+ 名い RoomR W3 = new RoomR(32); R3.menber(); RoomR R3 = new RoomR(); RoomR A3 = new RoomR(38,32); 32); ません ); System.out.println( クラス欠員 = +(capa-fact)); 42
クラスのまとめ クラスはテンプレートであり, インスタンス化して初めて使える クラス名オブジェクト変数 = new コンストラクタ名 ( 初期化値 ); main を含むクラスは自動的にインスタンス化される クラスには以下の特性が含まれる コンストラクタ 初期化する動作メンバ変数 クラスの特性を定義する変数メソッド クラスの動作を定義する関数 インスタンス化されたクラスはオブジェクトと呼ばれる実行モジュールとなる オブジェクト変数. メンバ変数 ; 43 クラスの理解度チェック クラス生成の理解度チェック 以下のプログラムを作成しなさい パッケージ名 :task_003 メインクラス名 :CalMain サブクラス名 : Calculate クラスはCalculateとCalMainを作る Calculate では pi=3.14 をメンバ変数とする Calculateでは円の面積と球の体積を求めるメソッドを作る 円の面積はコンストラクタで与えられた半径 rで計算し, 結果を表示する 球の体積は引数として与えられる半径で r 計算し, 結果を返す CalMainでは半径 rを入力させる CalMainではAAAオブジェクトを作る CalMainで与えられたrをコンストラクタでCalculateに与える CalMainから円の面積のメソッドを参照する ( 結果も表示される ) CalMainから球の体積のメソッドをrの引数付で参照する CalMainで球の体積の結果を表示する ここまでの概念を十分理解できないと, 先では混乱するのみ 44