Зачем вызывать super() в конструкторе?

Я имею дело с классом, который расширяет JFrame.

Это не мой код, и он вызывает супер, прежде чем начинает создавать графический интерфейс. Мне интересно, почему это делается, поскольку я всегда просто обращался к методам суперкласса без необходимости вызова super();

8 ответов

Решение

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

Пример, где явный вызов super() дает вам дополнительный контроль над заголовком фрейма:

class MyFrame extends JFrame
{
    public MyFrame() {
        super("My Window Title");
        ...
    }
}

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

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

Звоните ли вы super() в вашем конструкторе или нет, это не влияет на вашу способность вызывать методы вашего родительского класса.

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

Ни один из приведенных выше ответов не отвечает на вопрос «почему». Найдено хорошее объяснение здесь :

Подкласс может иметь свои собственные закрытые данные-члены, поэтому подкласс также может иметь свои собственные конструкторы.

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

Ваше здоровье

Мы можем получить доступ к элементам суперкласса, используя метод super

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

    class parent {
    String str="I am parent";
    //method of parent Class
    public void foo() {
        System.out.println("Hello World " + str);
    }
}

class child extends parent {
    String str="I am child";
    // different foo implementation in child Class
    public void foo() {
        System.out.println("Hello World "+str);
    }

    // calling the foo method of parent class
    public void parentClassFoo(){
        super.foo();
    }

    // changing the value of str in parent class and calling the foo method of parent class
    public void parentClassFooStr(){
        super.str="parent string changed";
        super.foo();
    }
}


public class Main{
        public static void main(String args[]) {
            child obj = new child();
            obj.foo();
            obj.parentClassFoo();
            obj.parentClassFooStr();
        }
    }

Он просто вызывает конструктор по умолчанию суперкласса.

Мы используем ключевое слово super для вызова членов суперкласса.

Поскольку подкласс наследует все члены (поля, методы, вложенные классы) от своего родителя, и поскольку конструкторы НЕ являются членами (они не принадлежат объектам. Они несут ответственность за создание объектов), они НЕ наследуются подклассами.

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

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

Примечание: даже если у вас нет super() в вашем первом операторе, компилятор добавит его за вас!

поскольку конструктор не является частью класса, поэтому при вызове его нельзя реализовать, используя SUPER(), мы можем вызывать члены и функции-члены в конструкторе.

Мы можем получить доступ к членам SuperClass, используя super()

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

public class Superclass {

    public void printMethod() {
        System.out.println("Printed in Superclass.");
    }
}

// Здесь есть подкласс, называемый Subclass, который переопределяет printMethod():

public class Subclass extends Superclass {

    // overrides printMethod in Superclass
    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

В подклассе простое имя printMethod() ссылается на тот, который объявлен в подклассе, который переопределяет тот в суперклассе. Итак, чтобы сослаться на printMethod() Унаследованный от Superclass, Subclass должен использовать полное имя, используя super, как показано. Компиляция и выполнение Subclass печатает следующее:

Printed in Superclass.
Printed in Subclass
Другие вопросы по тегам