2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java Silver】cloneメソッドをできるだけわかりやすく解説

Last updated at Posted at 2023-11-03

Javasilver se11の勉強をしていて、黒本の総仕上げ問題②74問、79問(cloneメソッドの問題)で悩んだので簡単に整理してみようと思います。記事を書くのは初めてなので、温かい目で見ていただければ幸いです。

書き方と簡単な仕様についての解説になっています

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ページに載っています。

問題74
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

==演算子は 参照先が同じかどうか を判定してくれます。
図で見ると分かりやすくなると思うので、画像を作ってみました。
cloneメソッド画像.jpg

a1 と b2 が参照しているものは、それぞれ違う箱なので false を返します。

a1[1] をコピーして作った c3 も同じ参照にはならず、false を返します。

a1[0] と b2[0] は二つとも同じ「AB」を指しているため、true を返します。

cloneメソッドを利用して配列のコピーを作る場合、本体と同じ参照先を持ったクローンを作っていると考えると理解しやすいと思います。

問題79
int[] a = {2,3,4};
int[] b = a.clone();
b[0] = 5;

for(int i : a){
    System.out.println(i + " "); //[5 3 4]の出力
}

上記の問題は本物とクローンの共通の参照先であるオブジェクトを変更しています。

上の画像のように考えると、真ん中にある ABCD を他のアルファベットに置き換えているイメージです。

当然、参照先のオブジェクトを変えると互いに干渉し合うことになります。

最後に

cloneメソッドについての問題を解説してみました。更に詳しく知りたい方は以下の記事を読んでみてください。とても分かりやすく書かれていて、理解が深まると思います。

参考文献

黒本.jpg

- 徹底攻略Java SE 11 Silver問題集 -

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?