Не нужно ли добавлять super() в конструктор?

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

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

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

Ответ 1

Во-первых, некоторая терминология:

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

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

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

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

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

Например:

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 no-args является закрытым.

Ответ 2

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

src: http://java.sun.com/docs/books/tutorial/java/IandI/super.html

Ответ 3

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

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

class Implicit {
    Implicit() {
    }
}

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

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

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

Ответ 4

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

Главная

public class Main {

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

А

public class A {

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

В

public class B extends A {

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

Печать

A
B

Ответ 5

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

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

super();  
--or--
super(parameter list);

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

Примечание. Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов конструктору без аргументов суперкласса. Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции. У объекта есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.

Ответ 6

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

Ответ 7

abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

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

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

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);

}

}