Запутался в наследовании методов и полей в Java - PullRequest
0 голосов
/ 27 сентября 2018

Я попытался провести исследование того, как подклассы могут получить доступ к методам и полям суперклассов.Когда я прочитал пост о 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 .

1 Ответ

0 голосов
/ 27 сентября 2018

Поскольку он повышается в иерархии, когда вызываемый метод не найден в объекте подкласса, конструктор подкласса вызывает super ();неявно, чтобы убедиться, что есть объект Superclass, доступный для вызова унаследованных методов из.

Конструктор (в дочернем и родительском элементах) будет вызываться при создании самого объекта, а не при вызове методов вобъект (так как вам нужен полностью сконструированный объект для вызова методов).

Причина, по которой вы не видите напечатанное имя класса как A, заключается в том, что метод getClass() возвращает время выполнения тип объекта (который B)

From javadoc , ( выделение шахты )

Возвращает класс выполнения этого объекта .Возвращенный объект Class - это объект, который заблокирован статическими синхронизированными методами представленного класса.

Ссылка:

Что такое "класс времени выполнения" в Java?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...