После прочтения некоторой информации о наследовании и вызове методов и о том, как их обрабатывает компилятор, я запутался.Поэтому я был бы признателен, если бы кто-то взглянул на то, как я вижу вещи, и исправил меня в том, в чем я неправ.
Давайте сначала взглянем на следующий код:
Класс A:
public class A {
public void testMethodA(String a) {
System.out.println(a);
}
}
Класс B:
public class B extends A {
}
Main
public class Main {
public static void main(String[] args) {
B b = new B();
b.testMethodA("test");
}
}
Сейчасдавайте взглянем на то, как я понимаю вещи (пожалуйста, исправьте меня, если я ошибаюсь):
- Во время наследования при создании объекта подкласса вы создаете один объект, который получает все поля и методыиз всех суперклассов.Таким образом, поля и методы подклассов не переносятся из суперклассов в подклассы во время компиляции (Источник: Создается ли экземпляр суперкласса, когда мы создаем экземпляр объекта? )
- Во время компиляциикомпилятор проверяет, определен ли вызываемый метод, который поддерживает тип аргумента, в объявленном ссылочном типе.Таким образом, в примере:
A a = new A(); a.testMethod("test")
во время компиляции будет проверяться, определен ли testMethod () в классе A , который может получить String в качестве аргумента,(Источник: Как Java-компилятор выбирает правильные методы и переменные в наследовании ) - Когда происходит время выполнения, testMethod () вызывается из фактического объекта, который хранитсяв переменной a , которая не всегда является объектом типа A из-за полиморфизма.
Теперь актуальная проблема:
На основена логике и коде, которые я описал выше, я ожидал Не удается разрешить ошибку метода во время компиляции.Причина в том, что во время компиляции компилятор проверяет класс B , если существует testMethodA (String) .Однако этот метод унаследован от класса A , и, насколько я понимаю, унаследованные методы передаются не подклассам, а скорее объектам подклассов во время выполнения.Поэтому, если testMethodA (String) не существует в классе B во время компиляции, как компилятор все еще может успешно скомпилировать код?Конечно, он не проверяет объект для метода, потому что он еще не создан.
На этот вопрос нет ответа в «возможном ответе», так как эта тема является темой, которую я сам пометил как источник знанийпри описании этой проблемы.