访问其他包中的受保护方法?

时间:2010-07-02 08:55:25

标签: java oop access-modifiers

如果我说

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类的克隆方法,但我还没有过载。

3 个答案:

答案 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();
  }
}