java:克隆方法冲突
代码隐藏:java:克隆方法冲突,java,clone,cloneable,Java,Clone,Cloneable,代码隐藏: class A implements Cloneable { int i, j; A(int i, int j) { this.i = i; this.j = j; } A() { } } class B extends A { int l, m; B() { } B(int l, int m) { this.l = l;
class A implements Cloneable
{
int i, j;
A(int i, int j)
{
this.i = i;
this.j = j;
}
A()
{
}
}
class B extends A
{
int l, m;
B()
{
}
B(int l, int m)
{
this.l = l;
this.m = m;
}
public static void main(String l[])
{
A obj = new A(1, 2);
B obj1 = (B) obj.clone(); // ERROR
}
}
我知道我试图将一个对象的字段分配给一个完全不同的对象,这违反了克隆的含义。但让我困惑的是错误陈述
语句:“错误:克隆()在对象中具有受保护的访问权限”
扩展A应该使B也可以使用clone()
?如果是,那么i和j的值也应该复制到l和m?这可能吗?是受保护的方法,若要在子类中进行访问,请使用public
access覆盖它
class A implements Cloneable{
.....
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
来自
按照约定,实现此接口的类应使用公共方法重写Object.clone(受保护)。有关重写此方法的详细信息,请参见Object.clone()
请注意,此接口不包含克隆方法。因此,仅仅因为对象实现了该接口,就不可能克隆对象。即使以反射方式调用clone方法,也不能保证它会成功
Clone
是java的早期设计之一,它有缺陷
关于访问-当一个方法受到保护时,它只能由类本身、类的子类或与类位于同一个包中的类来访问
因此,它可以在A
和B
类中访问,只有在与java.lang
您可以在A
中提供类似的方法
public A copy() throws CloneNotSupportedException {
return (A) clone();
}
正确实施
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
};
还要记住,父对象不是子对象类型,所以从A到B的转换将不起作用。Child是一种父类型,因此从B到A的强制转换将起作用。如果clone()受保护,那么它对A可用;如果B扩展了A,那么B应该可以访问clone?@rd4code查看我的答案。B有权访问克隆方法。但是B应该通过继承而不是直接通过A来访问它。