Javasilver se11の勉強をしていて、黒本の総仕上げ問題②74問、79問(cloneメソッドの問題)で悩んだので簡単に整理してみようと思います。記事を書くのは初めてなので、温かい目で見ていただければ幸いです。
書き方と簡単な仕様についての解説になっています
cloneメソッドとは
その名の通り、自分のクローンを作るメソッドになっています。
コード自体はとても簡単で分かりやすいですね。
int[] a1 = {100,200};
int[] b2 = a1.clone(); //100,200が入ってる
cloneメソッドは参照型 で利用できます。int型 や double型 などのプリミティブ型は参照を代入できず、コンパイルエラーが発生します。
int a1 = 100;
int b2 = a1.clone();
参照型ですが、String型 では使えずコンパイルエラーが発生します。
困惑するかもしれませんが、配列の String型 は扱いが違うので問題ないです。
String a1 = "A";
String b2 = a1.clone();
配列をどのようにコピーしているか
恐らく僕の記事を読みに来てくれている人は、JavaSilver 受験者だと思うので早速ですが、問題を解説していこうと思います。
以下の問題は黒本の548ページと552ページに載っています。
char[][] a1 = {{'a','b'},{'c','d'}};
char[][] b2 = a1.clone();
char[] c3 = a1[1].clone();
System.out.println(a1 == b2); //false
System.out.println(a1[1] == c3); //false
System.out.println(a1[0] == b2[0]); //true
==演算子は 参照先が同じかどうか を判定してくれます。
図で見ると分かりやすくなると思うので、画像を作ってみました。
a1 と b2 が参照しているものは、それぞれ違う箱なので false を返します。
a1[1] をコピーして作った c3 も同じ参照にはならず、false を返します。
a1[0] と b2[0] は二つとも同じ「AB」を指しているため、true を返します。
cloneメソッドを利用して配列のコピーを作る場合、本体と同じ参照先を持ったクローンを作っていると考えると理解しやすいと思います。
int[] a = {2,3,4};
int[] b = a.clone();
b[0] = 5;
for(int i : a){
System.out.println(i + " "); //[5 3 4]の出力
}
上記の問題は本物とクローンの共通の参照先であるオブジェクトを変更しています。
上の画像のように考えると、真ん中にある AB か CD を他のアルファベットに置き換えているイメージです。
当然、参照先のオブジェクトを変えると互いに干渉し合うことになります。
最後に
cloneメソッドについての問題を解説してみました。更に詳しく知りたい方は以下の記事を読んでみてください。とても分かりやすく書かれていて、理解が深まると思います。