各自オリジナルのサンプルプログラム(全ての講義内容を含んだ、1つのコードで 可)を作成し考察せよ。
1.解答
以下のオリジナルのサンプルプログラムを作成した。
(1)Rep5.java
ソースコード |
class Hen{
int Cla; //クラス変数宣言
static int Sta; //static変数宣言
static { // static イニシャライズ
System.out.println("staticイニシャライズです");
}
Hen(){ //コンストラクタ
Cla = 0;
Sta = 0;
}
void Hen(int x) { // メソッド Hen 引数 x。メソッドのオーバーロード
System.out.println(x);
}
void Hen(int x, int y) { // メソッド Hen 引数 x, y。メソッドのオーバーロード
System.out.println(x + y);
}
void kei(int x){
int Ror=0; //ローカル変数
Cla += x; //Cla = Cla + x
Sta += x; //Sta = Sta + x
Ror = Cla + Sta;
}
}
public class Rep5 {
public static void main(String[] args) {
Hen obj1= new Hen();
Hen obj2= new Hen();
Hen obj3= new Hen();
obj1.kei(1);
obj1.kei(20);
obj2.kei(30);
obj2.kei(3);
obj3.Hen(1);
obj3.Hen(1,2);
System.out.println("obj1.Cla = "+obj1.Cla);
System.out.println("obj1.Sta = "+obj1.Sta);
//System.out.println("obj1.Ror = "+obj1.Ror);
System.out.println("obj2.Cla = "+obj2.Cla);
System.out.println("obj2.Sta = "+obj2.Sta);
//System.out.println("obj2.Ror = "+obj2.Ror);
}
}
|
実行結果 |
staticイニシャライズです
1
3
obj1.Cla = 21
obj1.Sta = 54
obj2.Cla = 33
obj2.Sta = 54
|
2.考察
・static 変数 : クラスのすべてのオブジェクトから共有されている変数
・コンストラクタ : クラス名と同じ名前のメソッド
・このプログラムは、『Hen』と『Rep5』という2つのクラスを使用している。
クラス『Hen』では、"Cla" というクラス変数宣言、"Sta" というstatic変数宣言を行う。
クラス『Hen』の内側で、メソッド "Hen" を宣言し、変数 "Cla","Sta" に初期数値として "0" を代入しておく。
クラス『Rep5』では、"Hen obj1= new hen(); Hen obj2= new hen();" を行い、クラス『Hen』のオブジェクト、
"obj1" と "obj2" を生成する。
"obj1" のメソッド "Kei1" 、"obj2" のメソッド "kei2"にそれぞれ数値を代入する。
その結果を "println" で出力し結果を見てみる。
obj1.Cla = 21
|
1回目
|
x =1→ Cla = 1
|
2回目
|
x = 20 → Cla = 1 + 20 = 21
|
obj2.Cla = 33
|
3回目
|
x = 30 → Cla = 30
|
4回目
|
x = 3 → Cla = 30 + 3 = 33
|
・上の2つは "Cla" という同じ名前変数を使用しているが、"obj1" と "obj2" を作ったため
それぞれ違うメモリの保存されている。従って、別々に計算され、値は "21"、"33" というように異なっている。
obj1.Sta = 54
|
1回目
|
x = 1 → Sta = 1
|
2回目
|
x = 20 → Sta = 1 + 20 = 21
|
・メソッド "Sta" はstatic変数で宣言されている為、同じメモリの保存される。
"obj1" の "Sta"、"obj2" の "Sta" などのように区別されない( "Sta" は一つだけ )
つまり"Sta" は "obj1" と "obj2" で共有しているので下の表のようになる。
3回目
|
x = 30 → Sta = 30 + 21 = 51
|
4回目
|
x = 3 → Sta = 3 + 51 = 54
|
・staticイニシャライズは、クラスが呼ばれた(ロードされた)ときに自動的に実行される
・コンストラクタよりも早く処理したい場合や、一度だけ処理を行いたい場合などに用いる
・メソッドのオーバーロードとは、クラス内に同じ名前のメソッドを定義すること
・メソッドのオーバーロードを行う場合は、引数の数や型が異なっていなければならない
授業である程度は理解できたので、いつもよりちょっとだけ楽だった。
ちゃんとしたのを作る時間がなかったのでサンプルプログラムはしょぼくなってしまった。
これからも期限内に終われるようにしたい。
戻る
Wikiに戻る