Когда я использую 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();
? Само по себе?
Ответы
Ответ 1
Вызов точно 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");
}
}
Ответ 2
super
используется для вызова constructor
, methods
и properties
родительского класса.
Ответ 3
Вы также можете использовать ключевое слово 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
Ответ 4
Если вы хотите, чтобы конструктор суперкласса вызывался - для инициализации полей внутри него. Взгляните на эту статью, чтобы понять, когда ее использовать:
http://download.oracle.com/javase/tutorial/java/IandI/super.html
Ответ 5
Вы использовали бы его как первую строку конструктора подкласса, чтобы вызвать конструктор его родительского класса.
Например:
public class TheSuper{
public TheSuper(){
eatCake();
}
}
public class TheSub extends TheSuper{
public TheSub(){
super();
eatMoreCake();
}
}
Построение экземпляра TheSub
вызовет как eatCake()
, так и eatMoreCake()
Ответ 6
Вы можете использовать его для вызова метода суперкласса (например, когда вы переопределяете такой метод, super.foo() и т.д.) - это позволит вам сохранить эту функциональность и добавить к ней все, что у вас есть в методе переопределения.
Ответ 7
Супер вызовет ваш родительский метод. См.: http://leepoint.net/notes-java/oop/constructors/constructor-super.html
Ответ 8
Вы вызываете super()
, чтобы специально запустить конструктор вашего суперкласса. Учитывая, что класс может иметь несколько конструкторов, вы можете вызвать конкретный конструктор с помощью super()
или super(param,param)
или вы можете позволить Java обрабатывать это и вызывать стандартный конструктор. Помните, что классы, которые следуют за иерархией классов, следуют за отношением "is-a".
Ответ 9
Первая строка конструктора вашего подкласса должна быть вызовом super()
, чтобы гарантировать, что вызывается конструктор суперкласса.
Ответ 10
Из документации oracle страница:
Если ваш метод переопределяет один из его методов суперкласса, вы можете вызвать переопределенный метод с помощью ключевого слова super
.
Вы также можете использовать super
для ссылки на скрытое поле (хотя скрывать поля не рекомендуется).
Использование super
в конструкторе подклассов:
Вызов конструктора суперкласса должен быть первой строкой в конструкторе подкласса.
Синтаксис для вызова конструктора суперкласса
super();
или
super(parameter list);
С super()
вызывается конструктор без аргументов суперкласса. С помощью super(parameter list)
вызывается конструктор суперкласса с соответствующим списком параметров.
Примечание. Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов конструктору без аргументов суперкласса. Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции.
Похожие сообщения:
Полиморфизм против переопределения и перегрузки
Ответ 11
Я просто попробовал, комментируя 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();
}
}