Когда дочерний класс становится экземпляром родительского класса - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь понять, как экземпляр дочернего класса становится экземпляром родительского класса.Я имею в виду, какую модель они получают в памяти после создания.

Проверьте ниже фрагмент кода

public class Parent {
    public String log4jConfig;

    public void setLog4jConfig(String log4jConfig){
        System.out.println(this.getClass());  ---4
        this.log4jConfig = log4jConfig;
    }

    public String getLog4jConfig() {
        return log4jConfig;
    }
}

public class Child extends Parent {
}

public class Mainclass {
    public static void main(String[] args) {
        Child obj = new Child(); // ---1
        obj.setLog4jConfig("log4jConfig");
    }
}

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

И this представляет текущий экземпляр класса. Так почему я получаю название класса 4 Child?Поэтому, если CHILD IS PARENT, когда он расширен, то как он находится в памяти, я пытаюсь визуализировать план сидения родительского и дочернего класса в памяти, где this родительского становится экземпляром Child.

ИЛИ При расширении создает ли он две копии методов для соответствующих родительских и дочерних классов, которые наследуются в памяти?

Любая помощь, пожалуйста ..!

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Когда экземпляр дочернего класса становится экземпляром родительского класса

Он не "становится" .Это "есть" .A Child равен a Parent, так же как Banana равен a Fruit.

И this представляет текущийэкземпляр класса

this представляет текущий экземпляр класса .Во время выполнения существует только один объект, а не несколько объектов, а не несколько слоев на основе иерархии классов.Там один объект.Period.

И это представляет текущий класс Instance, так почему я получаю имя класса 4 Child?

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

. Во всех этих случаях Child - это класс выполнения экземпляра, на который obj указывает:

Child obj = new Child();
Parent obj = new Child();
//and all the possible intermediate parents, until
Object obj = new Child();

ИЛИ При расширении создает ли он две копии методов для соответствующих родительских и дочерних классов, которые наследуются в памяти?

Самый простой способ думать об этом:

  • Когда объект создается, Java знает класс времени выполнения этого объекта (см. Выше).
  • С классом времени выполнения она знает, какие методы и атрибуты доступны для этого объекта, чтообъявлены в этом классе времени выполнения (Child, в вашем случае)
  • С классом времени выполнения он знает, какие методы и атрибуты наследуются от родительских типов этого объекта (Parent и Object вваш случай)
  • С классом времени выполнения Java знает, какие методы, унаследованные и переопределенные им, будут выполнены согласно дочернему классу (у вас нет переопределенных методов).

Так вотЕсли вы пишете this, вы ссылаетесь на один объект, с которым вызывается текущий код.С помощью this вы можете ссылаться на методы и атрибуты, объявленные также в классе времени выполнения, и те, которые доступны из супертипов.

Когда вы пишете super, вы по-прежнему ссылаетесь на один объект, с которым вызывается текущий код.И на что вы ссылаетесь, используя super, это явно методы или атрибуты, объявленные в родительском классе того класса, который объявляет исполняемый в данный момент код.

0 голосов
/ 04 марта 2019

Вы видите вывод "Child", потому что это то, что есть obj;this - это текущий объект в время выполнения , а не то, где находятся методы в вашем исходном коде.Это одно из приятных свойств объектно-ориентированного программирования;родительский класс может определять метод, который опирается на методы, которые реализованы (или переопределены) в подклассах.Если, например, setLog4jConfig было переопределено в дочернем классе, тогда было бы две копии метода.Смотрите это объяснение vtables .

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