Не нужно ли помещать super () в конструктор? - PullRequest
151 голосов
/ 13 января 2010

Разве это не помещается компилятором автоматически, если я не помещаю его в конструктор подкласса?

Это означает, что мне даже не нужно заботиться об этом? В некоторых статьях это выкладывают.

И если у меня есть один конструктор с аргументами, это будет конструктор, или он принимает конструктор без списка аргументов?

Ответы [ 6 ]

211 голосов
/ 13 января 2010

Сначала немного терминологии:

  • Конструктор без аргументов: Конструктор без параметров;
  • Доступный конструктор без аргументов: конструктор без аргументов в суперклассе, видимый подклассу. Это означает, что он является либо общедоступным, либо защищенным, или, если оба класса находятся в одном пакете, доступ к пакету; и
  • Конструктор по умолчанию: открытый конструктор без аргументов, добавленный компилятором, когда в классе нет явного конструктора.

Таким образом, у всех классов есть хотя бы один конструктор.

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

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

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

Например:

public class Base { }
public class Derived extends Base { }

Это хорошо, потому что, если вы не добавите конструктор явно, Java вставит вам открытый конструктор по умолчанию.

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

Также хорошо.

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Выше приведена ошибка компиляции, поскольку у Base нет конструктора по умолчанию.

public class Base { private Base() { } }
public class Derived extends Base { }

Это также ошибка, потому что конструктор Base без аргументов является закрытым.

50 голосов
/ 13 января 2010

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

Источник: http://java.sun.com/docs/books/tutorial/java/IandI/super.html

20 голосов
/ 11 декабря 2016

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

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

Обновление (декабрь 2018 года):

Написание явного super() помогает перемещаться по исходному коду в IDE.

По состоянию на декабрь 2018 года ни Eclipse, ни IntelliJ не предоставляют никаких средств для удобного перехода от конструктора производного класса к конструктору базового класса.

6 голосов
/ 29 июня 2017

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

Главная

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

Печать

A
B
0 голосов
/ 16 февраля 2017

Любой конструктор класса всегда вызывает "super ()", если явно не вызывается super ([arguments]), только мы помним доступ конструктора суперкласса при программировании ... когда мы не расширяем какой-либо конкретный класс, автоматически расширяется java.lang.Object class

0 голосов
/ 14 января 2016
abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

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

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

class MyBook extends Book{   
int price ;
public  MyBook(String t,String a,int price){
     super(t,a);
    this.price=price;
}

public void display(){
    System.out.println("Title: "+title);
 System.out.println("Author: "+author); 
System.out.println("Price: "+price);

}

}

...