cloneメソッド
全てのクラスは、自分自身の複製インスタンスを作って返すという責務を持った clone()をObjectクラスから継承している
clone()の利用方法
①Cloneableインタフェースを実装する -> java.lang.Cloneableインタフェースを実装する
②clone()をpublicでオーバーライドする -> publicでオーバーライドする
浅いコピー(shllow copy)と深いコピー(deep copy)
Main.java public class Main { public static void main(String[] args) { //Fighterクラスのインスタンス生成 Fighter mcreggor = new Fighter("コナー"); Skill s1 = new Skill("サイドキック"); //スキルのセット mcreggor.setSkill(s1); System.out.println("スキル: " + mcreggor.getSkill().getName()); System.out.println("clone()で複製"); //Fighter型のインスタンスマクレガーを複製 Fighter mcreggor2 = mcreggor.clone(); System.out.println("コピー元のマクレガーのスキルを変更"); mcreggor.getSkill().setName("右ストレート"); System.out.println("コピー元とコピー先のマクレガーのスキルを表示"); System.out.println("コピー元:" + mcreggor.getSkill().getName() + "コピー先" + mcreggor2.getSkill().getName()); } }
public class Fighter implements Cloneable { String name; //名前 int hp; // HP Skill skill; //装備スキル //cloneメソッドのオーバーライド public Fighter clone() { Fighter result = new Fighter(); result.name = this.name; result.hp = this.hp; result.skill = this.skill.clone(); return result; } //コンストラクタ public Fighter() { super(); } public Fighter(String name) { super(); this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Skill getSkill() { return this.skill; } public void setSkill(Skill skill) { this.skill = skill; } }
public class Skill implements Cloneable { //フィールドの宣言 private String name; //clone()のオーバーライド public Skill clone() { Skill result = new Skill(); result.name = this.name; return result; } //コンストラクタ public Skill() { this.name = ""; } public Skill(String name) { super(); this.name = name; } //getter public String getName() { return name; } //setter public void setName(String name) { this.name = name; } }