Report#5
1.課題
- 講義資料オブジェクト指向プログラムJavaIの中のサンプルプログラムのポイントについて考察せよ。
各自オリジナルのサンプルプログラムのポイント(全ての講義内容を含んだ、1つのコード)を作成し考察せよ。
2.解答・考察
ソースコード (Report5.java)
public class Report5 {
public static void main(String[] args) {
int kyori, jikan1, jikan2, a, b, t, k, x, y;
kyori = 60;
jikan1 = 2;
jikan2 = 3;
t = 4;
k = 60;
System.out.println("徒歩は" + t + "km/hです。");
System.out.println("車は " + k + "km/hです。");
System.out.println("\n目的地まで" + kyori + "kmとすると、");
Keisan obj = new Keisan();
a = obj.hayasa(kyori, t);
b = obj.hayasa(kyori, k);
System.out.println("徒歩では" + a + "時間かかり、");
System.out.println("車では " + b + "時間かかります。");
x = obj.nagasa(jikan1, t);
y = obj.nagasa(jikan1, k);
System.out.println("\n目的地まで" + jikan1 + "時間かかるとすると、");
System.out.println("徒歩の時は目的地まで" + x + "kmで、");
System.out.println("車の時は目的地まで " + y + "kmです。");
Sum goukei = new Sum();
goukei.add(obj.nagasa(jikan1, k));
goukei.add(obj.nagasa(jikan2, t));
System.out.println("\n途中で車から降り、");
System.out.println("車で" + jikan1 + "時間、徒歩で" + jikan2 + "時間かかるとすると、");
System.out.println("目的地までは" + goukei.total + "kmです。");
}
}
class Keisan {
int hayasa(int x, int y) {
return x / y;
}
int nagasa(int x, int y) {
return x * y;
}
}
class Sum {
static int total;
Sum() {
total = 0;
}
void add(int x) {
total += x;
}
}
実行結果
徒歩は4km/hです。
車は 60km/hです。
目的地まで60kmとすると、
徒歩では15時間かかり、
車では 1時間かかります。
目的地まで2時間かかるとすると、
徒歩の時は目的地まで8kmで、
車の時は目的地まで 120kmです。
途中で車から降り、
車で2時間、徒歩で3時間かかるとすると、
目的地までは132kmです。
考察
- ・オブジェクト指向プログラムとは
- オブジェクト指向プログラムとは、プログラムを「クラス」という単位で管理し、作成したプログラムの再利用性を高めることを目的としたプログラム手法。
「クラス」を単位とすることで、データとデータに対する処理がまとめて記述することが可能。
- ・クラスとは
- クラスはオブジェクトの設計図のようなもの。
クラスの構成要素をクラスのメンバーと呼び、クラスから作られたオブジェクトが使える限り、クラスのメンバーも持続的に使うことが出来ます。
- クラスの宣言
修飾子 class クラス名 extends スーパークラス名
implements インタフェース名 {
データ定義部
メソッド定義部
}
- 〜クラスの継承について〜
- クラスの継承とはあるクラス(スーパークラス)の機能を他のクラス(サブクラス)からでも使用できるということ。新たなクラスを作成する際、一からクラスを作成するのではなく元々あるクラスの型に新しい機能のみを付与した方がいい場合がある。そのような時に、クラスの継承を使用する。継承される側のクラスをスーパークラス、継承する側のクラスをサブクラスと言いい、1つのサブクラスが継承できるスーパークラスは1つまでである。
- クラスの修飾子
- public : パッケージ外からもこのクラスを参照できるクラス
- abstract : 実装されていない抽象クラス
- final : スーパークラスとしてサブクラスを作れないクラス
- つまり、上のReport5.javaの場合は"public class Report5"となっているので、
"パッケージ外からもこのクラスを参照できる、「Report5」という名前のクラス"である事がわかる。
- ・メソッドとは
- メソッドとはオブジェクトが備える何らかの処理を行うプログラムのことである。
- メソッドの宣言
修飾子 メソッドの型 メソッド名(引数) {
処理内容
}
- メソッドの働きには入力、処理、出力があり、入力と出力をそれぞれ、引数と戻り値と呼ぶ。同じクラス内の別のメソッドを呼び出したり、別のクラスから生成されたオブジェクトのメソッドを利用することができる。
- 上のプログラムの場合だと"class Keisan"の中の"hayasa"や"nagasa"、"class Sum"の中の"add"がメソッドである。"hayasa"や"nagasa"はメインのクラスから渡された数値(引数)を計算し、計算した値を返す(戻り値)メソッドである。"add"は引数を変数totalに加算するメソッドである。また、"add"メソッドはvoid型であるので値を返さない事を表している。
- ・オブジェクトとは
- 状態と動作の両方を定義してあるもので、変数やメソッドなどで表現されている。オブジェクトを生成,初期化するには下のようにする。
クラス名 オブジェクト変数 = new クラス名();
- 四則演算をするサンプルプログラムでは、演算をするメソッドをまとめたクラスを先に記述してある。それによりこのクラスのオブジェクトを生成する事により、他のクラスでも演算を行う事が出来る。
- ローカル変数とクラス変数
- ローカル変数 = メソッド内部で宣言した変数
- クラス変数 = メソッド外部で宣言した変数
- 違うメソッドに同じ名前の変数を宣言してもメモリ領域は別々。
- static変数
- 本来、同一クラスのオブジェクトを複数生成した場合,それぞれのオブジェクトで参照する値は異なるのだが,変数にstaticをつけることで値を共有する事が出来る。
- コンストラクタ
- クラスメイト同じ名前のメソッドをコンストラクタといい,オブジェクトの宣言時に一回だけそのメソッドの処理を行う。変数の初期化などで利用できる。
- staticイニシャライズ
- コンストラクタは同一のクラスのオブジェクトを生成した場合も処理されるが,staticイニシャライズは一度だけしか実行されない。
- メソッドのオーボーロード
- メソッドは同じ名前でも、引数の型や数が違う場合で違う処理をする事が出来る。
- アクセス制御
- 変数を宣言するときの修飾子
- public:全てのオブジェクトの全てのメソッドからアクセス可能
- private:定義されたクラス内のメソッドからだけアクセス可能
- protected:定義されたクラス内のメソッド、そのクラスから派生したサブクラス、同一パッケージ内のクラスからアクセス可能
オリジナルプログラムの考察
車や人の速さから、目的地までどのくらいの時間がかかるのかを調べるプログラム。四則演算をするサンプルプログラムの劣化版といったところか。速さから時間を求めたり、時間から距離を求めるている。結論から言うと、サンプルプルグラムのポイントを含んだプログラムを作る事は出来なかった。具体的には、"staticイニシャライズ"、"メソッドのオーバーロード"、"アクセス制御"を含む事が出来なかった。