在Java中是否可以在不使用反射的情况下从其他非子类调用受保护的方法?

时间:2019-07-04 15:03:44

标签: java overloading

我有以下代码段:

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的公共方法,但这似乎并非如此。

1 个答案:

答案 0 :(得分:0)

是的,与Bar相同包中的任何代码都可以访问其受保护的方法。

如果要将OverloadingTest移至新软件包(即,将其移至源树中其他文件夹中的文件中),则只有Foo#method(Object)签名可见。

受保护的可见性是相对私有的AKA默认可见性的宽松版本。两者之间的唯一区别是受保护的可见性允许子类访问成员,即使该成员位于不同的程序包中。

对此事引用Oracle Docs

  

protected修饰符指定成员只能在自己的包中访问(与package-private一样),并且只能由其在另一个包中的类的子类访问。