如果我说
class A{
}
然后它隐式继承了Object类。所以我正在使用如下的类:
class A{
protected Object clone(){
} /// Here i am not overridning
//All the other methods (toString/wait/notify/notifyAll/getClass)
}
现在为什么我无法访问类A中的clone()方法,它位于A类的同一个包中。
Class B{
A a = new A();
a.clone();
**
}
// **表示克隆在Object类中受到保护。但是我没有访问Object的clone方法。我正在调用A类的克隆方法,但我还没有过载。
答案 0 :(得分:3)
protected
方法在java.lang.Object
中定义,因此您无法从其他包中调用它 - 只能从子类中调用它。
您是在A
的引用上调用它,但它是java.lang.Object
的方法,直到您覆盖它。
覆盖clone()
时,您应将修改器更改为public
并实施Cloneable
。但是使用clone()
方法并不是一个好主意,因为很难正确实现它。使用commons-beanutils来制作浅克隆。
确保区分“覆盖”和“重载”。
答案 1 :(得分:1)
这完美的工作
class A{
protected Object clone(){
return this;
}
}
public class B{
public B() {
A a = new A();
a.clone();
System.out.println("success");
}
public static void main(String[] args) {
new B();
}
}
答案 2 :(得分:-1)
如果您没有为A重新定义克隆方法,那么,如果您确实在调用Object的clone()方法而不是A,那么不要感到惊讶。
会出现同样的错误
class A {}
class B {
A a = new A();
public B() {
A x = (A) ((Object) a).clone();
}
}