プログラミング言語 3 第 04 回 (2007 年 10 月 15 日 ) 1 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/33 1
今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/java06/ にアクセスすると 教材があります 2007 年 10 月 15 日分と書いてある部分が 本日の教材です 本日の内容 クラスとインストラクタ ( 復習 ) 前回の課題の解答 static コンストラクタ メソッドのオーバーロード 3/33 オブジェクト指向プログラミング ( 復習 ) 4/33 2
オブジェクト指向プログラミング データをやり取りするオブジェクトの集合として構成されるプログラム インスタンス間でデータをやりとりする それぞれのインスタンスが処理を行う main 関数のように使えるクラス データを持ったり 処理したりする インスタンス A インスタンス C データをやりとり インスタンス B 5/33 オブジェクトって何? Java 編 概念とか設計図の世界 変数 Test クラス コンストラクタ int contents; contests=0; メソッド popcontests(); メソッド Data1 Data2 実物 ( オブジェクト ) の世界 インスタンス contents = 10; メソッド popcontests(); contents = 20; Java だとインスタンスと呼ぶ メソッド popcontests(); インスタンス 6/33 3
Java のプログラム プログラムは 1 つ以上のクラスを持ちます クラスは 変数とコンストラクタ メソッドを伴っています それぞれ 省略可能です メソッド main を持つクラスが 必ず必要です インスタンス ( 物体 ) を生成するためには クラス ( 設計図 ) が必要 1. クラスを書く 2. インスタンスを生成する 3. 処理を行う プログラムクラス変数の宣言コンストラクタメソッドクラス変数の宣言コンストラクタメソッド 7/33 クラスの書き方 1. クラスを書く 2. インスタンスを生成する 3. 実際に使ってみる 必要なら修飾子を書く ( クラスの修飾子については次回以降 ) class Test Test { int test01; class と書く class 名を書く 変数やメソッドをクラスのメンバと言います 変数を宣言する コンストラクタを書く 今日の話の後半で説明 public void push(int test03){ System.out.println(test01 + test03); メソッドを書く 8/33 4
メソッドの書き方 修飾子以外は C 言語の関数の書き方に似ています 修飾子を書く必要ならstaticと書く 返値の型を書くメソッド名を書く引数を書く public void void push(int test03){ System.out.println(test01 + test03); 1. クラスを書く 2. インスタンスを生成する 3. 実際に使ってみる メソッドの中でのみ使用する変数の定義を書く 返値が有る場合は C と同様 return で返す 9/33 インスタンスの生成 1. クラスを書く 2. インスタンスを生成する 3. 実際に使ってみる 宣言と生成を行う必要がある 宣言の仕方 : クラス名インスタンス名 ; 生成の仕方 : インスタンス名 = new クラス名 (); 例えば クラス Test のインスタンス dt を生成するなら Test dt; dt = new Test(); とする 10/33 5
使い方 1. クラスを書く 2. インスタンスを生成する 3. 実際に使ってみる インスタンスのメンバにアクセスするには インスタンス名.. メンバ名 とする たとえば クラス Test に整数型の変数 test01 という変数があって クラス Test のインスタンス dt を生成した場合 dt.test01 としてアクセスできる 前回の課題の解答 12/33 6
その 1: 前回の課題 オブジェクト指向プログラミングについて 自分の理解した範囲で良いので 自分なりに説明してみなさい 13/33 オブジェクト指向プログラミング データをやり取りするオブジェクトの集合として構成されるプログラム インスタンス間でデータをやりとりする それぞれのインスタンスが処理を行う main 関数のように使えるクラス インスタンス A インスタンス C インスタンス B 14/33 7
前回の課題 その2: Sample03a.java をコンパイル 実行しなさい レポートとして 実行結果を報告しなさい メソッド multiple が 何を行うかを解説しなさい 各行が何を行っているか 説明しなさい 何故 そのような値が出力されたかを インスタンス dt の変数 test01 やメソッド multiple に注目して解説しなさい 15/33 実行結果 class Test{ int int test01=2; public void void multiple(int test03){ System.out.println(test01 * test03); public class Sample03a{ public static void void main(string[] args){ Test Test dt dt = new new Test(); dt.multiple(100); dt.test01=5; dt.multiple(100); コンソールに 200 500 と表示される 8
メソッド multible が行うこと class Test{ int int test01=2; public void void multiple(int test03){ System.out.println(test01 * test03); public class Sample03a{ public static void void main(string[] args){ Test Test dt dt = new new Test(); dt.multiple(100); dt.test01=5; dt.multiple(100); インスタンスが持っている値 test01 と 引数として渡される test03 の値を乗算し画面に出力する dt test01=2; multiple(); インスタンスが持っている test01 の値は 2 引数として 100 が渡されるので 200 が出力される 各行がやっていることクラス Test の定義開始 class Test{ 整数型の変数 test01の宣言 初期値は2 int int test01=2; public void void multiple(int test03){ メソッドmultipleは整 System.out.println(test01 * test03); 数型の引数を貰う 返り値は無し test01とtest03の乗算の結果を publicである 標準出力に出力 クラスSample03aの定義開始 public class Sample03a{ メソッドmain 開始 public static void void main(string[] args){ Test Test dt dt = new new Test(); インスタンスdtを生成 dt.multiple(100); インスタンスdtのメソッドmultipleを dt.test01=5; 引数として100を与えて実行 dt.multiple(100); インスタンスdtの変数 test01にインスタンスdtのメソッドmultipleを 5を代入引数として100を与えて実行 9
出力の理由 クラス Test の詳細 Test 整数値を保存する場所を持つ test01=2; test01と引数を乗算し multiple(); 画面に出力する機能を class Test{ 持つ int int test01=2; public void void multiple(int test03){ クラスTestの System.out.println(test01 * test03); インスタンスdtを生成 dt test01=2; multiple(); public class Sample03a{ public static void void main(string[] args){ Test Test dt dt = new new Test(); メソッドを 引数 100を渡して実行 dt.multiple(100); test01の値は2なので 200が出力 dt.test01=5; dt.multiple(100); dt test01=5; インスタンスdtの test01の値は5なので multiple(); 変数 test01に代入 500が出力 前回の課題 その 3: Sample03b.java をコンパイル 実行しなさい レポートとして 実行結果 何故 そのような値が出力されたか を報告しなさい 20/33 10
出力結果と理由前半 public class Sample03b{ public static void main(string[] args){ int t=10; System.out.println("Test Data"); System.out.println(t); 10と出力 System.out.println(t+10); System.out.println("Test Data" + t); System.out.println("Test Data " + t + 10); 20と出力 System.out.println("Test Data " + (t (t + 10)); 出力される Test Data と出力 "" で囲っているので 文字列と認識される 整数型の変数 tの値が出力される 整数型の変数 t と 10 の和が + は演算として解釈される 21/33 出力結果と理由前半 public class Sample03b{ public static void main(string[] args){ int t=10; Test Data10 System.out.println("Test と出力 Data"); Data1010と出力 "" で囲われた部分は文字列として その後 System.out.println(t); tの値が出力される + は連結として解釈される System.out.println(t+10); + は連結として解釈される System.out.println("Test Data" + t); System.out.println("Test Data " + t + 10); System.out.println("Test Data " + (t (t + 10)); Test Data20 と出力 括弧で囲まれた部分 (t+10) が先に計算される 1 つめの + は連結として解釈される "" で囲われた部分は文字列として その後 tの値と10が出力される 22/33 11
static 23/33 クラスメンバとインスタンスメンバ 変数やメソッドには static をつけることができます staticがついているものをクラスメンバクラスメンバ ついていないものをインスタンスメンバインスタンスメンバと呼びます staticがついている変数やメソッドに関しては すべてのインスタンスが 同じモノを使うようになります クラスメンバは インスタンスを生成しなくても利用することができます クラスメンバには クラス名.. メンバ名のようにアクセスします 24/33 12
直感的な図 概念とか設計図の世界 Test int contents; static int st_cont; static cont(); Test.st_cont=10; Test. cont(); 実物 ( オブジェクト ) の世界 インスタンスを生成しなくても アクセス可能 クラス名. メンバ名でアクセスする 今回は Test.st_cont の様にする 25/33 直感的な図 概念とか設計図の世界 Test int contents; static int st_cont; static cont(); Data1 実物 ( オブジェクト ) の世界 contents = 10; st_cont; cont(); Test.st_cont=10; Data2 contents = 20; st_cont; Test. cont(); cont(); 26/33 13
直感的な図 概念とか設計図の世界 Test int contents; static int st_cont; static cont(); 同じものを利用 Test.st_cont=10; Test.cont(); Data1 Data2 実物 ( オブジェクト ) の世界 contents = 10; st_cont; cont(); contents = 20; st_cont; cont(); 27/33 直感的な図 概念とか設計図の世界 Test int contents; static int st_cont; Test.st_cont=15 static とすれば cont(); Data1.st_cont も15に Test.st_cont=15; Test.cont(); Data1 Data2 実物 ( オブジェクト ) の世界 contents = 10; st_cont; cont(); contents = 20; st_cont; cont(); 28/33 14
直感的な図 概念とか設計図の世界 Test int contents; static int st_cont; static cont(); Data1 ここに値を代入! Data1.st_count=20 実物 ( オブジェクト ) の世界 contents = 10; st_cont; cont(); Test.st_cont=20; Test.cont(); Data2 contents = 20; st_cont; ここに代入と同じ結果に cont();! 29/33 クラスの書き方の例 class Test{ static static int int st_data; int int data; public void void test_func01(){ System.out.println(data); public static static void void test_func02(){ System.out.println(st_data); public class Sample04a{ public static void void main(string[] args){ Test.st_data st_data=10; Test.test_func02(); static と書くだけです インスタンスを生成しなくても使える 30/33 15
利点 メソッドの場合 わざわざインスタンスを生成しなくても その機能を利用できるようになります 変数の場合 複数のインスタンスで共通に使える変数を利用できるようになります 31/33 注意する点 static なメソッドの中では インスタンスメンバな変数にアクセスすることはできません class Test{ static int int st_data; int int data; public static void void test_func02(){ 文 ; static なメソッド test_func02 の中からは 変数 data は利用できない 32/33 16
コンストラクタ 33/33 コンストラクタって? 返値のない関数のように書かれます インスタンスを生成するときに 自動的に実行されます コンストラクタの名前は クラスの名前と同一になります インスタンスを生成するときに渡す引数の種類によって 使用するコンストラクタを切り替えることができます コンストラクタが無い場合は 何も行われません それぞれの変数は 決められた初期値になります この機能を使うと 柔軟に初期値とかを設定できます 34/33 17
コンストラクタの書き方 返値の無いメソッドのように書きます クラスと同じ名前を書く 1. クラスを書く クラス test04 のコンストラクタの場合... 2. インスタンスを生成する 3. 実際に使ってみる 引数を書く クラスを生成するときに渡される引数に対応 test04(int test03){ 文 ; 実行する内容を書く 35/33 例 1: class Test{ int value; コンストラクタ Test(int value01){ value=value01*10; インスタンス生成時の引数は コンストラクタに渡される インスタンスが生成されたときに実行される public class Sample04b{ public static void main(string[] args){ Test dt02 = new Test(100); System.out.println(dt02.value); 36/33 18
例 2: 2 つ以上のコンストラクタを書くことができる どちらが実行されるかは 引数で判断される class Test{ int value; Test(){ value=10; Test(int value01){ value=value01*10; public class Sample04c{ public static void main(string[] args){ Test dt01 = new Test(); Test dt02 = new Test(100); System.out.println(dt01.value); System.out.println(dt02.value); 引数が無いので こちらが実行される 引数として整数が一つ渡されるので こちらが実行される 37/33 メソッドのオーバーロード 38/33 19
オーバーロードって? メソッドも 引数のデータ型 個数 並び方のどれかが異なっていれば 同じ名前で沢山定義することができます これをオーバーロードと言います 異なる引数で同じ処理を行いたいとき等に便利です 39/33 例 : public class Sample04d{ public static void main(string[] args){ calc(10,20); calc(10.5,20.5); 同じクラスのメソッドは メソッド名だけで実行できます 引数が ( 整数, 整数 ) なので こちらが実行 public static void calc(int data01, int data02){ System.out.println(data01*data02); 引数が (double,double) なので こちらが実行 public static void calc(double data01, double data0 2){ System.out.println(data01+data02); 40/33 20
誤植のおもひで 8ページ目上から2 行目 : 誤 : 必要ならstaticと書く 正 : 削除 17ページ目一番下 誤 : インスタンスが持っている test01 の値は 5 引数として 100 が渡されるので 500 が出力される 正 : インスタンスが持っている test01 の値は 2 引数として 100 が渡されるので 200 が出力される 22 ページ目一番下の吹き出し 1 行目 誤 : Test Data10 と出力 正 : Test Data20 と出力 41/33 21