簡體   English   中英

Java:為什么為繼承設計的類應包含受保護的克隆方法?

[英]Java: why class designed for inheritance should contain protected clone method?

我正在仔細閱讀《有效的Java》(Joshua Bloch撰寫),發現以下有關克隆的句子:

如果您設計一個用於繼承的類,請注意,如果您選擇不提供行為良好的受保護克隆方法,則子類將無法實現Cloneable。

我有點困惑,因為在我的小測試中:

public class Cloning {

    public static void main(String[] args) throws CloneNotSupportedException {

        Woman woman1 = new Woman("Marie Curie-Sklodowska", 33, "Physics");
        Woman woman2 = (Woman) woman1.clone();
    }

    static abstract class Person {
        protected String name;
        protected int age;

        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

    static class Woman extends Person implements Cloneable {

        private String field;

        Woman(String name, int age, String field) {
            super(name, age);
            this.field = field;
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
}

我沒有任何錯誤。 我認為,我對這句話的理解不正確。 有人可以解釋一下作者的想法嗎?

如果您設計一個用於繼承的類,請注意,如果您選擇不提供行為良好的受保護的clone()方法,則子類將無法實現Cloneable

他錯了 他們能。 考慮:

public class A
{
    private int fieldA;
}

public class B extends A implements Cloneable
{
    public B clone() throws CloneNotSupportedException
    {
        return (B)super.clone();
    }
}

B.clone ()將返回對其調用的B實例的完美副本,包括A.fieldA 被反例反駁:QED

[我知道實際上不應該聲明此clone()來引發CloneNotSupportedException但它會使演示更加簡單。]

這一切都很好奇,因為他剛才說了幾句話:

一些程序員只是選擇永不覆蓋clone()方法

專為繼承而設計的類不應實現它[ Cloneable ]

更奇怪的是,以上第一句是整節中的最后一句,並且完全沒有論點或示例的支持,除非整節旨在證明這一點,否則就不會。 整個部分都如此混亂,以至於很難准確地確定所要求的內容。 克隆並不像他所理解的那樣難於理解或實施。 也不重要。 在20年來的Java中,我還沒有在嚴肅的代碼中使用過它,也沒有在所謂的“復制構造函數”中使用過它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM