Что "this ()" делает в конструкторе? - PullRequest
6 голосов
/ 03 марта 2010

У меня есть два вопроса по поводу следующего кода. 1. Как конструировать третий конструктор без использования сеттера? 2. что делает this () в последнем конструкторе.

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;
    }
}

Мое решение вопроса Персона (Адрес объекта) { this.address = (String) адрес; } Однако я не уверен в этом.

и я так думаю (); в последнем конструкторе вызывает конструктор Person () {}, но если это так, значит ли это, что два объекта Person создаются при вызове

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

Спасибо !!!

Ответы [ 6 ]

10 голосов
/ 03 марта 2010

Проблема с Person(String name) и Person(String address) заключается в том, что у вас не может быть двух конструкторов с одинаковыми параметрами. Компилятор не будет знать, какой из них вызывать, когда вы хотите вызвать что-то вроде этого: new Person("Joe Blow");

Вы можете сделать что-то вроде этого:

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

"this()" в вашем последнем конструкторе просто говорит этому конструктору вызвать конструктор по умолчанию как часть процесса конструирования объекта. Он не создает два объекта, он просто запускает код в def. конструктор, который в вашем случае ничего не делает.

4 голосов
/ 03 марта 2010

Хотя есть о чем подумать - ХОТИТЕ создать объект Person, у которого нет имени или адреса? Если вы этого не сделаете, зачем предлагать эти конструкторы (не то, что вы можете в любом случае - они имеют одинаковые параметры, поэтому компилятор не может их дифференцировать)? Я думаю, что у каждого человека будет имя. Может быть, у кого-то не будет адреса.

Подумайте о своем объекте, прежде чем создавать конструкторы.

Другая возможность:

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.
    }
}
1 голос
/ 03 марта 2010

Используйте фабричные методы для создания этого объекта

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 голосов
/ 03 марта 2010

это вызывает Person (), но два объекта не создаются.

0 голосов
/ 03 марта 2010
  1. Извините, не понял вопроса
  2. Да, this () вызывает первый конструктор. Но не волнуйтесь, два экземпляра не будут созданы! На самом деле создание нового экземпляра выполняется в двух частях: выделение памяти, вызов конструктора. Поэтому, если вы вызовете внутренний конструктор другого, он просто выполнит этот код. Сам конструктор - это просто специальный метод, он не создает экземпляр
0 голосов
/ 03 марта 2010

Вы правы насчет последнего утверждения, но два объекта Person не созданы. Внутренне это похоже на вызов метода. Я не понимаю, чего вы пытаетесь достичь с помощью этого кода. Чтобы вызвать последний конструктор, new Person("1", "2") или внутренне this("1", "2") в конструкторе. Здесь также нет сеттеров. Сеттеры - это методы типа setName(String), setAddress(String) и т. Д. Методами получения являются методы типа String getName(), String getAddress().

Как сказал другой ответ, вы также не можете иметь два конструктора с одинаковыми типами аргументов. Просто создайте один конструктор со всем необходимым для его установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...