e055763
安富 順一
Report#5
[1]課題
講義資料オブジェクト指向プログラムJavaIの中のサンプルプログラムのポ
イントについて考察せよ。各自オリジナルのサンプルプログラムのポイン
ト(全ての講義内容を含んだ、1つのコード)を作成し、考察せよ。
[2]解答・実行結果・考察
ローカル変数とクラス変数
ソースコード
- 1からnまでを表示するプログラム(VarSample.java)
class Display {
int n; //クラス変数
void Disp() {
int i; //ローカル変数
for (i = 1; i <= n; i++)
System.out.println(i + " ");
}
}
class VarSample {
public static void main(String args[]) {
Display obj = new Display(); //クラスDisplayのオブジェクトobj生成
obj.n = 10; //オブジェクトobjの変数nに10を代入
obj.Disp(); //オブジェクトobjのDisp()実行
}
}
実行結果
1 2 3 4 5 6 7 8 9 10
考察
- ローカル変数とは、メソッドの内部で宣言した変数で、この場合、「i」
のことを指す。
- クラス変数とは、メソッドの外部で宣言した変数で、この場合、「n」
のことを指す。
- クラス変数は一つのクラスに一つしかなく、その値はそのクラスの全て
のインスタンスに関わってくる。
- ローカル変数は宣言されたメソッドの実行中にしか存在しない。
- 複数のメソッドで同名のローカル変数を使うことができるが、それらは
全くの別物である。
- ローカル変数はブロックの入り口で生成され、出口で破棄される。
- このプログラムでは、for文を用い、「i」が「n」になるまで出力する、
を繰り返す。
- 初め、nには何も入っていないが、"Display obj = new Display( );"で、
クラスDisplayのオブジェクトobjを生成し、"obj.n = 10;"で、オブジェク
ト"obj"の変数"n"に10が代入される。
- "obj.Disp( );"でオブジェクトobjの"Disp( )"を実行する。
static変数
ソースコード
- 異なるオブジェクト間の変数合計プログラム(SumSample.java)
class Sum {
int total;
Sum() { //コンストラクタ(クラス名と同名))
total = 0; //0クリア
}
void add(int x) {
total += x;
}
}
class SumSample {
public static void main(String args[]) {
Sum obj1 = new Sum(); //クラスSumのオブジェクトobj1生成
Sum obj2 = new Sum(); //クラスSumのオブジェクトobj2生成
obj1.add(10);
obj1.add(20);
obj2.add(30);
obj2.add(40);
System.out.println("obj1.total = " + obj1.total);
System.out.println("obj2.total = " + obj2.total);
}
}
実行結果
obj1.total = 30
obj2.total = 70
ソースコード
- staticを用いて値を共有するプログラム(SumSample2.java)
class Sum2 {
static int total;
Sum2() {
total = 0;
}
void add(int x) {
total += x;
}
}
class SumSample2 {
public static void main(String args[]) {
Sum2 obj1 = new Sum2();
Sum2 obj2 = new Sum2();
obj1.add(10);
obj1.add(20);
obj2.add(30);
obj2.add(40);
System.out.println("obj1.total = " + obj1.total);
System.out.println("obj2.total = " + obj2.total);
System.out.println("Sum2.total = " + Sum2.total);
}
}
実行結果
obj1.total = 100
obj2.total = 100
Sum2.total = 100
考察
- static変数は、そのクラスの全てのオブジェクトから共有される変数の
ことで、クラスそのものに結びついている変数である。
- "Sum"では、それぞれのobj1( )とobj2( )に入れられた数字をそれぞれ計
算した合計を出力する。
- 2行目のintで変数totalを定義し、3行目でコンストラクタを作成。
- class SumSample{ }の中でクラスSumのオブジェクトobj1、obj2を生成し、
それぞれで変数totalが区別されているので、obj1とobj2に入れられた数字
をそれぞれ計算して出力する。
- "Sum2"では、obj1( )とobj2( )に入れられた数字を全て計算した合計を出力する。
- static int totalで、値を共有させる変数totalを定義し、obj1とobj2
は変数totalで共有されているので、区別なく加算される。
コンストラクタ
ソースコード
- コンストラクタを用いた合計プログラム(ConstrcSample.java)
class Sum3 {
int total;
Sum3() { //コンストラクタ 引数無し
total = 0;
}
Sum3(int x) { //コンストラクタ 引数 x
total = x;
}
void add(int x) {
total += x;
}
}
class ConstrcSample {
public static void main(String args[]) {
Sum3 obj1 = new Sum3(); //クラスSumのオブジェクトobj1生成
obj1.add(10);
obj1.add(20);
System.out.println("sum1 = " + obj1.total);
Sum3 obj2 = new Sum3(100); //クラスSumのオブジェクトobj2生成
obj2.add(10);
obj2.add(20);
System.out.println("sum2 = " + obj2.total);
}
}
実行結果
sum1 = 30
sum2 = 130
考察
- コンストラクタとは、特定のクラスのオブジェクトを作成して初期化す
る特殊なメソッドのことで、クラスをインスタンス化するときに自動的に実
行される。
- コンストラクタ名は、クラス名と同じにしなければならず、引数を受け
ることができ、戻り値を返すことはできない。
- コンストラクタを直接呼び出すことはできず、常にnew演算子で呼び出
さなければならない。
- このプログラムはobj1とobj2に入れられた数字の合計をそれぞれ出力し
ている。
- クラスSum3では、二つのコンストラクタを定義し、一つ目は引数を使わ
ずに、二つ目は一つの引数を受け取る。
- 引数を使うコンストラクタは、変数totalに0を代入して初期化し、引数
を受け取るコンストラクタは、変数totalに受け取った引数を代入して初期
化する。
- クラスSum3内のメソッドaddで変数totalにConstrcSampleで定める引数
を足す。
- ConstrcSampleでは、まず引数を指定せずにobj1を生成したので、コンストラ
クタはtotalに0を代入して初期化する。
- その後、メソッドaddで10と20を変数totalに足し、その値を出力する。
- 次に、引数100を指定し、オブジェクトobj2を生成し、コンストラクタ
はオブジェクト生成時に引数を受け取り、それを変数totalに代入する。
- その後、メソッドaddで10と20を変数totalに足し、その値を出力する。
staticイニシャライズ
ソースコード
- staticイニシャライズを行ったプログラム(StaticSample.java)
class Disp {
static { //staticイニシャライズ
System.out.println("initialize");
}
Disp() { //コンストラクタ
System.out.println("construct");
}
}
class StaticSample {
public static void main(String args[]) {
Disp obj1 = new Disp(); //オブジェクト生成時にコンストラク
タを処理
Disp obj2 = new Disp(); //オブジェクト生成時にコンストラク
タを処理
}
}
実行結果
initialize
construct
construct
考察
- staticイニシャライズとは、コンストラクタの前に記述するメソッドの
ことであり、コンストラクタが呼び出される前に実行され、クラスが呼ばれ
たときに自動的に実行される。
- staticイニシャライズは、コンストラクタより早く処理したいときや、
一度だけ処理を行いたい場合などに用いる。
- クラスDispには、staticイニシャライズとコンストラクタが定義されて
いて、クラスStaticSampleは、オブジェクトを二つ生成する。
- 一つ目のオブジェクトが生成されるときはstaticイニシャライズとコンストラ
クタの両方が実行され、二つ目のオブジェクトが生成されるときは、コンス
トラクタのみ実行される。
オリジナルプログラム
ソースコード
class Sum {
int x = 4;
int add(int y) {
return x+y;
}
int sub(int y) {
return x-y;
}
}
class Subst {
int w;
int x = 800;
int y = 200;
void Disp() {
System.out.println("w = " + w);
System.out.println("x = " + x);
System.out.println("y = " + y);
int x = 3;
int y = 7;
int z = 5;
System.out.println("w = " + w);
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("z = " + z);
}
}
class Rep5 {
public static void main(String args[]) {
int wa,sa;
Sum obj;
obj = new Sum();
wa = obj.add(20);
System.out.println("wa = " + wa);
obj.x = 30;
wa = obj.add(20);
System.out.println("wa = " + wa);
sa = obj.sub(30);
System.out.println("sa = " + sa);
System.out.println();
Subst obj2 = new Subst();
obj2.Disp();
System.out.println();
obj2.w = 70;
obj2.Disp();
}
}
実行結果
wa = 24
wa = 50
sa = 0
w = 0
x = 800
y = 200
w = 0
x = 3
y = 7
z = 5
w = 70
x = 800
y = 200
w = 70
x = 3
y = 7
z = 5
考察
- 「class Sum」でSumという名のクラス名を宣言。
- 「int add(int y){ }」はint型でaddというメソッド名を宣言。
- 「class Subst」でSubstという名のクラス名を宣言。
- 「int w;
int x = 800;
int y = 200;」
はメソッドの外で宣言されているので、これらはクラス変数である。
- 「void Disp( ){ }」はvoid型でDispというメソッド名を宣言。
- 「int x = 3;
int y = 7;
int z = 5;」
はメソッド内で宣言されているので、これらはローカル変数であり、このク
ラス内で同じ変数が宣言されているが、ローカル変数が優先されるので、ロー
カル変数が宣言されてからはこの値が適応される。
- 「Sum obj;
obj = new Sum( );」
で、Sumクラスの内容をobjとして宣言。
- 「wa = obj.add(20);」はobj、つまりSumクラス内のaddメソッドにある
変数に10を入れた結果をwaに代入することを表していて、addメソッドでは
「add(int y)」となっているので、ローカル変数yに20が代入される。
- 「obj.x = 30;」はobjつまりSumクラス内にあるクラス変数xに30を代入
することを表しているので、waは20+30=50となる。
- 「sa = obj.sub(30);」は「wa = obj.add(20);」と同様の処理で、sub
メソッドにあるyに30が代入されるが、xはクラス変数なので、上の「obj.x
= 30;」でxに30が代入されたことが使われるが、変数yはローカル変数なの
で、Sumメソッドで宣言されたyは無視され、subメソッドには30が入ってお
り、subは30-30=0となる。
- 「Subst obj2 = new Subst( );」で、Substクラスの内容をobj2として宣
言しているが、これは、
「Sum obj;
obj = new Sum( );」
を短縮した形である。
- 「obj2.Disp( );」は、obj2つまりSubstクラス内のDispメソッドの結果
を表示する。
- 「obj2.w = 70;
obj2.Disp( );」
は、obj2つまりSubstクラス内の、更にDispメソッド内の変数wに70を代入し
て、Dispメソッドの結果を表示する。
[3]感想
年末にOSのヴァージョンアップをして、ターミナルの調子が悪くなったのを
一人で何とかしようとしていたら、こんなに遅くなってしまいました。この
ままReport#6に取りかかります。
[4]参考文献
- 独習Java 第3版 ジョゼフ・オニール著 翔泳社
PukiWiki
プログラミングIIへ
とっぷにもどる