Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的继承以及成员是如何继承的_Java_Inheritance_Design Patterns - Fatal编程技术网

Java中的继承以及成员是如何继承的

Java中的继承以及成员是如何继承的,java,inheritance,design-patterns,Java,Inheritance,Design Patterns,我在研究builder设计模式时遇到了一个bug。为什么PersonBuilder类的Person成员在DetailsBuilder和JobBuilder类中不同?它们不应该是同一个对象,并且组织和名称函数更新同一个对象吗 当我运行代码时,我得到以下输出: Person{name='name', org='null'} Person{name='name', org='null'} Person{name='null', org='org'} Person{name='null', org='o

我在研究builder设计模式时遇到了一个bug。为什么PersonBuilder类的Person成员在DetailsBuilder和JobBuilder类中不同?它们不应该是同一个对象,并且组织和名称函数更新同一个对象吗

当我运行代码时,我得到以下输出:

Person{name='name', org='null'}
Person{name='name', org='null'}
Person{name='null', org='org'}
Person{name='null', org='org'}
代码:

class Person
{
    public String name;
    public String org;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", org='" + org + '\'' +
                '}';
    }
}

class PersonBuilder {
    Person person = new Person();

    public DetailsBuilder details() {
        System.out.println(person);
        return new DetailsBuilder();
    }
    public JobBuilder job() {
        System.out.println(person);
        return new JobBuilder();
    }
    public Person build(){
        return person;
    }
}

class DetailsBuilder extends PersonBuilder{

    public PersonBuilder name(String name) {
        this.person.name = name;
        System.out.println(person);
        return this;
    }
}

class JobBuilder extends PersonBuilder{


    public PersonBuilder org(String org) {
        this.person.org = org;
        System.out.println(person);
        return this;
    }
}

public class Main {

    public static void main(String[] args) {
        PersonBuilder personBuilder = new PersonBuilder();
        Person p = personBuilder.details().name("name").job().org("org").build();
        System.out.println(p);

    }
}

这是因为每次创建生成器时,您都在创建它的Person实例。因此,每次创建这些构建器时,都会得到不同的Person实例。如果您需要相同的实例,则必须传递Person对象的上一个引用。

在PersonBuilder中创建新的JobBuilder或DetailsBuilder时,您还需要创建Person对象的新实例


public class TestJavaCode {

    public static void main(String[] args) {
        PersonBuilder personBuilder = new PersonBuilder();
        System.out.println("personBuilder.person: " + personBuilder.person.hashCode());
        DetailsBuilder details = personBuilder.details();
        System.out.println("details.person: " + details.person.hashCode());
        PersonBuilder name = details.name("name");
        System.out.println("name.person: " + name.person.hashCode());
        JobBuilder job = name.job();
        System.out.println("job.person: " + job.person.hashCode());
        PersonBuilder org = job.org("org");
        System.out.println("org.person: " + org.person.hashCode());
        Person p = org.build();
        System.out.println("p: " + p.hashCode());
        System.out.println(p);

    }
}

是的,现在说得通了。非常感谢。我有点不确定,问题是什么。你能提供源代码吗,它不能像你期望的那样工作?PS:对于简单的构建器,您可以使用ProjectLombok。看见