Когда я использую super ()? - PullRequest
78 голосов
/ 03 ноября 2010

В настоящее время я изучаю наследование классов в своем курсе Java и не понимаю, когда использовать вызов super()?

Редактировать:
Я нашел этот пример кода, где super.<em>variable</em> используется:

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

Так что я понимаю, что здесь вы должны использовать super для доступа к переменной k в суперклассе.Однако в любом другом случае, что делает super();?Сам по себе?

Ответы [ 11 ]

134 голосов
/ 03 ноября 2010

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

Однако, когда это становится полезным, супер-конструктор принимает аргументы, которые вы хотите передать из подкласса.

41 голосов
/ 03 ноября 2010

super используется для вызова constructor, methods и properties родительского класса.

22 голосов
/ 08 марта 2013

Вы также можете использовать ключевое слово super в подклассе, если вы хотите вызвать метод из родительского класса, если вы переопределили его в подклассе.

Пример:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

Здесь строка super.print() вызывает метод print() суперкласса CellPhone.Выход будет:

I'm a cellphone
I'm a touch screen cellphone
9 голосов
/ 03 ноября 2010

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

http://download.oracle.com/javase/tutorial/java/IandI/super.html

8 голосов
/ 03 ноября 2010

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

Например:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

Создание экземпляра TheSub будетпозвоните как eatCake() и eatMoreCake()

1 голос
/ 03 ноября 2010

Вы вызываете super(), чтобы специально запустить конструктор вашего суперкласса.Учитывая, что класс может иметь несколько конструкторов, вы можете либо вызвать конкретный конструктор, используя super(), либо super(param,param), либо вы можете позволить Java обработать это и вызвать стандартный конструктор.Помните, что классы, которые следуют иерархии классов, следуют отношениям "is-a".

1 голос
/ 03 ноября 2010

Super вызовет ваш родительский метод. Смотри: http://leepoint.net/notes-java/oop/constructors/constructor-super.html

1 голос
/ 03 ноября 2010

Вы можете использовать его для вызова метода суперкласса (например, когда вы переопределяете такой метод, super.foo () и т. Д.) - это позволит вам сохранить эту функциональность и добавить к ней все, что у вас естьв переопределенном методе.

0 голосов
/ 19 октября 2016

Я только что попробовал, комментируя super ();делает то же самое, не комментируя, как сказал @Mark Peters

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}
0 голосов
/ 02 октября 2016

Из документации оракула страница :

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

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

Использование super в конструкторе подклассов:

Вызов конструктора суперкласса должен быть первой строкой в ​​конструкторе подкласса.

Синтаксис для вызова конструктора суперкласса:

super();  

или:

super(parameter list);

При super() вызывается конструктор суперкласса без аргументов.При super(parameter list) вызывается конструктор суперкласса с соответствующим списком параметров.

Примечание: Если конструктор не вызывает явно конструктор суперкласса, компилятор Java автоматически вставляет вызов без аргументаконструктор суперкласса .Если у суперкласса нет конструктора без аргументов, вы получите ошибку во время компиляции.

Похожие записи:

Полиморфизм против переопределения против перегрузки

...