我知道通过继承,所有类都从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然后为什么我无法访问克隆方法?
答案 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