为什么打印的最终名称是相同的,如果this.name = name
改为,则名称将被更改。
另一个问题是在类名public name(){}
中创建的?是否只是使用下一行是好的。
class Name
{
private String firstName;
private String lastName;
public Name() {}
public Name(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getFirstName()
{
return this.firstName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public String getLastName()
{
return this.lastName;
}
}
public class Person
{
private final Name name;
public Person(Name name)
{
this.name = new Name(name.getFirstName(), name.getLastName());
}
public Name getName()
{
return new Name(name.getFirstName(), name.getLastName());
}
public static void main(String[] args)
{
Name n =new Name("wukong", "sun");
Person p= new Person(n);
System.out.println(p.getName().getFirstName() + p.getName().getLastName());
n.setFirstName("bajie");
System.out.println(p.getName().getFirstName() + p.getName().getLastName());
}
}
答案 0 :(得分:0)
final
private final Name name;
final
修饰符表示在构造函数或init中分配后,字段Name
指向的name
对象的引用无法更改块。这样做不意味着无法更改此引用指向的对象。
注意:在字段声明和第一次初始化之间,它处于“空白”状态,等待init。
如果改为“this.name = name”,则名称将被更改
this.name = new Name(name.getFirstName(), name.getLastName());
这段代码创建了一个新的Name
对象,并通过对该新对象的引用初始化您的字段。使用与参数name
相同的内容初始化创建的对象。如果您稍后在此处作为参数传递的名称上调用setFirstName("bajie");
,则不会更改字段的内容(因为它是另一个对象)。
this.name = name;
这段代码将参数name
分配给this.name
字段。如果您稍后在此处作为参数传递的名称上调用setFirstName("bajie");
,则将更改字段的内容,因为它是相同的对象。但它不会改变该领域所持的参考。
另一个问题是在类名称“公共名称(){}”是否为?
创建
空的无参数构造函数是“默认”构造函数。
但是,如果您声明另一个构造函数(这里使用第二个构造函数public Name(String firstName, String lastName)
),则默认构造函数不再存在。
如果您希望能够在没有args的情况下实例化Name
,则需要重新声明no-arg构造函数。
答案 1 :(得分:0)
为什么打印的最终名称是相同的
您将在Person
构造函数中找到答案,this.name = new Name(name.getFirstName(), name.getLastName());
您没有为人员分配名称,但您使用字段创建新对象。因此,此声明n.setFirstName("bajie");
不会影响您的p
if" this.name = name"相反,名称将被更改。
试试吧
在类名称"公共名称(){}"是为什么创建的?只需使用下一行即可。 一些框架要求类具有无参数的构造。当您定义自己的构造函数时,您将丢失默认的无参数构造函数。这一行为你创造了一个
答案 2 :(得分:0)
好的,所以你在这里混合所有对象和引用。首先,请将您的getName()函数更改为: -
public Name getName()
{
return this.name;
}
这将返回与person类关联的当前名称对象,而不是像返回新名称(...)时那样创建新的名称实例。
更改n(名称对象)的值的第二件事不会影响包含名称对象的不同实例的人物对象。
用于更改p对象的firstName值替换此
n.setFirstName("bajie");
用这个: -
p.getName().setFirstName("bajie");
编辑: - 我刚看到你的Name字段被设置为final,因此它只能在构造函数中实例化并赋值一次,之后它不能改变(引用),尽管你可以重新分配p.getName()。 getFirstName()(因为对象正在改变而不是引用)。
对于第二个问题,它是一个默认构造函数,即自动生成的无参数构造函数,除非您定义另一个构造函数(在您定义的情况下已定义)