2014-12-26 12 views
16

W rzeczywistości nie rozumiem, jaka jest różnica między konstruktorem bez arg i domyślnym konstruktorem.Różnica między konstruktorem bez argów a konstruktorem domyślnym w Javie

import javax.swing.*; 

public class Test extends JFrame { 
    public Test() { 
    super(); 
    this.setSize(200,200); 
    this.setVisible(true); 
    } 
    public static void main(Sting[] arg) { 
     Test cFrame = new Test(); 
    } 
} 

Czy wywołuje to domyślny konstruktor tej klasy podczas tworzenia obiektu testowego o nazwie cFrame?

+5

no nie wywołać konstruktor domyślny teraz nie ma domyślnego konstruktora –

+5

Proszę odnieść się również do [Java] konstruktor domyślny (http://stackoverflow.com/questions/4488716/java -default-konstruktor) –

+3

@CodeGeek dzięki –

Odpowiedz

20

Konstruktor default jest konstruktorem bezargumentowym, który kompilator Java wstawia w Twoim imieniu; zawiera on wywołanie default do super(); (a nie supper()), które jest domyślnym zachowaniem. Jeśli zaimplementujesz dowolny konstruktor, nie będziesz już otrzymywać domyślnego konstruktora.

JLS-8.8.9. Default Constructor mówi (w części),

Jeśli klasa nie zawiera deklaracji konstruktora, a następnie domyślny konstruktor bez parametrów formalnych i nie rzuca klauzula jest niejawnie zadeklarowana.

Jeśli zadeklarowana klasa jest pierwotnym obiektem klasy, wówczas domyślny konstruktor ma puste ciało. W przeciwnym razie domyślny konstruktor po prostu wywołuje konstruktor nadklasy bez żadnych argumentów.

+3

Jestem wielkim fanem każdego połączenia z 'kolacją()' –

6

default constructor to konstruktor, który kompilator Java dodaje do kodu, jeśli nie jest dostępny jawny konstruktor. Domyślny konstruktor wywołuje konstruktor klasy super bez żadnych argumentów.

Jeśli dodałeś własny konstruktor (bez względu na to, czy jest on bez parametrów czy z parametrami), kompilator nie doda w tym przypadku domyślnego konstruktora.

5

Co to jest domyślny konstruktor?

Jest to konstruktor dodawany przez kompilator, jeśli nie zdefiniowano konstruktora.

Jeśli twoja klasa ma już konstruktor, kompilator nie doda domyślnego konstruktora.

Więc w twoim przypadku masz konstruktora,

public Test(){ 
    super(); 
    this.setSize(200,200); 
    this.setVisible(true); 
    } 

Więc nie ma domyślnego konstruktora teraz zostać wywołany przez JVM.

2

Odpowiedź jest ustawiona na Nie. Zmienna referencyjna cFrame wywoła konstruktor inny niż arg Test(), a nie domyślny konstruktor. Podczas gdy konstruktor Test() odnajdzie i wywoła nieargumentowy konstruktor klasy JFrame (Parent) i tak dalej, Każda klasa musi mieć przynajmniej jeden konstruktor. Jeśli nie jest jawnie zadeklarowany, kompilator java udostępnia niepasametryzowany konstruktor, tj. Konstruktor domyślny. Ten domyślny konstruktor wywołuje nieparametryzowany konstruktor klasy macierzystej. Inicjuje zmienne klasy do ich wartości domyślnych.

Np

Class Base {} 

Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables 

Kiedy konstruktor nie Arg zdefiniowany jedynie przez programistę. Może również inicjować zmienne. Jeszcze jeden punkt do dodania to to, że super() wywołanie jest automatycznie dodawane przez kompilator java, jeśli nie znajdzie super() w klasie pochodnej.

Np

Class Base { 

int y; 
    public Base() { 
    } 
    public int getY() { 
    return y; 
    } 

} 

public class Derived extends Base { 
private int x; 

public Derived() { //super() will be automatically used 
} 

public int getX() { 
return x; 
} 

public void setX(int x) { 
this.x = x; 
} 
} 

Derived d = new Derived(); 
System.out.println("Base x value => " + d.getX()); 

System.out.println("Base y value => " + d.getY()); 

Result: 

Base x value => 0 // Default value to its primitive datatype(In this case: int) 

Base y value => 0 
Powiązane problemy