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



我正在研究构建器设计模式并遇到了一个错误。为什么 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);
}
}

最新更新