У меня есть фрагмент кода:
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
, но это не так.