在 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.
我有这个代码片段:
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.