Java 什么是;这个();你在构造函数中做什么?

Java 什么是;这个();你在构造函数中做什么?,java,constructor,Java,Constructor,关于下面的代码,我有两个问题。 1.如何在不使用setter的情况下构造第三个构造函数? 2.这个()在最后一个构造函数中做什么 public class Person { private String name; private String address; Person(){} Person(String name){ this.name = name; } Person(String address){

关于下面的代码,我有两个问题。 1.如何在不使用setter的情况下构造第三个构造函数? 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; } } 公共阶层人士{ 私有字符串名称; 私有字符串地址; Person(){} Person(字符串名称){ this.name=名称; } 人员(字符串地址){ //Person(java.lang.String)已定义。 } 人员(字符串名称、字符串地址){ 这个(); this.name=名称; this.address=地址; } } 我对这个问题的解决办法是 人员(对象地址){ this.address=(字符串)地址; } 不过,我对此并不确定

我认为这是一个问题;在上一个构造函数中,调用构造函数Person(){},但如果是,是否意味着在调用时创建了两个Person对象

Person p = new Person("myName","myAddress"); 人员p=新人员(“我的姓名”、“我的地址”);
谢谢

关于上一条语句,您是对的,但是没有创建两个人对象。在内部,这就像一个方法调用。我不明白你想用这段代码实现什么。要调用上一个构造函数,
newperson(“1”、“2”)
,或在构造函数中调用内部的
this(“1”、“2”)
。这里也没有二传手。setter是像
setName(String)
setAddress(String)
等方法。getter是类似于
stringgetname()
stringgetaddress()
的方法

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

  • 对不起,我没听懂这个问题
  • 是的,this()调用第一个构造函数。但别担心,不会创建两个实例!实际上,创建新实例分为两部分:内存分配和调用构造函数。因此,如果您在内部调用另一个构造函数,它将只执行该代码。构造函数本身只是一个特殊的方法,它不创建实例

  • Person(字符串名称)
    Person(字符串地址)
    的问题在于不能有两个具有相同参数的构造函数。当您想调用类似这样的东西时,编译器将不知道要调用哪一个:
    newperson(“joeblow”)

    您可以这样做:

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

    上一个构造函数中的“
    this()
    ”只是告诉该构造函数在构造对象的过程中调用默认构造函数。它不创建两个对象,只运行def中的代码。构造函数,在您的情况下,它什么也不做。

    但是需要考虑的是,您是否希望创建一个没有名称或地址的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.
        }
    }
    

    这将调用Person(),但未创建两个对象

    使用工厂方法构造此对象

    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。让更一般的构造函数调用更具体的构造函数。感谢您的快速回复。我实际上在读另一篇文章,只是提出了这两个不确定的问题,所以编了这个例子。不过,现在问题已经清楚了,再次感谢。