为什么在同一个包中使用继承无法访问protected clone()方法

时间:2015-08-29 19:05:49

标签: java inheritance protected cloneable

我知道通过继承,所有类都从Object类继承方法。类似地,如果我们用其他类扩展一个类,它也继承方法。那么为什么我们可以从其他类调用继承的protected方法而不能从Object类调用inheritate方法

package com.core.test;

public class CloneableTest {
    public static void main(String[] args) {
        Testclass test= new Testclass();        

        test.someClassSpecificMethod();
        test.clone();  //ERROR AT tHIS LINE why                  
    }
}

class SomeClass implements Cloneable {

    protected void someClassSpecificMethod(){

    }
}

class Testclass extends SomeClass {

} 

在上面的文件中我可以使用Testclass的实例访问someClassSpecificMethod然后为什么我无法访问克隆方法?

2 个答案:

答案 0 :(得分:2)

因为clone未在与CloneableTest位于同一个包中的类中定义,而someClassSpecificMethod则为protected。类只能访问从其父级继承的受保护方法,即使它从与其他类相同的父级继承,它仍然无法从其他类访问该方法。这对于protected背后的意图非常有意义:它是基类提供给子类的公共API,而不是类的客户端。

由于protected严格地比package-private更宽,因此如果它是包私有的,您可以随时访问可以访问的someClassSpecificMethod方法,var_dump就是这种情况

答案 1 :(得分:1)

只有在您正在访问的类中声明方法时,才能从您自己的包中访问类的protected方法。类和它的方法都必须在同一个包中,否则它不会起作用。由于Object的{​​{1}}方法被声明为clone包中Object的一部分,因此除非您在包中声明覆盖,否则无法访问java.lang

clone

现在,只要您声明class SomeClass implements Cloneable { @Override protected Object clone() { ... // Do something here } } 类型的变量,就可以从同一个包中调用clone

SomeClass