サンプルプログラムの考察 class CircleC { // クラス double pai = 3.14; // データ double circle(int r) { // メソッド return pai * r * r; } } class Demo { // クラス public static void main(String args[]) { // メソッド double area;; CircleC obj; // オブジェクト obj = new CircleC(); area = obj.circle(10); System.out.println("area = " + area); } } obj = new CircleC(); この処理でクラスCircleCを作成している。 newは生成したインスタンスへの参照できることを示す。 area = obj.circle(10); obj.circle(10);で、 objの参照しているオブジェクトのメソッドcircle()を呼び出す。 メソッドはCircleクラスで定義されている。 当然返された値は代入演算子=によってarea変数に格納される。 int add (int x, int y) { // メソッドの型がint int z; z = x + y; return z; // 値 z を返す命令 return } int add(int x, int y) intはこのメソッドの返す型、addはメソッド名、 ()括弧の中はメソッドの受ける引数を表す。(この辺はCと同じ) JAVAでは引数も含めてメソッドを区別する。そのため、同じ名前のメソッドが存在しても、 引数が違えば別のメソッドとみなされる。(オーバーロード) int z; 変数zの宣言。 Cと同じように { return x + y; }の方が早いと思う。 class ObjSample { public static void main(String args[]) { Display obj = new Display(); obj.Disp("Hello Java"); } } class Display { void Disp(String message) { System.out.println(message); } } class Display{ クラスDisplayの定義。 この場合は内容はメソッドDispのみ。 void Disp(String message) メソッドDispの定義。 引数にString型のオブジェクトを受け、そのままそれを出力するメソッド。 Display obj = new Display(); 新しくDisplayクラスをインスタンス化、objオブジェクトに参照渡し。 obj.Disp("Hello Java"); オブジェクトobjのメソッドDispにString型"Hello Java"を渡す。 メソッドは定義された通りにそれを出力する。 public class Comp4 { // クラスComp4を定義 int add(int x, int y) { // メソッドadd(int x,int y)を定義 return x + y; // x + y を返す } int substract(int x, int y) { // メソッドsubstractを定義 return x - y; // x - y を返す } int multiply(int x, int y) { // メソッドmultiplyを定義 return x * y; // x * y を返す } int divide(int x, int y) { // メソッドdivideを定義 return x / y; // x / y を返す } } class Keisan { public static void main(String args[]) { int a, b, wa, sa, seki, sho; Comp4 enzan = new Comp4(); // クラスComp4のオブジェクトenzan作成 a = 20; b = 10; wa = enzan.add(a, b); // オブジェクトenzanのadd(a,b)を実行 sa = enzan.substract(a, b); // 同上のsubstract(a,b)を実行 seki = enzan.multiply(a, b); // 同上のmultiplu(a,b)を実行 sho = enzan.divide(a, b); // 同上のdivide(a,b)を実行 System.out.println(a + " + " + b + " = " + wa); System.out.println(a + " - " + b + " = " + sa); System.out.println(a + " * " + b + " = " + seki); System.out.println(a + " / " + b + " = " + sho); } } public class Comp4 このブロックでクラスComp4を定義。 内容は4つのメソッドで、それらはそれぞれ2つの引数を持ち、四則演算した値を返す。 class Keisan{ メインクラスの定義。メソッドはmainのみ。 int a,b,wa,sa,seki,sho; int型の変数を6つ宣言。 Comp4 enzan = new Comp4(); Comp4型のオブジェクトenzanを宣言、その型のコンストラクタでインスタンス化。 wa = enzan.add(a, b); enzanオブジェクト内のメソッドaddを呼び出す。引数としてa,bを渡す。 返却値は変数waへ。 sa = enzan.substract(a, b); enzanオブジェクト内のメソッドsubstractを呼び出す。引数としてa,bを渡す。 返却値は変数saへ。 seki = enzan.multiply(a, b); enzanオブジェクト内のメソッドmultiplyを呼び出す。引数としてa,bを渡す。 返却値は変数sekiへ。 sho = enzan,divide(a, b); enzanオブジェクト内のメソッドdivideを呼び出す。引数としてa,bを渡す。 返却値は変数shoへ。 System.out.println(); 4つのメソッドの結果を表示する。 class Display { int n; void Disp() { int i; for (i = 1; i <= n; i++) System.out.print(i + " "); } class VarSample { public static void main(String args[]) { Display obj = new Display(); obj.n = 10; obj.Disp(); } } class Display クラスDisplayの定義。 int n; int型変数nの宣言。 この変数はメソッドの外で宣言されているため、フィールドと呼ばれる。 フィールドは当該クラスをインスタンス化したオブジェクトに対し定義され、 そのオブジェクトを破棄しない限り存在し続ける。 void Disp(){ メソッドDisp()の定義。 中でint型の変数iを宣言しているが、この変数はこのメソッドに局所的で、 メソッドの実行が終了すれば破棄される。 class VarSample メインクラス。mainメソッドのみの定義 Display obj= new Display(); Display型のオブジェクトの生成、Displayクラスのインスタンス化。 obj.n=10; オブジェクトobjの中のフィールドnの値を書き換えている。 obj.Disp(); オブジェクトobjのメソッドDispを呼び出している。 1からnまでの値を表示するので、この場合は1から10までが一行に表示される。 オリジナルサンプルプログラムの作成 /* Program : org.java Student_ID : 045754A Author : Hayato MIYAGI Date : 041204(Sun) Comments : オリジナルプログラムです. */ class Display { //クラスDisplayを定義 int n; void Disp() { int i; for (i = 0; i <= n; i++) System.out.println(i + "乗"); } } class org{ public static void main(String args[]) { int j; Display obj = new Display(); //クラスDisplayのオブジェクトobjを定義 obj.n = 9; obj.Disp(); //上のDisp()を実行 int kake = 1; System.out.println(1 + " * " + 1 + " = " + kake); //初めに2の0乗を出力 kake = kake * 2; for (j = 0; j <= 8; j++){ //以下のループ文で2の1乗から int c = kake * 2; //2の10乗までを出力 System.out.println( kake+ " * " + 2 + " = " + c); kake = kake*2; } } } 実行結果 [nw0454:~/prog2/repo5] j04054% java org 0 1 2 3 4 5 6 7 8 9 1 * 1 = 1 2 * 2 = 4 4 * 2 = 8 8 * 2 = 16 16 * 2 = 32 32 * 2 = 64 64 * 2 = 128 128 * 2 = 256 256 * 2 = 512 512 * 2 = 1024 org.javaについての考察をしていきます。 まず、 class Display { //クラスDisplayを定義 int n; void Disp() { int i; for (i = 0; i <= n; i++) System.out.println(i + "乗"); } } という部分でfor文でループさせるクラスDisplayを作成します。 このクラスを作成することによって必要なときに新たなオブジェクト として、必要なクラスでクラスDisplayを使用することができるように なります。 class org{ public static void main(String args[]) { int j; Display obj = new Display(); //クラスDisplayのオブジェクトobjを定義 obj.n = 9; obj.Disp(); //上のDisp()を実行 int kake = 1; System.out.println(1 + " * " + 1 + " = " + kake); //初めに2の0乗を出力 kake = kake * 2; for (j = 0; j <= 8; j++){ //以下のループ文で2の1乗から int c = kake * 2; //2の10乗までを出力 System.out.println( kake+ " * " + 2 + " = " + c); kake = kake*2; } } } という部分で数字の2を0乗から10乗までべき乗した値が出力されます。 Display obj = new Display(); obj.n = 9; obj.Disp(); という上の部分でクラスDisplayを呼び出します。 クラスDisplayの中身は0〜9までを出力するだけですが、 ループ文内の変数iがそのままクラスorgで2のi乗としてその計算結果を クラスorgを実行するとみることができます。 以上で考察を終わります。 感想と反省 今回の課題でJavaがオブジェクト指向型の言語ということが理解できました。 オブジェクト指向の概念を持っていると、必要なときに必要なオブジェクトを すぐに作成し、使用することができるんだと知ることができました。 ということは、プログラミングの途中で新たに追加したい事項が発生しても新たな オブジェクトとして作成すればある程度修正ができるという便利な一面もあるんだと 感じました。 参考文献 独習Java第2版 ジョセフ.オニール 著 トップスタジオ 訳 武藤 健志 監修