2010-09-04 10 views
21

Działa poprawnie, gdy konstruktory nie są zdefiniowane, ale daje błędy, jeśli zdefiniuję sparametryzowany konstruktor, a nie domyślny i nie przekazuje żadnych wartości podczas tworzenia obiektu. Myślałem, że konstruktory są predefiniowane.Czy naprawdę muszę zdefiniować domyślny konstruktor w java?

Dlaczego muszę zdefiniować domyślny konstruktor, jeśli zdefiniowałem sparametryzowany konstruktor? Czy nie zdefiniowano domyślnego konstruktora?

Odpowiedz

48

Domyślny konstruktor (bez argumentów) jest automatycznie tworzony tylko, gdy nie definiujesz samodzielnie żadnego konstruktora.

Jeśli potrzebujesz dwóch konstruktorów, jednego z argumentami i jednego bez, musisz ręcznie zdefiniować oba.

+1

[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

+0

A domyślnie obiekt jest superklasą wszystkich klas, wywoływany jest nieargumentowy konstruktor obiektu? – Lucky

+0

@Lucky Wszystkie klasy rzeczywiście niejawnie rozszerzają 'Object', więc tak, wywoływane jest' Object() '. –

10

Konstruktor no-arg jest wstawiany automatycznie, jeśli go nie napiszesz. Oznacza to, że jeśli napiszesz konstruktor z pewnymi parametrami, będzie to jedyny konstruktor, więc musisz przekazać pewne wartości dla tych parametrów, aby utworzyć jego instancję.

1

To jest dokładnie oczekiwane zachowanie.

Java automatycznie generuje wartość domyślną (bez konstruktorów argumentów) dla klas, które nie mają żadnego konstruktora.

Jeśli zdefiniujesz inny konstruktor (z argumentami), domyślny konstruktor nie zostanie wygenerowany. Jeśli nadal chcesz taki, musisz go zdefiniować samodzielnie.

8

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

1

Gdy klasa jest spełnione, jeśli kompilator nie znaleziono żadnej ważnej konstruktor w klasie (domyślnie, parametryzowane) tylko wtedy będzie on zastąpić automatycznie generowane domyślnego konstruktora dla klasy.

Zauważyłeś, możesz tworzyć obiekty bez domyślnego konstruktora zdefiniowanego w twojej klasie, przychodzi pojęcie generowanego automatycznie konstruktora domyślnego. Kiedy tworzony jest obiekt, wywoływany jest domyślny konstruktor.

Ale jeśli zdefiniować konstruktor parametryzowane w swojej klasie, co oznacza, że ​​ograniczają obiekty, które mają parametry

Przykład: Każdy pracownik musi mieć identyfikator.

W tym czasie kompilator nie wstawi żadnego domyślnego konstruktora, ponieważ istnieje poprawny konstruktor w klasie. Jeśli potrzebujesz również konstruktora domyślnego, musisz zdefiniować samodzielnie.

Powiązane problemy