・クラス型の変数に代入する
- 同じクラス型の変数どうしで、代入することができる
- 代入しても、オブジェクトが2つになるわけではない
<代入の例>
class Sample1
{
public static void main(String []
args)
{
Car c1
= new Car( 1234, 20.5 );
Car c2;
c2 = c1; // 同じクラス型の変数に代入する
System.out.println("c1 = " + c1.num + ", " + c1.gas);
System.out.println("c2 = " + c2.num
+ ", " + c2.gas);
c2.num
= 9876; // c2のメンバ変数を変更する
System.out.println("<変更後>");
System.out.println("c1 = " + c1.num
+ ", " + c1.gas);
System.out.println("c2 = " + c2.num
+ ", " + c2.gas);
}
}
/* Carクラスの記述は省略 */
|
<実行結果>
C:\java>java
Sample1
c1 = 1234, 20.5
c2 = 1234, 20.5
<変更後>
c1 = 9876, 20.5 <--
c1のnumも変わっていることに注意
c2 = 9876, 20.5
C:\java>
|
- 変数 c1 と c2
は異なる2つのブジェクト(インスタンス)ではなく、同じ1つのオブジェクトをさしている
・nullのしくみを知る
- クラス型の変数に null を代入すると、紐づけされているオブジェクトがないことになる
Car c1 = new Car();
// オブジェクトが作成され、c1に紐づけされる
:
c1 = null; // c1とオブジェクトへの紐づけがなくなる
- 紐づけがなくなったオブジェクトや利用されなくなったオブジェクトは、システムによって自動的に破棄される
---> 「ガーベジコレクション」と呼ばれる機能
・メソッドの引数として使う
- クラス型の変数をメソッドの引数にする
<引数にクラス型の変数を用いる>
class Sample2
{
public static void main(String []
args)
{
Car c1
= new Car( 1234, 20.5 );
Car c2 = new Car( 9876, 13.8
);
show(c1);
show(c2);
}
static void show( Car cc ){ // 引数はCarクラスのクラス型変数
System.out.println("cc = " + cc.num + ", " + cc.gas);
}
}
/* Carクラスの記述は省略 */
|
・値渡しと参照渡し
- 基本型変数は値渡し ・・・・ 値がコピーされる
- クラス型変数は参照渡し ・・・・ 参照先がコピーされる
<値渡しの例>
class Sample3
{
public static void main(String []
args)
{
int a = 5;
int b = 3;
System.out.println("a=" + a + ", b=" + b);
exchange( a, b ); // 値渡しなので、aとbの値は入れ替わらない
System.out.println("a=" + a + ", b=" + b);
}
static void exchange( int x, int y ){
int tmp;
tmp = x; x = y; y = tmp; // xとyが入れ替わるだけ、a,bには影響なし
}
}
|
<実行結果>
C:\java>java
Sample3
a=5, b=3
a=5, b=3 <-- 変化なし
C:\java>
|
<参照渡しの例>
class Sample4
{
public static void main(String [] args)
{
Car a = new Car(1234, 20.5);
Car b = new Car(9876, 13.8);
System.out.print("a[" + a.num + "," + a.gas + "], ");
System.out.println("b[" + b.num + "," + b.gas + "]");
exchange( a, b ); // 参照渡し
System.out.print("a[" + a.num + "," + a.gas + "], ");
System.out.println("b[" + b.num + "," + b.gas + "]");
}
static void exchange(
Car x, Car y ){
int nn;
double gg;
// メンバごとに入れ替える
nn = x.num; x.num = y.num; y.num = nn;
gg = x.gas; x.gas = y.gas; y.gas = gg;
}
}
class Car
{
int num;
double gas;
public Car( int n, double g ){
num = n;
gas = g;
}
}
|
<実行結果>
C:\java>java
Sample4
a[1234,20.5], b[9876,13.8]
a[9876,13.8], b[1234,20.5] <-- a〜bで入れ替わっている
C:\java>
|
|