こんにちは。ちょっと長いですが・・・
これを理解するには、インスタンスとは何か?オブジェクトとは何か?というのが分かっていないと
難しいかと思います。
Test obj1 = new Test();
Test obj2 = new Test("Solaris");
この2行では、Testクラスのインスタンスをobj1
とobj2
それぞれ作成しています。
Testクラスの箱が2つあると考えてください。
Testクラスの箱には、フィールドlang
とoperation
がそれぞれ用意されています。
初期値は
static String lang = "C";
public String operation = "Unix";
です。
インスタンスを作成する際に使用するのがコンストラクタです。
Testクラスにはコンストラクタが2つ用意されています。
Test() { }
Test(String str) {
operation = str;
}
1つ目のコンストラクタは引数なしで、Testクラスのインスタンスをそのまま作成します。
2つ目のコンストラクタは引数str
に指定されたものをoperation
フィールドに代入した状態でインスタンスを作成します。
一番最初に見た2行(newしている部分)が、これを実際に使っている部分ですね。
このときの状態を図にすると↓のようになります。
Test obj1
└ static String lang = "C";
└ public String operation = "Unix";
Test obj2
└ static String lang = "C";
└ public String operation = "Unix"; ← ここが "Solaris" になります。
main()メソッドに戻りましょう。
次の処理は
obj2.lang = "Java";
これはobj2
のフィールドlang
の値に直接"Java"
を代入しています。
ここで注意したいのは、lang
がstatic
であること。
static
としているとTestクラス全体の値が変わります。
上の図にしてみると、
Test obj1
└ static String lang = "C"; ← ここが "Java" になります。
└ public String operation = "Unix";
Test obj2
└ static String lang = "C"; ← ここが "Java" になります。
└ public String operation = "Solaris";
となります。
そして、
System.out.println(obj1.lang + "\t" + obj1.oparation);
System.out.println(obj2.lang + "\t" + obj2.oparation);
でそれぞれのインスタンスのフィールドの中身を標準出力に書き出しているのです。
obj1.lang
⇒ obj1
インスタンスのlang
フィールド という意味です。(他も同様)
なので、出力された結果が
になるのです。
ちなみに、「\t」はタブ文字です。「エスケープシーケンス」で調べてみてください。