コツコツ学習ブログ

プログラマのweb上のメモ的なもの

インスタンスの複製

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;
    }

}