对#" final"感到困惑用法,打印出来的名字为什么会这样

时间:2014-05-12 08:28:55

标签: java

为什么打印的最终名称是相同的,如果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());
    }
}

3 个答案:

答案 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");,则更改字段的内容,因为它是相同的对象。但它不会改变该领域所持的参考。

关于no-arg构造函数

  

另一个问题是在类名称“公共名称(){}”是否为?

创建

空的无参数构造函数是“默认”构造函数。

但是,如果您声明另一个构造函数(这里使用第二个构造函数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()(因为对象正在改变而不是引用)。

对于第二个问题,它是一个默认构造函数,即自动生成的无参数构造函数,除非您定义另一个构造函数(在您定义的情况下已定义)