2010-07-02 104 views
1

如果我说在其他包中访问受保护的方法?

class A{ 
} 

然后它含蓄地继承对象class.So我有如下类别:

class A{ 

     protected Object clone(){ 
     } /// Here i am not overridning 
     //All the other methods (toString/wait/notify/notifyAll/getClass) 
} 

现在为什么不能我访问B类的clone()方法是在相同的A类包中。

Class B{ 
     A a = new A(); 
     a.clone(); 
     ** 
} 

// **说明clone在Object类中是受保护的。但是我没有访问Object的克隆方法。在这里我调用了A类的克隆方法,但是我还没有重载。

+2

你的片段是误导性的非常相同的错误。 类A {} 和 类A { 保护的克隆(){}} 是不等价的。在第一种情况下,当您在代码段2中执行时,您不会实现克隆方法。您调用的错误不会与代码段2一起显示。 – dodecaplex 2010-07-02 09:23:39

+0

它不会回答您的问题,但在新API中优先选择静态工厂方法或将构造函数复制到克隆()。 – helpermethod 2010-07-02 09:47:31

+0

什么意思你评论'///我在这里没有overridning'?你怎么没有压倒它?在Object中,'clone'方法与'A.clone'具有完全相同的签名,所以它重写它。 – 2010-07-02 09:51:37

回答

3

protected方法在java.lang.Object中定义,因此您不能从其他包调用它 - 只能从子类调用它。

您称之为A,但它是java.lang.Object的方法,直到您覆盖它为止。

当重写clone()时,应该将修饰符更改为public并实施Cloneable。但是使用clone()方法不是一个好主意,因为它很难正确实现。使用commons-beanutils来制作浅层克隆。

确保您区分“覆盖”和“超载”。

+0

@Bozho:正如我所评论的,我不是重写克隆方法。但为什么我无法从类B访问该方法? – JavaUser 2010-07-02 09:04:33

+0

@JavaUser - 你肯定会在'A'中压倒它! – Bozho 2010-07-02 09:06:54

+0

@Bozho:不,我不是重写。我说从Object继承的隐含意义。 – JavaUser 2010-07-02 09:09:48

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

} 
+0

正如我注释到的,我不是重写克隆方法。请从上面的代码中移除克隆方法并编译代码。 – JavaUser 2010-07-02 09:07:24

+1

@JavaUser:在你的问题中不清楚,所以你的A对象中没有受保护的clone(),它保持为Object保护的方法,因此不能在java.lang包之外调用 – 2010-07-02 09:23:52

-1

如果不重新定义A用克隆方法,那么,不要惊讶,如果你确实调用对象的clone()方法,而不是一个公司。

你得到

class A {} 

class B { 
    A a = new A(); 

    public B() { 
    A x = (A) ((Object) a).clone(); 
    } 
}