Рассмотрим ниже иерархию классов.
class ClassA {
private void hello() {
System.out.println("Hello from A");
}
}
interface Myinterface {
default void hello() {
System.out.println("Hello from Interface");
}
}
class ClassB extends ClassA implements Myinterface {
}
public class Test {
public static void main(String[] args) {
ClassB b = new ClassB();
b.hello();
}
}
Запуск программы даст следующую ошибку:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.testing.ClassA.hello()V from class com.testing.Test
at com.testing.Test.main(Test.java:23)
- Это все потому, что я обозначил ClassA.hello как закрытый.
- Если я помечаю ClassA.hello как защищенный или удаляю модификатор видимости (т.е. Делая его по умолчанию), тогда он показывает ошибку компилятора как:
The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface
Однако, согласно вышеописанному исключению stacktrace, я получаю runtime IllegalAccessError.
Я не мог понять, почему это не обнаружено во время компиляции. Любые подсказки?