“this()”在构造函数中做了什么?

时间:2010-03-03 19:23:09

标签: java constructor

我对以下代码有两个问题。 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) 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 个答案:

答案 0 :(得分:10)

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中运行代码。构造函数,在您的情况下,什么都不做。

答案 1 :(得分: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.
    }
}

答案 2 :(得分: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 );
    }
}

答案 3 :(得分:0)

你对最后一个语句是正确的,但是没有创建两个Person对象。在内部,这就像方法调用一样。我不明白你用这段代码想要实现的目标。在构造函数中调用最后一个构造函数new Person("1", "2")或内部this("1", "2")。这里也没有二传手。 Setter是setName(String)setAddress(String)等方法。 Getters是String getName()String getAddress()等方法。

正如另一个答案所说,你也不能拥有两个具有相同参数类型的构造函数。只需创建一个构造函数,其中包含您需要设置的所有内容。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这会调用Person(),但不会创建两个对象。