Podczas gdy wszystkie powyższe odpowiedzi są poprawne, nieco trudniej jest nowszym przyjaciołom zawinąć je w głowę. Postaram się odpowiedzieć na to pytanie od nowa dla nowych osób.
Problem, przed którym stanął Ayush, polegał na próbie utworzenia instancji klasy Object
przez konstruktor no-arg. Ta klasa ma jednak jeden lub więcej sparametryzowanych konstruktorów, co powoduje błąd czasu kompilacji.
Na przykład, utwórzmy klasę Student
za pomocą pojedynczego sparametryzowanego konstruktora i spróbuj utworzyć instancję za pomocą konstruktora no-arg.
public class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo) {
this.name = name;
this.rollNo = rollNo;
}
public static void main(String[] args) {
// The line below will cause a compile error.
Student s = new Student();
// Error will be "The constuctor Student() is undefined"
}
}
Woha! Ale gdy usuniemy konstruktor razem, błąd zniknie i kod się skompiluje.
Powód tej pozornej anomalii polega na tym, że Java tylko dostarcza nam domyślnego konstruktora (no-arg), gdy nie definiujemy żadnego konstruktora dla tej klasy na własną rękę.
Na przykład poniższa klasa jest dostarczana z domyślnym contructor:
public class Student {
private String name;
private int rollNo;
}
staje:
public class Student {
private String name;
private int rollNo;
//Default constructor added by Java.
public Student() {
super();
}
}
Innymi słowy, moment możemy zdefiniować dowolną sparametryzowanego konstruktora, my koniecznością również definiuj konstruktor no-arg, jeśli chcemy utworzyć instancję tej klasy przez konstruktor no-arg.
Również w przypadku dziedziczenia, podklasa bez konstruktorów; jest dostarczany domyślny konstruktor . Ten domyślny konstruktor dostarczany przez Javę jak wyżej wywołuje konstruktor no-arg super klasy. Jeśli nie może go znaleźć, spowoduje to błąd.
Tak, to zawsze dobry wybór, aby zdefiniować konstruktor no-arg/default.
Ref: Oracle Java Tutorial
[Link do dokumentów] (https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html): "Nie musisz dostarczać żadnych konstruktorów dla swojej klasy, ale musisz bądź ostrożny, gdy to robi Kompilator automatycznie dostarcza domyślny konstruktor bezargumentowy dla dowolnej klasy bez konstruktorów.Ten domyślny konstruktor wywoła konstruktor bezargumentowy superklasy.W tej sytuacji kompilator będzie narzekał, jeśli nadklasa nie zrobi t mamy konstruktor bezargumentowy, więc musisz go zweryfikować. " – ruhong
A domyślnie obiekt jest superklasą wszystkich klas, wywoływany jest nieargumentowy konstruktor obiektu? – Lucky
@Lucky Wszystkie klasy rzeczywiście niejawnie rozszerzają 'Object', więc tak, wywoływane jest' Object() '. –