2010-04-04 18 views
15
$ cat Const.java 
public class Const { 
    String Const(String hello) { 
     return hello; 
} 
public static void main(String[] args) { 
    System.out.println(new Const("Hello!")); 
} 
} 
$ javac Const.java 
Const.java:7: cannot find symbol 
symbol : constructor Const(java.lang.String) 
location: class Const 
    System.out.println(new Const("Hello!")); 
        ^
1 error 
+0

consideri la modifica del titolo di questa interrogazione a qualcosa come "Java: è il mio costruttore qui restituire un valore?" Ho una domanda specifica su come Java restituisce i valori dai costruttori e ho pensato che questa domanda riguardasse quell'argomento più generale ... Invece è qualcosa come "Aiuto, non posso assegnare un valore di ritorno al mio costruttore!" – Jan

risposta

22

Quello che hai definito non è in realtà un costruttore, ma un metodo chiamato Const. Se è stato modificato il codice per qualcosa di simile, che avrebbe funzionato:

Const c = new Const(); 
System.out.println(c.Const("Hello!")); 

Se nessun costruttore specifica è definito esplicitamente, il compilatore crea automaticamente un costruttore senza argomenti.

1

Il costruttore non può restituire un valore. Questo è definitivo. Ha lo stesso senso: non può avere un tipo di ritorno ed è per questo che stai ricevendo l'errore di compilazione. Si può dire che il valore di ritorno è sempre implicitamente l'oggetto creato dal costruttore.

1

Un costruttore non può avere un valore di ritorno come una funzione "normale". Viene chiamato quando viene creata un'istanza della classe in questione. Viene utilizzato per eseguire l'inizializzazione di tale istanza.

22

I costruttori non possono restituire un valore; restituiscono l'oggetto costruito, per così dire.

Si ottiene un errore perché il compilatore sta cercando un costruttore che accetta una stringa come argomento. Dato che hai fatto non dichiarare un costruttore, l'unico costruttore disponibile è il costruttore predefinito che non accetta alcun argomento.

Perché dico che non hai dichiarato un costruttore? Perché non appena dichiari un valore/tipo di ritorno per il tuo metodo, non è più un costruttore ma un metodo normale.

Dal Java Documentation:

Una classe contiene costruttori che sono invocato per creare oggetti dal progetto di classe. Le dichiarazioni del costruttore assomigliano alle dichiarazioni del metodo , tranne per il fatto che utilizzano il nome della classe e non restituiscono il tipo .

Se si elabora ciò che si sta cercando di raggiungere qualcuno potrebbe essere in grado di dirti come è possibile raggiungere tale obiettivo.

0
public class Const { 
    private String myVar; 

    public Const(String s) { 
    myVar = s; 
    } 

    public String getMyString() 
    { 
     return myVar; 
    } 

    public static void main(String[] args) { 
    Const myConst = new Const("MyStringHere"); 
    System.out.println(myConst.getMyString()); 
    } 
} 
+1

Dovresti creare una funzione toString() invece di getMyString(). Quindi puoi fare 'System.out.println (myConst)' – Rhs

0

Penso che il modo migliore per produrre l'effetto desiderato sarebbe il seguente:

public class Const { 

    private String str; 

    public Const(String hello) { 
     str = hello; 
    } 

    public String toString() { 
     return str; 
    } 

    public static void main(String[] args) { 
     System.out.println(new Const("Hello!")); 
    } 
} 

Questo sostituisce il metodo public String Const() utilizzato in precedenza, e ridefinendo il metodo di Objectpublic String toString() (Che tutto Le classi Java ereditano da) Il valore String dell'oggetto viene stampato correttamente quando si desidera stampare l'oggetto, quindi il metodo principale rimane invariato.

5

Un costruttore non può restituire un valore perché un costruttore restituisce implicitamente l'ID di riferimento di un oggetto e poiché un costruttore è anche un metodo e un metodo non può restituire più di un valore. Quindi diciamo che il costruttore esplicito non ha un valore di ritorno.

2

Molte grandi risposte già. Vorrei solo aggiungere che, se si desidera ottenere un codice di ritorno separato dall'oggetto stesso come risultato del richiamo di un costruttore, è possibile racchiudere il costruttore in un factory method che, al momento della creazione, potrebbe ad esempio eseguire alcune convalide dei dati all'interno l'oggetto costruito e restituire un boolean a seconda del risultato.

0

Per restituire un valore da un costruttore - è sufficiente passare un array come parametro. per illustrare il principio:

Test() { 
    Boolean[] flag = new Boolean[1]; 
    flag[0] = false; 
    new MyClass(flag); 
    System.out.println(flag[0]); // Will output 'true' 
} 

class MyClass { 
    MyClass(Boolean[] flag) { 
     // Do some work here, then set flag[0] to show the status 
     flag[0] = true; 
    } 
} 
0
/************************************************ 
    Put the return value as a private data member, which gets 
    set in the constructor. You will need a public getter to 
    retrieve the return value post construction 
******************************************************/ 

class MyClass 
{ 
    private Boolean boolReturnVal; 

    public Boolean GetReturnVal() { return(boolReturnVal); } 
    MyClass() // constructor with possibly args 
    { 
     //sets the return value boolReturnVal 
    } 

public static void main(String args[]) 
{ 
    MyClass myClass = new MyClass(); 

    if (myClass.GetReturnVal()) 
    { 
     //success 
    } 

} 

}

Problemi correlati