2010-03-03 17 views
5

Tengo dos preguntas sobre el siguiente código. 1. ¿Cómo construir el tercer constructor sin usar setter? 2. ¿Qué hace esto() en el último constructor?¿Qué hace "this()" en un constructor?

 
public class Person { 

    private String name; 
    private String address; 

    Person(){} 
    Person(String name){ 
     this.name = name; 
    } 
    Person(String address){ 
     //Person(java.lang.String) is already defined. 
    } 

    Person(String name,String address){ 
     this(); 
     this.name = name; 
     this.address = address; 
    } 
} 

Mi solución para la pregunta es Persona (dirección de Object) { this.address = Dirección (cadena); } Sin embargo, no estoy seguro de esto.

y creo que esto(); en el último constructor llama constructor Person() {}, pero si lo hace, es que quiere decir que dos objetos son creados persona cuando llamo

 
Person p = new Person("myName","myAddress"); 

Gracias !!!

+0

Gracias por las respuestas rápidas. De hecho, estaba leyendo otra publicación y acabo de salir con estas dos preguntas inseguras, así que inventé este ejemplo. Sin embargo, la pregunta es clara ahora, gracias de nuevo. – user200340

Respuesta

8

El problema con Person(String name) y Person(String address) es que no se puede tener dos constructores con los mismos parámetros. El compilador no sabrá cuál de ellos para llamar cuando se quiere llamar a algo como esto: new Person("Joe Blow");

que podría hacer algo como esto en su lugar:

Person(String name) 
{ 
    this.name = name; 
} 
Person(String name, String address) 
{ 
    this(name); 
    this.address = address; 
} 

la "this()" en su última constructor es simplemente diciendo que constructor para llamar al constructor predeterminado como parte del proceso de construcción del objeto. No crea dos objetos, simplemente ejecuta el código en la definición. constructor, que en su caso, no hace nada.

+0

Buena respuesta. Sin embargo, ¿por qué no ir al revés con esto (String, "") (ver mi respuesta)? – JasCav

+0

Sí, ese es un buen punto +1 para su respuesta. Haga que los constructores más generales llamen a los más específicos. –

0

Tiene razón sobre la última declaración, pero no se crean dos objetos Persona. Internamente, esto es como una llamada a un método. No entiendo lo que estás tratando de lograr con este código. Para invocar el último constructor, new Person("1", "2"), o internamente this("1", "2") en un constructor. No hay setters aquí. Setters son métodos como setName(String), setAddress(String) y así sucesivamente. Los getters son métodos como String getName(), String getAddress().

Como dice otra respuesta, tampoco puede tener dos constructores con los mismos tipos de argumentos. Simplemente crea un constructor con todo lo que necesitas para configurarlo.

0
  1. lo siento no entiende la pregunta
  2. Sí, esto() llama primer constructor. ¡Pero no te preocupes, no se crearán dos instancias! En realidad, la creación de una nueva instancia se realiza en dos partes: asignación de memoria, constructor de llamadas. Entonces, si llamas internamente a otro constructor, simplemente ejecutará ese código. constructor de sí mismo es sólo un método especial, que no crea instancia
4

Sin embargo, algo para pensar: ¿QUIERES un objeto Persona creado que no tenga un nombre o dirección? Si no lo hace, ¿por qué ofrecer esos constructores (no es que pueda hacerlo de todos modos, tienen los mismos parámetros, por lo que el compilador no puede diferenciarlos)? Yo pensaría que cada persona tendría un nombre. Quizás alguien no tenga una dirección.

Piensa en tu objeto antes de crear tus constructores.

Otra posibilidad es:

public class Person { 

    private String name; 
    private String address; 

    Person(String name) { 
     this(name, ""); 
    } 

    Person(String name, String address) { 
     this.name = name; 
     this.address = address; 

     // TODO - Other initializations. 
    } 
} 
0

esta Llama a la persona(), pero dos objetos no se crean.

1

métodos de uso de la fábrica para la construcción de este objeto

public class Person { 

    private String name; 
    private String address; 

    public Person(String name, String address) { 
     this.name = name; 
     this.address = address; 
    } 

    public static Person createHomelessPerson (String name) 
    { 
     return new Person(name, null); 
    } 

    public static Person createNamelessPerson (String address) 
    { 
     return new Person(null, address); 
    } 
} 
+0

+1 para los nombres de los métodos! :RE –

Cuestiones relacionadas