2011-09-23 35 views
0

我正在学习Java。使用new初始化一个变量,之后是赋值并仅初始化赋值,是否有区别?

我有一个自定义的类,它有一个属性:

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(); 

我创建一个新的对象,它具有相同的值的家伙。但看起来anotherGuy实际上是一个指向家伙的指针。 所以

Person anotherGuy = getGuy(); 

和上面的2行,做同样的事情?我很困惑。另外,如何在内存中创建一个全新的对象?

+0

人anotherGuy =新的Person();应该是“Person anotherGuy = new Person();” - 这不是你的问题的答案,而是一个建议:) – doNotCheckMyBlog

+0

thanks..corrected! – rgamber

+0

并且返回值意味着方法声明中的对象,所以public guy getGuy(),应该是public getGuy():)对不起,不是智慧,但它是好的,如果你开始练习代码约定:) – doNotCheckMyBlog

回答

1

所以

Person anotherGuy = getGuy(); 

和2行以上,做同样的事情?

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

+0

谢谢大家的解释。所以在Java中,当我将一个对象分配给另一个对象时,我仅通过引用来完成。要创建一个全新的对象,我将不得不做Object.clone()或其他的东西,对吗? – rgamber

+0

忘记Object.clone(),它在大多数情况下被破坏(阅读Joshua Bloch的Effective Java以了解更多信息)。您可以使用'new SomeObject()'或工厂方法或复制构造函数(如果可用)创建一个新对象。 –

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(); 
1
Person anotherGuy; 

这是一个Person对象

anotherGuy = new Person(); 
参考

这设置对新Person对象的引用

anotherGuy = getGuy(); 

这设置参考与foo的家伙相同的参考。

我想“复制”对象则可能想为Object.clone看看()

0

是的,都做同样的事情,在这两个方法调用后,anotherGuy == null

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; 
} 

,然后调用克隆复制你的对象:

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