使用new初始化变量,后跟赋值和初始化赋值是否有区别?

时间:2011-09-23 15:36:14

标签: java object reference

我正在努力学习Java。

我有一个自定义类,它具有以下属性:

public class Person{
    private String name;
}

我有另一堂课,我在那里:

public class foo{
    private Person guy;

    public void setGuy(Person guy){
        this.guy = guy;
    }

    public Person getGuy(){
        return guy;
    }

    void someMethod(){
        Person anotherGuy = new Person();
        anotherGuy = getGuy();
    }
}

当我使用getGuy()方法时,我很困惑。 当我这样做时,我想:

Person anotherGuy = new Person();
anotherGuy = getGuy();

我创建了一个新对象,它与guy具有相同的值。但似乎另一个人实际上是指向家伙的指针。 所以

Person anotherGuy = getGuy();

和以上2行,做同样的事情?我很迷惑。那么我如何在内存中创建一个全新的对象呢?

5 个答案:

答案 0 :(得分:1)

  

所以

Person anotherGuy = getGuy();
     

和上面两行,做同样的事情?

不,另一个版本首先创建一个新的Person()对象然后丢弃它(这只是浪费内存和处理器周期)。

答案 1 :(得分:1)

Person anotherGuy;

这是对Person对象的引用

anotherGuy = new Person();

这将设置对新Person对象的引用

anotherGuy = getGuy();

这将引用与foo的成员相同的引用。

我想要“复制”你可能想要查看Object.clone()

的对象

答案 2 :(得分:1)

虽然人们已经谈过/解释了现有代码的行为,但为了做你想做的事,请使用Java中的clone功能,其中你的Person类将实现Cloneable接口,它会要求您实现clone()方法。

您的clone()方法应该是这样的:

public Object clone()
{
   Person p = new Person();
   p.setName(this.name);
   // similarly copy any other properties you want
   return p;
}

然后调用clone来复制你的对象:

Person another = (Person) person.clone();

答案 3 :(得分:0)

Java变量只能包含基元和引用。 Person是对象的引用。 (您不必像在C ++中那样使用&,因为它是唯一的选项)

当你这样做时

Person anotherGuy = new Person(); // create a new object and assign the reference.
anotherGuy = getGuy(); // change the reference in `anotherGuy` to be the one returned by getGuy();

答案 4 :(得分:0)

是的,在两次方法调用anotherGuy == null之后都做同样的事情。