講義資料オブジェクト指向プログラムJavaIの中のサンプルプログラムにつ いて考察せよ。 各自オリジナルのサンプルプログラム(全ての講義内容を含んだ、1つのコード)を作成し考察せよ。
○ソース
class Report5 { public static void main(String[] args) { int a, b, wa, sa, seki, sho; Local local = new Local(); a = 10; b = 5; local.sample(); local.sample2(); wa1 = local.add(a); wa2 = local.add(a,b); sa = local.substract(a); seki = local.multiply(a); sho = local.divide(a); System.out.println(local.i + " + " + a + " = " + wa1); System.out.println(iocal.i + " + " + a + " + " + b + " = " + wa2); System.out.println(local.i + " - " + a + " = " + sa); System.out.println(local.i + " * " + a + " = " + seki); System.out.println(local.i + " / " + a + " = " + sho); } } class Local { int i = 20; void sample() { System.out.println("i = " + i); int i = 3000, c = 30; System.out.println("i = " + i); System.out.println("c = " + c); } void sample2() { System.out.println("i = " + i); int i = 5000, c = 50; System.out.println("i = " + i); System.out.println("c = " + c); } int add(int x) { return i + x; } int add(int x,int y) { return i + x + y; } int substract(int x) { return i - x; } int multiply(int x) { return i * x; } int divide(int x) { return i / x; } }
○実行結果 i = 20 i = 3000 c = 30 i = 20 i = 5000 c = 50 20 + 10 = 30 20 + 10 + 5 = 35 20 - 10 = 10 20 * 10 = 200 20 / 10 = 2
○考察 ・プログラムの説明 Local local = new Local(); クラスLocalのオブジェクトを生成している。 オブジェクトの変数名はlocalとした。 local.sample(); クラスLocal内のsampleメソッドを実行する。 wa = local.add(a); クラスLocal内のaddメソッドにaの値を渡して実行する。 System.out.println(local.i + " + " + a + " =" + wa); local.iはクラスLocal内のクラス変数iである事を表す。 次にクラスLocal内の説明をする。 int i = 20; この変数iはクラス変数です。(クラス変数については後で説明) iに20を代入する。 void sample() sampleという名前のメソッド。 このメソッド内ではじめにiの値を表示すると、前の文で代入した20 が表示される。 int i = 3000, c = 30; このiとcはローカル変数で、iはクラス変数と同じ名前だが、クラス 変数は隠される。 この後iとcの値を表示すると、iはこのときローカル変数のiを示すの で3000、cは30と表示される。 void sample2() sample2という名前のメソッド。 sampleメソッドと同じくはじめにiの値を表示すると、20が表示され る。 int i = 5000, c = 50; このiとcはローカル変数で、iはクラス変数と同じ名前だが、クラス 変数は隠される。 iやcはsampleメソッドと同じ名前を使用しているがローカル変数なの で、sampleメソッド内の変数とは別のもの。 iとcの値を表示するとsampleと同じ理由で、iは5000、cは50と表示さ れる。 int add(int x) int型のaddという名前のメソッド。 return i + x; この文はi , xを足した値を返すという意味。 int add(int x,int y) int型のaddという名前の引数が2つあるメソッド。 return i + x + y ; この文はi , x , yを足した値を返すという意味。 add(int x)と、add(int x,int y)は同じ名前のメソッドだが、引数の 個数の違いで別のものとして区別される。 (オーバーロードについては後で説明。)
・クラス クラスは、データとメソッド(動作・機能)を定義したもので、オブジェ クトの雛形となるもの。 [修飾子] class クラス名 { データ定義部 メソッド定義部 } クラスの修飾子 キーワード 意味 abstract インスタンス化できないクラス final 拡張できないクラス public 他のすべてのクラスから参照できるクラス このキーワードを指定しない場合は、現在のパッケージからしかこのクラスを参照できない
・メソッド メソッドは動作や処理内容(機能)を定義したもの。 [修飾子] メソッドの型 メソッド名([引数]) { 処理内容 } メソッドの修飾子 キーワード 意味 abstract このクラスでは実装しないメソッド final オーバーライドできないメソッド(オーバーライドは後で説明) native Javaのバイトコードではなく、ホストCPUで使われるマシン語で実装されるメソッド private 同じクラス内のコードからしか呼び出されないメソッド protected サブクラスまたは同じパッケージ内のコードからしかアクセスできないメソッド public ほかのクラスからアクセスできるメソッド static インスタンスメソッドではないメソッド synchronized 実行を開始するときにロックを取得するメソッド メソッドの型がvoidのときは、このメソッド自身が値を返さないもの であるということ。 private,protected,などの修飾子は、アクセス制御を行うために使用できる。 メソッドが値を返す場合は、メソッドの型と値を返す命令を記述する。 このプログラムのaddメソッドを参考にして説明する。 int add (int x) { return i + x; } このメソッドの型はint型でreturnを使うことによってi + xの値を返 す。
・オブジェクト指向 Javaプログラムは1つ以上のクラスで構成される Javaプログラムはすべてクラス クラスの構成 フィールド(データ、属性) メソッド(コード、動作、機能、処理) クラスはオブジェクトを作成する雛形 オブジェクト指向とは ものごとを表現するすべてのものをオブジェクト単位で考えること オブジェクトには、属性(データ)と機能(処理)が含まれる 例えば、自動車をオブジェクトと考えると、 パーツという要素・データから構成される自動車は、個々の要素を変更し、 バス、トラック、乗用車となる動かす、止まるといった機能がメソッドと なる基となるクラスは自動車の設計図基となる抽象的なクラスから 実態となるオブジェクトを作成する
・オブジェクトの生成 クラス内のメソッドを利用するために、クラスのオブジェクトを生成 しなければならない。 オブジェクトの生成をインスタンス化といい、次のように行う。 クラス名 変数名; 変数名 = new クラス名(); または次のようにも記述できる。 クラス名 変数名 = new クラス名(); クラス名はインスタンス化の対象となるクラスの名前。 新しいオブジェクトへの参照が変数名に代入される。 変数名は自分で決めた名前を付ける。 このプログラムでは次のようにインスタンス化している。 Local local = new Local(); このようにして作ったオブジェクトのメソッドを利用するには次のよ うにする。 変数名.メソッド名(); 変数の利用も同様。 変数名.変数名;
・ローカル変数とクラス変数 ローカル変数 = メソッド内部で宣言した変数 クラス変数 = メソッドの外部で宣言した変数 クラス変数は1つのクラスに1つしかなく、その値はそのクラスの全て のインスタンスに関わる。 ローカル変数は、メソッド内で宣言され、そのメソッドの実行中にし か存在しない。 複数のメソッドで、同じ名前のローカル変数を使うことができる。 名前は同じでも、それらはまったく別物。 ローカル変数は、スコープ内でしか使えない。 変数のスコープとは、その変数に直接アクセスできるプログラム内の 範囲のことでJavaの場合、ブロックがスコープに相当する。 ローカル変数は、ブロックの入口で作成され、出口で破棄される。 ローカル変数をクラス変数と同じ同じ名前で宣言することが出来る。 その場合、ローカル変数はクラス変数を隠す。
・オーバーロードと、コンストラクタ オーバーロードとは、クラス内に同じ名前のメソッドを定義する事である。 このプログラムの2つのaddメソッドを参考にして説明する。 int add(int x) { return i + x; } int add(int x,int y) { return i + x + y; } 2つのメソッド名は「add」で、型も「int型」と同様であるが、 引数の個数の違いによってそれらは別物として扱われる。 ソース中でaddメソッドを実行するときに 引数を一つだけ渡せば、i + xの値が返され、 また、引数が2つ渡されれば、i + x + yの値が返される。
○感想 今回の課題は教科書で先に読んでいた部分があり、理解するのにそんなに苦労はしなかった。 まとめるのにはかなり時間がかかりましたけど。 ただ、テスト勉強のほうは 不安が残りそうです…。 このレポートの内容よりもっと詳しく知る必要があると思います。 ○参考文献 独習java 著:ジョセフ・オニール