2014-07-25 9 views
7

Ho scritto questa semplice classe in Java solo per testare alcune delle sue funzionalità.costruttore java "void" e "non void"

public class class1 { 
    public static Integer value=0; 
    public class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

Il risultato è:

Ma in questo codice:

public class class1 { 
    public static Integer value=0; 
    public void class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

L'uscita di questo codice è:

Allora perché non, quando uso void nella dichiarazione metodo costruttore, il campo statico della classe non cambia più?

+9

Questo secondo non è un costruttore. È solo un metodo che capita di condividere un nome con la sua classe. – murgatroid99

+1

Perché non è più un costruttore. –

+4

la risposta a questa domanda simile [Perché i costruttori di java non hanno un tipo di ritorno] (http://stackoverflow.com/questions/6801500/why-do-constructors-in-java-non-have-a-return- tipo) dà una grande ragione. – Doswell

risposta

30

In Java, il costruttore non è un metodo. Ha solo il nome della classe e una visibilità specifica. Se dichiara che restituisce qualcosa, quindi non è un costruttore, nemmeno se dichiara che restituisce un void. Si noti la differenza qui:

public class SomeClass { 
    public SomeClass() { 
     //constructor 
    } 
    public void SomeClass() { 
     //a method, NOT a constructor 
    } 
} 

Inoltre, se una classe non definisce un costruttore, il compilatore aggiungerà automaticamente un costruttore di default per voi.

+2

Si può sostenere che un costruttore è un caso speciale di un metodo che viene utilizzato per inizializzare un'istanza dell'oggetto, poiché supporta sintatticamente il 99% di ciò che un costruttore supporta. – Makoto

+0

Evitare questo tipo di confusione è un'altra buona ragione per seguire le convenzioni di denominazione dei metodi [nella JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html). – azurefrog

+0

@Makoto In Java, [un costruttore è specificamente qualcosa che assomiglia molto ad un metodo ma non è un metodo] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8 .html # JLS-8.8). – chrylis

5

public void class1() non è un costruttore, è un metodo di annullamento il cui nome corrisponde al nome della classe. Non viene mai chiamato. Invece java crea un costruttore predefinito (poiché non ne hai creato uno), che non fa nulla.

1

L'utilizzo di void nel costruttore per definizione lo porta a non essere più il costruttore. Il costruttore in particolare non ha alcun tipo di reso. Mentre void non restituisce un valore nel senso stretto della parola, è ancora considerato un tipo di ritorno.

Nel secondo esempio (in cui si utilizza il void), si dovrebbe fare h.class1() per il metodo di chiamata perché non è più il costruttore. O potresti semplicemente rimuovere il vuoto.

0

Questo è probabilmente un difetto di progettazione in Java.

class MyClass { 

    // this is a constructor 
    MyClass() {...} 

    // this is an instance method 
    void MyClass() {...} 

} 

Perfettamente legale. Probabilmente non dovrebbe essere, ma lo è.

Nel tuo esempio, class1() non viene mai chiamato, perché non è un costruttore. Invece, viene chiamato il costruttore predefinito.

Suggerimento: familiarizzare con le convenzioni di denominazione Java. I nomi delle classi dovrebbero iniziare con lettere maiuscole.

+0

'MyClass x = new MyClass(); x.MyClass(); 'Perfettamente valido. – Cerbrus