複数のメソッドで同名のローカル変数を使うことができる。
static変数
ソースコード
class Sum {
int total;
Sum() {
total = 0;
}
void add(int x) {
total += x;
}
}
class Sample {
public static void main(String args[]) {
Sum obj1 = new Sum();
Sum obj2 = new Sum();
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
ソースコード
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
考察
- "Sum"では、obj1( )とobj2( )に入った数字をそれぞれ計算し出力する。
- obj1、obj2それぞれで変数が区別されているので入れられた数字をそれぞれ計算して出力する。
- obj1とobj2は変数totalで共有されているからたされる。
コンストラクタ
ソースコード
class Sum3 {
int total;
Sum3() {
total = 0;
}
Sum3(int x) {
total = x;
}
void add(int x) {
total += x;
}
}
class ConstrcSample {
public static void main(String args[]) {
Sum3 obj1 = new Sum3();
obj1.add(10);
obj1.add(20);
System.out.println("sum1 = " + obj1.total);
Sum3 obj2 = new Sum3(100);
obj2.add(10);
obj2.add(20);
System.out.println("sum2 = " + obj2.total);
}
}
実行結果
sum1 = 30
sum2 = 130
考察
- コンストラクタ名とクラス名は同じにしなければならない。
- ConstrcSampleでは、まず引数を指定せずにobj1を生成したので、コンストラ
クタはtotalに0を代入して初期化する。
- 次にメソッドaddで10と20を変数totalに足し、その値を出力する。
- オブジェクトobj2は引数100を指定しを生成。コンストラクタはオブジェクト生成時に引数を受け取り、変数totalに代入する。
- その後、メソッドaddで10と20を変数totalに足し、その値を出力する。
staticイニシャライズ
ソースコード
class Disp {
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イニシャライズは、コンストラクタより早く処理したいときや、
一度だけ処理を行いたい場合などに用いる。
- 一つ目のオブジェクトが生成されるときは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("tasita = " + wa);
obj.x = 30;
wa = obj.add(20);
System.out.println("tasita = " + wa);
sa = obj.sub(30);
System.out.println("hiita = " + sa);
System.out.println();
Subst obj2 = new Subst();
obj2.Disp();
System.out.println();
obj2.w = 70;
obj2.Disp();
}
}
実行結果
tasita = 24
tasita = 50
hiita = 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
考察
- 「void Disp( ){ }」はvoid型でDispというメソッド名を宣言。
- メソッド内で宣言されているのは、ローカル変数。クラス内で同じ変数が宣言されているが、ローカル変数が優先されるので、ローカル変数が宣言されてからはその値が適応される。
- 「wa = obj.add(20);」はobj、つまりSumクラス内のaddメソッドにある
変数に10を入れた結果をwaに代入することを表していて、addメソッドでは
「add(int y)」となっているので、ローカル変数yに20が代入される。
- 「obj.x = 30;」はSumクラス内にあるクラス変数xに30を代入
することを表しているので、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となる。
- 「obj2.Disp( );」は、obj2つまりSubstクラス内のDispメソッドの結果
を表示する。
感想
とにもかくにも、長い長い!!ホームページにのせる方法なんかも、教えて
もらいながら、つくったもんだから、つかれた。。ほとんど人のアイディアっ
てのが、くやしい。つぎこそは、完全にオリジナルでつくりたい!!努力が
必要です。。
参考文献
- 独習Java 第3版 ジョゼフ・オニール著 翔泳社