Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

У нас есть два класса: родительский класс и класс Child, с различными реализациями метода 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();
        }
    }

Ответ 4

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

Ответ 5

Мы можем получить доступ к членам SuperClass, используя 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, как показано. Компиляция и выполнение подкласса печатает следующее:

Printed in Superclass.
Printed in Subclass