Создается ли экземпляр суперкласса, когда мы создаем экземпляр объекта? - PullRequest
8 голосов
/ 25 января 2012

Создается ли экземпляр суперкласса, когда мы создаем конкретный класс в Java.Если это так, то будет много накладных расходов на создание экземпляров всех суперклассов.Я попробовал следующий код:

public class AClass {
    public AClass() {
        System.out.println("Constructor A");
    }
}

public class BClass extends AClass{
    public BClass(){
        System.out.println("Constructor B");
    }
}

public class Test {
    public static void main(String[] args) {
        BClass b = new BClass();
    }
}

Вывод кода:

Constructor A

Constructor B

Значит ли это, что полная иерархия объектов суперклассов создается, когда мы создаем экземпляркласс?

Ответы [ 3 ]

10 голосов
/ 25 января 2012

Создается один объект, но этот объект является экземпляром как суперкласса, так и подкласса (и самого java.lang.Object). Здесь нет трех отдельных объектов. Есть один объект с одним набором полей (в основном объединение всех полей, объявленных вверх и вниз по иерархии) и один заголовок объекта.

Конструкторы выполняются вплоть до иерархии наследования, но ссылка this будет одинаковой для всех этих конструкторов; все они способствуют инициализации одного объекта.

3 голосов
/ 25 января 2012

Да.

Конструктор BClass выглядит следующим образом:

public BClass ()
{
    super (); // hidden line, added by compiler
    System.out.println("Constructor B");
}

Если вы не хотите использовать конструктор по умолчанию, вы можете сделать это так:

public BClass ()
{
    super (parameters); // now you will use different constructor from AClass
                        // compiler will not add here call to "super ()"
    System.out.println("Constructor B");
}

С сайта oracle: Если конструктор не вызывает явно конструктор суперкласса, компилятор Java автоматически вставляет вызов в конструктор суперкласса без аргументов.Если у суперкласса нет конструктора без аргументов, вы получите ошибку во время компиляции.У Object есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.

2 голосов
/ 25 января 2012

Да, в этом весь смысл наследования классов.

Однако вы не создаете экземпляры двух объектов: вы создаете экземпляр одного объекта и запускаете на нем как AClass, так и конструктор BClass. Конструктор AClass отвечает за инициализацию частей, унаследованных от AClass, а конструктор BClass отвечает за инициализацию дополнительных элементов, определенных в BClass.

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