2

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

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 那么为什么我不能访问克隆方法?

4

2 回答 2

2

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

由于protected严格来说比包私有更广泛,因此您始终可以访问一个您可以访问的protected方法,如果它是包私有的,那么someClassSpecificMethod.

于 2015-08-29T19:12:29.500 回答
1

只有在您正在访问的类中声明了方法时,您才能protected从自己的包中访问类的方法。类和它的方法都必须在同一个包中,否则将无法工作。由于Object' 的clone方法被声明为包中的一部分,除非您还在包中声明了覆盖,否则您Object无法java.lang访问:clone

class SomeClass implements Cloneable {
    @Override
    protected Object clone() {
        ... // Do something here
    }
}

现在你可以clone从同一个包中调用,只要你声明一个类型的变量SomeClass

SomeClass sc1 = new SomeClass();
SomeClass sc2 = (SomeClass)sc1.clone();
于 2015-08-29T19:12:02.610 回答