2010-04-04 22 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

trate de editar el título de esta pregunta a algo así como "Java: es mi constructor aquí devolver un valor?" Tenía una pregunta específica sobre cómo Java devuelve los valores de los constructores y pensé que esta pregunta era sobre un tema más general ... En cambio, es algo así como "¡Ayuda, no puedo asignarle un valor de retorno a mi constructor!" – Jan

Respuesta

22

Lo que ha definido no es realmente un constructor, sino un método llamado Const. Si ha cambiado su código a algo como esto, que funcionaría:

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

Si ningún constructor específica se define de forma explícita, el compilador crea automáticamente un constructor sin argumentos.

1

El constructor no puede devolver un valor. Eso es final. Tiene el mismo sentido: no puede tener un tipo de devolución y es por eso que está obteniendo el error de compilación. Puede decir que el valor de retorno siempre es implícitamente el objeto creado por el constructor.

1

Un constructor no puede tener un valor de retorno como una función "normal". Se llama cuando se crea una istancia de la clase en cuestión. Se utiliza para realizar la inicialización de esa instancia.

22

Los constructores no pueden devolver un valor; devuelven el objeto construido, por así decirlo.

Obtiene un error porque el compilador busca un constructor que tome como argumento una cadena. Como lo hizo no declare un constructor, el único constructor disponible es el constructor predeterminado que no toma ningún argumento.

¿Por qué digo que no declaró un constructor? Porque tan pronto como declaras un valor/tipo de retorno para tu método ya no es un constructor sino un método regular.

Desde el Java Documentation:

Una clase contiene constructores que son invocada para crear objetos a partir del modelo clase. Las declaraciones de constructor parecen declaraciones de método , excepto que usan el nombre de la clase y no tienen el tipo de devolución .

Si elabora lo que está tratando de lograr, alguien podría decirle cómo puede lograr ese objetivo.

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

Debe hacer una función toString() en lugar de getMyString(). Entonces puedes hacer 'System.out.println (myConst)' – Rhs

0

Creo que la mejor manera de producir el efecto deseado sería la siguiente:

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!")); 
    } 
} 

Esto reemplaza el método public String Const() utilizó anteriormente, y reemplazando el método de Objectpublic String toString() (que todo Las clases Java heredan de) el valor String del objeto se imprime correctamente cuando desea imprimir el objeto, por lo que su método principal permanece sin cambios.

5

Un constructor no puede devolver un valor porque un constructor devuelve implícitamente el ID de referencia de un objeto, y dado que un constructor también es un método y un método no puede devolver más de un valor. Entonces decimos explícitamente que el constructor no tiene un valor de retorno.

2

Muchas respuestas excelentes ya. Me gustaría agregar que, si desea obtener un código de retorno separado del objeto como resultado de invocar un constructor, puede envolver el constructor en un factory method que, al crearlo, podría, por ejemplo, hacer alguna validación de datos dentro de el objeto construido y devuelve un boolean dependiendo del resultado.

0

Para devolver un valor de un constructor, simplemente pase una matriz como parámetro. para ilustrar el 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 
    } 

} 

}

Cuestiones relacionadas