Когда я использую super ()?


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

Edit:
Я нашел этот пример кода, где super.variable используется:

class A
{
    int k = 10;
}

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

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

11 72

11 ответов:

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

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

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}

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

вы также можете использовать 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

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

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

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

например:

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

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

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

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

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

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

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

Я просто попробовал, комментируя 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();
    }
}

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

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

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

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

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

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

super();  

или:

super(parameter list);

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

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

похожие темы:

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