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 | 拡張できないクラス |
public | Jほかの全てのクラスから参照できるクラス |
このキーワードを指定しない場合は、現在のパッケージからしか
このクラスを参照できない。
メソッドについて
・メソッドは動作や処理内容(機能)を定義したもの
[修飾子] メソッドの型 メソッド名([引数]) {
処理内容
}
<メソッドの修飾子>
キーワード | 意味 |
abstract |
このクラスでは実装しないメソッド |
final | オーバーライトできないメソッド |
native | Javaのバイトコードではなく、ホストCPUで使われる
マシン語で実装されるメソッド |
private | 同じクラス内のコードからしか呼び出されないメソッド |
protected | サブクラスまたは同じパッケージ内のコードから
しかアクセスできないメソッド |
public | ほかのクラスからアクセスできるメソッド |
static | インスタンスメソッドではないメソッド |
synchronized | 実行を開始する時にロックを取得するメソッド |
メソッドの型がvoidのときは、このメソッド自身が値を返さないもので
あるということ。
メソッドが値を返す場合は、メソッドの型と値を返す命令を記述する。
このプログラムのaddメソッドを参考にして説明する。
int add(int x) {
return i + x;
}
このメソッドの型はint型でreturnを使うことによってi + xの値を返す。
ローカル変数とクラス変数
ローカル変数=メソッド内部で宣言した変数
クラス変数=メソッドの外部で宣言した変数
クラス変数は1つのクラスに1つしかなく、その値はそのクラスの全ての
インスタンスに関わる。
ローカル変数は、メソッド内で宣言され、そのメソッドの実行中にしか
存在しない。
複数のメソッドで、同じ名前のローカル変数を使うことができる。
名前は同じでも、それらはまったく別物。
ローカル変数は、スコープ内でしか使えない。
変数のスコープとは、その変数に直接アクセスできるプログラム内の範
囲のことでJavaの場合、ブロックがスコープに相当する。
ローカル変数は、ブロックの入口で作成され、出口で破棄される。
ローカル変数をクラス変数と同じ同じ名前で宣言することが出来る。
その場合、ローカル変数はクラス変数を隠す。
オブジェクトの作成と初期化
クラス名 オブジェクト変数 = new クラス名();
反省・感想
かなり作るのが遅れてしまいました。レポート6も頑張りたいです。