构造函数中的"this()"是什么意思?

8

以下是关于上述代码的两个问题:

  1. 如何在不使用setter的情况下构造第三个构造函数?
  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)已经被定义。 }
Person(String name,String address){ this(); this.name = name; this.address = address; } }

我对第一个问题的解决方案是:

Person(Object address){
        this.address = (String)address;
}
但我不确定这是否正确。

我认为最后一个构造函数中的this();调用了构造函数Person(){},但如果是这样的话,那当我调用

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

时,是不是创建了两个Person对象呢?

谢谢!


感谢您的快速回复。实际上,我正在阅读另一篇帖子,并突然想到了这两个不确定的问题,所以就编了这个例子。 然而,问题现在已经清楚了,再次感谢。 - user200340
6个回答

12

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()"只是告诉构造函数调用默认构造函数以便构造对象。它并不会创建两个对象,而只是运行默认构造函数中的代码,在你的情况下,这些代码什么也没做。


好的回答。不过,为什么不用这个方法来反转字符串(String, "")(请参见我的回答)? - JasCav
是的,那是一个好观点,对你的答案点赞。让更通用的构造函数调用更特定的构造函数。 - Andy White

4

然而,有一件事需要考虑 - 你是否希望创建一个没有姓名或地址的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
使用工厂方法构造此对象。
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
关于最后一句话,你是对的,但并没有创建两个Person对象。在内部,这就像一个方法调用。我不明白你想通过这段代码实现什么。要调用最后一个构造函数new Person("1", "2"),或者在构造函数中使用this("1", "2")。这里也没有setter。Setter是像setName(String)setAddress(String)等方法。Getter是像String getName()String getAddress()这样的方法。
正如另一个答案所说,你也不能有两个具有相同参数类型的构造函数。只需创建一个构造函数,其中包含您需要设置的所有内容即可。

0
  1. 抱歉,我没有理解问题
  2. 是的,this() 调用了第一个构造函数。但不用担心,不会创建两个实例!实际上创建新实例分为两部分:内存分配和调用构造函数。因此,如果您在内部调用另一个构造函数,它只会执行那段代码。构造函数本身只是一个特殊的方法,它不会创建实例。

0

这个调用了Person()函数,但是没有创建两个对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接