Я попытался провести исследование того, как подклассы могут получить доступ к методам и полям суперклассов.Когда я прочитал пост о stackoverflow, в котором объяснялось, как наследование «действительно» работает, я смутился, увидев свой вывод.Пост, который я прочитал, был: Что на самом деле происходит с наследованием в Java?
После прочтения этого поста я понял, что такое наследование, и я прошу вас исправить его в случае ошибки:
- Методы и поля не копируются в подкласс, а вместо этого вызываются из объекта суперкласса, если они не переопределены в подклассе.Я подтвердил методы и поля, которые не копируются в подкласс, с помощью команды javap .
- При вызове метода в подклассе во время выполнения он ищет метод в объекте подкласса (возможный переопределяющий метод), и если он не найден, он перейдет в иерархию, чтобы найти его в объекте суперкласса, а затем вызовет его из объекта суперкласса.
- Поскольку методы и поля не копируются в подкласс, новместо этого вызываются из объекта Superclass, конструктор Subclass вызывает super ();неявно, чтобы убедиться, что есть объект Superclass, доступный для вызова унаследованных методов из.
Применяя логику, которую я только что записал, я натолкнулся на некоторые странные выводы.В приведенном ниже примере у меня есть класс A ( суперкласс ) и класс B ( подкласс ).Я получил B как вывод от метода Main, но вместо этого ожидал A как вывод.
Класс A:
public class A {
public void getTheClass() {
System.out.println(getClass().getSimpleName());
}
}
Класс B:
public class B extends A {
public B() {
getTheClass();
}
}
Класс Main:
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
Причина, по которой я ожидал A как выход, заключается в том, что (согласно ранее описанной логике) Метод getTheClass () будет вызываться из объекта Superclass (A), поскольку объект Subclass (B) не имеет метода с именем getTheClass ().У объекта Subclass нет этого метода, потому что, насколько я понимаю, методы и поля не копируются в подклассы.
Если у Подкласса нет этого метода, он перейдет вверх по иерархии, чтобы найти объект, который делает, и вызвать его оттуда, который в этом случае будет объектом Суперкласса (A).Поэтому, если метод getTheClass () вызывается из объекта Superclass (A), разве класс объекта будет классом A, а не классом B?И в таком случае, почему он не выводит A, а вместо B?Я получаю тот же сбивающий с толку результат, если напечатаю ключевое слово this .