【问题标题】:accessing protected method in other package?访问其他包中的受保护方法?
【发布时间】:2011-03-11 00:14:56
【问题描述】:

如果我说

class A{
}

然后它隐式继承 Object 类。所以我的类如下:

class A{

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

现在为什么我不能访问 Class B 中的 clone() 方法,它在 Class A 的同一个包中。

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

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

【问题讨论】:

  • 您的 sn-ps 具有误导性。 class A {} 和 class A { protected A clone() {} } 根本不等价。在第一个中,您在 sn-p 2 中没有实现 a 的 clone 方法。您调用的错误不会在 sn-p 2 中显示。
  • 它不会回答你的问题,但在新的 API 中更喜欢静态工厂方法或复制构造函数来 clone()。
  • 你评论/// Here i am not overridning是什么意思?你怎么不覆盖它?在 Object 中,clone 方法与 A.clone 具有完全相同的签名,因此它会覆盖它。

标签: java oop access-modifiers


【解决方案1】:

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

您在引用 A 时调用它,但它是 java.lang.Object 的方法,直到您覆盖它。

覆盖clone() 时,应将修饰符更改为public 并实现Cloneable。然而使用clone() 方法并不是一个好主意,因为它很难正确实现。使用 commons-beanutils 进行浅层克隆。

确保区分“覆盖”和“重载”。

【讨论】:

  • @Bozho:正如我评论的那样,我没有覆盖克隆方法。但是为什么我无法从 B 类访问该方法?
  • @JavaUser - 你肯定在A!
  • @Bozho :不,我没有覆盖。我说的是从 Object 继承的隐含含义。
  • 然后删除显示如何覆盖它的 sn-p ;) 并检查我的更新 - 第一句
  • 无论如何,我只是访问我的类 A 的 clone() 方法而不是 Object。我没有说 Object obj.clone() ..我说 A a.clone() ??! !!
【解决方案2】:

这完美的工作

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

}

【讨论】:

  • 正如我注释掉的,我没有覆盖克隆方法。请从上面的 sn-p 中删除克隆方法并编译代码。
  • @JavaUser:这在你的问题中并不清楚,所以你的 A 对象中没有受保护的 clone() 它作为对象保护方法保留,因此不能在 java 之外调用.lang 包
猜你喜欢
  • 2020-05-02
  • 2013-02-03
  • 2014-11-07
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2011-08-14
  • 2014-12-19
相关资源
最近更新 更多