我有以下代码段:
abstract class Foo {
protected abstract void method(String o);
public void method(Object o) {
System.out.println("method(Object)");
}
}
class Bar extends Foo {
protected void method(String key) {
System.out.println("method(String)");
}
}
public class OverloadingTest {
public static void main(String[] args) {
Bar bar = new Bar();
bar.method("hello");
bar.method(null);
}
}
令人惊讶的是打印了
method(String)
method(String)
在stdout
上,我想了解这是有可能的,因为接受String参数的方法(被调用的方法)是受保护的方法,因此不可能调用它从没有扩展Foo
的类中,应改为调用接受Object
的公共方法,但这似乎并非如此。
答案 0 :(得分:0)
是的,与Bar
相同包中的任何代码都可以访问其受保护的方法。
如果要将OverloadingTest
移至新软件包(即,将其移至源树中其他文件夹中的文件中),则只有Foo#method(Object)
签名可见。
受保护的可见性是相对私有的AKA默认可见性的宽松版本。两者之间的唯一区别是受保护的可见性允许子类访问成员,即使该成员位于不同的程序包中。
对此事引用Oracle Docs:
protected修饰符指定成员只能在自己的包中访问(与package-private一样),并且只能由其在另一个包中的类的子类访问。