Report5


 講義資料オブジェクト指向プログラムJavaIの中のサンプルプログラムについ
て考察せよ。


プログラム.a
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);
                                }
           }


実行結果
area = 314.0
 
考察
オブジェクト指向プログラム
 まず基となるクラスからオブジェクトを生成することにより、そのオブジェク
トの中に在るメソッドを呼び出し使用することが出来る。このプログラスでは
"class CircleC"が基となるクラスでありそこから生成したオブジェクト"obj"
からメソッド"circle"を呼び出している。

 このようなプログラムの動作をc言語では、main関数の後に関数を作成する
ことで行ったがオブジェクト指向との決定的な違いは、オブジェクト生成の為に
クラスが作成されるという点である。



プログラム.b


class Dem {                                    // クラス
    public static void main(String args[]) {    // メソッド
        double area;;
        CircleC obj;                            // オブジェクト
        obj  = new CircleC();
        area = obj.circle(100);                 //引数を100にかえる
        System.out.println("area = " + area);
    }
}



実行結果
area = 31400.0

考察
 このプログラムは、(a)のプログラムから"Demo"の部分のみを書き出した物で
ある。このプログラムには"CircleC"の部分は書かれていないが、実行すること
ができる。これは、同じパッケージ内に"CircleC"が既に作成されていることで
ある。

このようにクラスを作成することにより、ほかのプログラムからそれらのクラス
にあるメソッドを呼び出すことが出来る。これが車などを作る時に例えると"
パーツ"にあたる物となり、それぞれの車"プログラム"を作成する時の部品とし
ていくつもの車に流用することが出来る。



プログラム.c

class ObjSample {
    public static void main(String args[]) {
    Display obj = new Display();   // クラスDisplayのオブジェクトobj生成
    obj.Disp("Hello Java");        // オブジェクトobjのメソッドDispを呼
    ぶ
    }
  }
  class Display {                    // クラスDisplayの定義
    void Disp(String message) {      // メソッドDispの定義
      System.out.println(message);
    }
  }



実行結果
Hello Java

考察
 ここでは、"Display"というクラスのオブジェクトを作成し、そのなかの
"Disp"というメソッドを呼び出している。その"Disp"というメソッドの引数に
"Hello Java"という文字列を用いることでString message = "Hello Java"となっ
た。

このように、一つのプログラムに複数のクラスの作成も可能である。



プログラム.Comp4
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);
  }
}



実行結果
20 + 10 = 30
20 - 10 = 10
20 * 10 = 200
20 / 10 = 2

考察
 ここでは、"enzan"というオブジェクトから

enzan.メソッド();

の記述で、それぞれのメソッドを呼び出している。



プログラム.d
public class rep5d {
  int n;                                     
  void Disp() {
    int i;                                 
    for (i = 1; i <= n; i++)
      System.out.print(i + " ");
  }
}

class VarSample {
  public static void main(String args[]) {
    rep5d obj = new rep5d();             
    obj.n = 10;                              
    obj.Disp();                     
  }
} 


実行結果
1 2 3 4 5 6 7 8 9 10

考察
 このプログラムでは、クラス"Display"の中のクラス変数"int n"をクラス
"VarSample"からオブジェクトを利用してアクセスし、値を代入している。
 この結果からも、クラス変数が外部のクラスからでもオブジェクトを通して、
値を変更できることが分かる。



オリジナルプログラム
public class original {
  int n;                                     
    void Disp() {
        int i;                                 
            for (i = 1; i <= n; i++){
            if(n%i == 0)
                  System.out.print(i + " ");
                      }
                }
        }

        class Var {
          public static void main(String args[]) {
              rep5e obj = new rep5e();             
              obj.n = 20;                              
              obj.Disp();                     
        }
}


実行結果
1 2 4 5 10 20

考察
 ここでは、オブジェクトによってクラス変数"int n"を変更すると
その数の約数が表示されるようにしてみました。
 
 for ( i = 1; i <= n; i++) {
   if(n%i == 0)
   System.out.print(i + " ");

このように、if文を1行追加するだけで表示する値を約数にする機能
を持ちます。このクラスはc"public"なので、このクラスを作っておくことで、
後々に約数を使用したい時にはパッケージ外からでも、オブジェクトによって呼
び出せば使用できることになる。


考察のまとめ
書式 クラスについて ・クラスとはデータとメソッド(動作・機能)を定義したもので、オブジェクトの雛形となるもの。 [修飾子] class クラス名 { データ定義部 メソッド定義部 } <クラスの修飾子>
キーワード意味
abstract インスタンス化できないクラス
final拡張できないクラス
publicJほかの全てのクラスから参照できるクラス
 このキーワードを指定しない場合は、現在のパッケージからしか
このクラスを参照できない。

メソッドについて
   ・メソッドは動作や処理内容(機能)を定義したもの


   [修飾子] メソッドの型 メソッド名([引数]) {
           処理内容
        }
<メソッドの修飾子>
キーワード意味
abstract このクラスでは実装しないメソッド
finalオーバーライトできないメソッド
nativeJavaのバイトコードではなく、ホストCPUで使われる マシン語で実装されるメソッド
private同じクラス内のコードからしか呼び出されないメソッド
protectedサブクラスまたは同じパッケージ内のコードから しかアクセスできないメソッド
publicほかのクラスからアクセスできるメソッド
staticインスタンスメソッドではないメソッド
synchronized実行を開始する時にロックを取得するメソッド
メソッドの型がvoidのときは、このメソッド自身が値を返さないもので
あるということ。
        
メソッドが値を返す場合は、メソッドの型と値を返す命令を記述する。
このプログラムのaddメソッドを参考にして説明する。

int add(int x) {
 return i + x;
}

このメソッドの型はint型でreturnを使うことによってi + xの値を返す。


ローカル変数とクラス変数


ローカル変数=メソッド内部で宣言した変数
クラス変数=メソッドの外部で宣言した変数

クラス変数は1つのクラスに1つしかなく、その値はそのクラスの全ての
        インスタンスに関わる。

        ローカル変数は、メソッド内で宣言され、そのメソッドの実行中にしか
        存在しない。
        複数のメソッドで、同じ名前のローカル変数を使うことができる。
        名前は同じでも、それらはまったく別物。
        ローカル変数は、スコープ内でしか使えない。
        変数のスコープとは、その変数に直接アクセスできるプログラム内の範
        囲のことでJavaの場合、ブロックがスコープに相当する。
        ローカル変数は、ブロックの入口で作成され、出口で破棄される。
        ローカル変数をクラス変数と同じ同じ名前で宣言することが出来る。
        その場合、ローカル変数はクラス変数を隠す。


オブジェクトの作成と初期化

クラス名 オブジェクト変数 = new クラス名();


反省・感想
 かなり作るのが遅れてしまいました。レポート6も頑張りたいです。