下記プログラムは「スッキリわかるjava実践編」p131からの抜粋です。
出力結果(書籍記載)
装備:はがねの剣 ※質問箇所
clone()で複製します
コピー元の勇者の剣の名前を変えます
コピー元とコピー先の勇者の装備を表示します
コピー元:ひのきの棒/コピー先:ひのきの棒
なぜ、getName()でメソッドを呼び出しているのに、「装備:はがねの剣」となるのでしょうか?
java
1public class Main { 2 public static void main(String[] args) { 3 4 Hero h1 = new Hero("ミナト"); 5 6 Sword s = new Sword("はがねの剣"); 7 h1.setSword(s); 8 9 System.out.println("装備:" + h1.getSword().getName()); 10 11 System.out.println("clone()で複製します"); 12 13 Hero h2 = h1.clone(); /* ここで複製 */ 14 15 System.out.println("コピー元の勇者の剣の名前を変えます"); 16 17 h1.getSword().setName("ひのきの棒"); 18 19 System.out.println("コピー元とコピー先の勇者の装備を表示します"); 20 21 System.out.println("コピー元:" + h1.getSword().getName() + 22 "/コピー先:" + h2.getSword().getName()); 23 } 24}
java
1public class Hero implements Cloneable { 2 String name; // 名前 3 int hp; // HP 4 Sword sword; // 装備している武器 5 6 public Hero clone() { 7 Hero result = new Hero(name); 8 result.name = this.name; 9 result.hp = this.hp; 10 result.sword = this.sword; 11 return result; 12 } 13 14 public Hero(String name) { 15 this.name = name; 16 } 17 18 public Sword getSword() { 19 return sword; 20 } 21 22 public void setSword(Sword sword) { 23 this.sword = sword; 24 } 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34}
java
1public class Sword { 2 private String name; 3 4 public Sword(String name) { 5 this.name = name; 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15}
なぜ?と聞かれたら、そう書いてあるとしか答えられないので、
”こうなると思っていた”という想定を書いてください。
そうすると、勘違いしている部分を指摘しやすいです。
回答2件
あなたの回答
tips
プレビュー