Revised: Jan./4th/2002: Since: Dec./30th/2001
前節で見た通り、クラス型変数は、同じ型同士であれば代入できます。型が異なる場合は、原則的には代入できません。次の例は、クラス MyClass
型の変数を二つ定義して、一方を他方に代入しています。
class SubstituteObjectDemo {
public static void main(String[] args) {
//参照型変数の定義
MyClass obj1, obj2;
//インスタンス化
obj1 = new MyClass("Object1");
//参照型変数の代入
obj2 = obj1;
//メソッド呼び出し
obj1.getMsg();
obj2.getMsg();
}
}
class MyClass {
//メンバ変数
String str;
//コンストラクタ
MyClass(String arg) {
str=arg;
}
//メソッド
void getMsg(){
System.out.println(str);
}
}
二つのクラス型変数が定義されていますが、コンストラクタは一回しか呼び出されていません。つまり、オブジェクトを参照する変数は二つあるのですが、オブジェクト自身は一つしかないということです。二つのクラス型変数 obj1
と obj2
は、一つのオブジェクトを参照します。
C:\Java>javac SubstituteObjectDemo.java C:\Java>java SubstituteObjectDemo Object1 Object1
クラス型変数は、同じクラスをインスタンス化したオブジェクトを参照する変数の間では代入することが出来ます。ここでは、参照のコピーが行われているのであり、オブジェクトがコピーされているわけではないことに注意してください。原則では、異なるクラスをインスタンス化して作られたオブジェクトの参照型変数は代入できません。「互換性のない型」なので、コンパイルエラーが起こります。
但し、継承関係にあるオブジェクト間では型変換して代入できることもあります。次にそれを紹介します。