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

Is it possible in Java to call a protected method from a different non-child class without using reflection?

我有这个代码片段:

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 的 class 调用它,应该调用接受 Object 的 public 方法,但这似乎不是案例.

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

如果您要将 OverloadingTest 移动到一个新包——即将它移动到源代码树中不同文件夹中的一个文件——那么只有 Foo#method(Object) 签名是可见的。

受保护的可见性是 package-private AKA 默认可见性的稍微宽松的版本。两者之间的唯一区别是受保护的可见性允许子类访问成员,即使它在不同的包中。

引用Oracle Docs关于此事的内容:

The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.