Что делает “это ()” делает в конструкторе?

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

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 = (Строка) адрес;} Однако я не уверен в этом.

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

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

Спасибо!!!

6
задан user200340 11 November 2011 в 22:30
поделиться

6 ответов

Проблема с 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;
}

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

10
ответ дан 8 December 2019 в 16:01
поделиться

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

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 );
    }
}
1
ответ дан 8 December 2019 в 16:01
поделиться

Но есть о чем подумать - ХОТИТЕ ли вы создать объект 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.
    }
}
4
ответ дан 8 December 2019 в 16:01
поделиться

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

0
ответ дан 8 December 2019 в 16:01
поделиться

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

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

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

Похожие вопросы: