我读过J.Bloch的《Effective Java》一书,其中提到:
如果你设计一个用于继承的类,请注意如果你选择不提供良好的受保护的 clone 方法,那么子类将无法实现 Cloneable 接口。
我有一个名为 A 的类:
public class A{}
类B继承自类A:
public class B extends A implements Cloneable {
}
所以在这种情况下我不能覆盖clone()
方法吗?如果是的话,请解释为什么。
我读过J.Bloch的《Effective Java》一书,其中提到:
如果你设计一个用于继承的类,请注意如果你选择不提供良好的受保护的 clone 方法,那么子类将无法实现 Cloneable 接口。
我有一个名为 A 的类:
public class A{}
类B继承自类A:
public class B extends A implements Cloneable {
}
所以在这种情况下我不能覆盖clone()
方法吗?如果是的话,请解释为什么。
clone()
方法:public class A {
}
public class B extends A implements Cloneable {
@Override
public B clone() throws CloneNotSupportedException {
return (B) super.clone();
}
}
并且仍然具有有效的克隆机制 - 因此当您声明 implements Cloneable
时,您正在说真话。
然而,只需要给 A
添加一个 private
变量就可以打破这个承诺。
public class A {
private int a;
}
现在你的承诺被打破了 - 除非A实现clone
,否则你可以使用super.clone()
:
public class A {
private int a;
@Override
public A clone() throws CloneNotSupportedException {
A newA = (A) super.clone();
newA.a = a;
return newA;
}
}
public class B extends A implements Cloneable {
private int b;
@Override
public B clone() throws CloneNotSupportedException {
B newB = (B) super.clone();
newB.b = b;
return newB;
}
}
基本上 - 正如Joshua Bloch所说的那样 - 如果您不实现clone
,您的子类也通常无法实现。
Object.clone()
克隆。 - user207421Cloneable
和 clone()
已经被淘汰了,所以无论如何也不重要。然而,由于 clone()
总是应该调用 super.clone()
,如果一个超类错误地实现了它,子类也无法修复它。
这与无法覆盖 clone()
没有任何关系,只是不会得到正确的实现。
Cloneable
已被弃用)确切是从哪里得来的? - Dominik SandjajaA
不调用super.clone()
(即Object.clone()
),那么由于B
也无法调用它,这将导致实现不正确。然而,似乎文档说明了“按照惯例,应通过调用super.clone()来获取返回的对象”,因此我想这只会导致一个非常规的实现。 - KayamanB.clone()
。A.clone()
方法,那么 A 中的私有字段在 B 中就无法被正确地克隆。以下是一个简单的例子:public class A {
private String myText;
public A (String myText) {
this.myText = myText;
}
public String getExtendedText() {
return "Hello something " + myText;
}
}
public class B extends A implements Cloneable {
private int someValue;
// getter/setter
public clone() {
// how can you now provide a good clone with A.myText being cloned?
}
}
Object.clone()
会自动克隆 A.myText
和 B.someValue
。在这种情况下,B.clone()
不需要做任何事情,只需调用 super.clone()
即可。 - user207421
shallowClone()
和deepClone()
方法,以避免Java中的clone()
混乱。他们希望完全控制这些方法。对我来说很有道理。 - user4229245