代码背后:
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
}
}
我知道我违反了克隆的含义,因为我试图将一个对象的字段分配给一个完全不同的对象。但它的错误陈述使我感到困惑。
声明:“错误:clone()在对象”
中具有受保护的访问权限扩展A应该使clone()
也可用于B吗?如果是这样,那么i和j的值应该复制到l和m吗?这可能吗?
答案 0 :(得分:7)
clone()是受保护的方法,并且可以在子类中进行访问,并使用public
访问权限覆盖它。
class A implements Cloneable{
.....
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
答案 1 :(得分:3)
按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护)。有关重写此方法的详细信息,请参阅Object.clone()。
请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。
Clone
是java中的早期设计之一,它有缺陷
关于access- When a method is protected, it can only be accessed by the class itself, subclasses of the class, or classes in the same package as the class
。
因此,只有当您处于恰好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是Parent的类型,因此从B到A的转换将起作用。