Почему конструктор суперкласса вызывается, когда мы объявляем объект подкласса? (Джава) - PullRequest
34 голосов
/ 24 августа 2011

Рассмотрим этот код:

class Test {
    Test() {
        System.out.println("In constructor of Superclass");
    }

    int adds(int n1, int n2) {
        return(n1+n2);
    }

    void print(int sum) {
        System.out.println("the sums are " + sum);
    }
}


class Test1 extends Test {
    Test1(int n1, int n2) {
        System.out.println("In constructor of Subclass");
        int sum = this.adds(n1,n2);
        this.print(sum);
    }

    public static void main(String[] args) {
        Test1 a=new Test1(13,12);
        Test c=new Test1(15,14);
    }
}

Если у нас есть конструктор в суперклассе, он будет вызываться каждым объектом, который мы создаем для дочернего класса (например, объект a для класса Test1 вызывает Test1(int n1, int n2), а также его родительский класс Test()).

Почему это происходит?

Вывод этой программы:

В конструкторе суперкласса

В конструкторе подкласса

суммы 25

В конструкторе суперкласса

В конструкторе подкласса

суммы 29

Ответы [ 18 ]

1 голос
/ 13 декабря 2013

Поскольку вы наследуете свойства базового класса в производном классе, могут быть ситуации, когда вашему конструктору производного класса требуются некоторые переменные базового класса для инициализации его переменных. Итак, сначала он должен инициализировать переменные базового класса, а затем производные переменные класса. Вот почему Java вызывает сначала конструктор базового класса, а затем конструктор производного класса.

И также не имеет смысла инициализировать дочерний класс без инициализации родительского класса.

1 голос
/ 18 мая 2013

Когда мы создаем объект подкласса, он должен учитывать все функции-члены и переменные-члены, определенные в суперклассе.Может возникнуть случай, когда некоторая переменная-член может быть инициализирована в некоторых конструкторах суперкласса. Следовательно, когда мы создаем объект подкласса, все конструкторы в соответствующем дереве наследования вызываются сверху вниз.

В частности, когда переменная определена как protected он всегда будет доступен в подклассе независимо от того, находится ли подкласс в том же пакете или нет .Теперь из подкласса, если мы вызываем функцию суперкласса для печати значения этой защищенной переменной (которая может быть инициализирована в конструкторе суперкласса), мы должны получить правильное инициализированное значение. Поэтому все конструкторы суперкласса вызываются.

Внутренне Java вызывает super () в каждом конструкторе.Поэтому каждый конструктор подкласса вызывает свой конструктор суперкласса, используя super (), и, следовательно, они выполняются сверху вниз.

Примечание: функции могут быть переопределены, а не переменные.

1 голос
/ 12 декабря 2012

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

1 голос
/ 24 августа 2011

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

Вот почему система работает таким образом.

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

1 голос
/ 24 августа 2011

Подкласс наследует поля от своего суперкласса (ов), и эти поля имеют для создания / инициализации (это обычная цель конструктора: инициализировать члены класса, чтобы экземпляр работал так, как требуется.знаю, что некоторые люди, но гораздо больше функциональности в этих бедных конструкторах ...)

1 голос
/ 25 апреля 2017

здесь расширение вашего Test до вашего класса test1, означающее, что вы можете получить доступ ко всем методам и переменным test в вашем test1.Имейте в виду, что вы можете получить доступ к методам класса или переменной, только если ему выделена память и для этого нужен какой-то конструктор, либо по умолчанию, либо с параметризацией, поэтому здесь, когда компилятор обнаруживает, что он расширяет класс, он попытается найтиконструктор суперкласса, чтобы вы могли получить доступ ко всем его методам.

1 голос
/ 30 июня 2014

Конструктор класса Super вызывается первым, потому что все методы в программе сначала присутствуют в куче, а после компиляции сохраняются в стеке, благодаря чему конструктор суперкласса вызывается первым.

0 голосов
/ 30 августа 2017

Родители выходят первыми !! И, как в реальном мире, ребенок не может существовать без родителей .. Поэтому инициализация родителей (SuperClass) в первую очередь важна для использования thrm в дочерних (подклассах) классах.

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