Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在初始化变量时使用new,然后赋值和仅仅赋值之间有区别吗?_Java_Object_Reference - Fatal编程技术网

Java 在初始化变量时使用new,然后赋值和仅仅赋值之间有区别吗?

Java 在初始化变量时使用new,然后赋值和仅仅赋值之间有区别吗?,java,object,reference,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;

我正在努力学习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()对象,然后丢弃它(这只是浪费内存和处理器周期)

所以

以上两行,做完全相同的事情


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

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

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();
这是对Person对象的引用

anotherGuy = new Person();
anotherGuy = getGuy();
这将设置对新Person对象的引用

anotherGuy = new Person();
anotherGuy = getGuy();
这将引用设置为与foo的guy成员相同的引用

如果您想“复制”对象,您可能需要查看object.clone()

这是对Person对象的引用

anotherGuy = new Person();
anotherGuy = getGuy();
这将设置对新Person对象的引用

anotherGuy = new Person();
anotherGuy = getGuy();
这将引用设置为与foo的guy成员相同的引用


如果您想“复制”对象,您可能想查看object.clone()

是的,两者都做相同的事情,在两个方法调用之后,
anotherGuy==null
是的,两者都做相同的事情,在两个方法调用之后,
anotherGuy==null

虽然人们已经讨论/解释了现有代码的行为,但为了做您想做的事情,请使用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();

虽然人们已经讨论/解释了现有代码的行为,但为了做您想做的事情,请使用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();

person-anotherGuy=新的person();应该是“Person-anotherGuy=new-Person();”-这不是你问题的答案,而是一个建议:)并且返回值在方法声明中暗示为object,所以public-guy-getGuy(),应该是public-Person-getGuy():)对不起,我不聪明,但如果你开始练习代码约定就好了:)哈哈..谢谢。很抱歉,这是一个打字错误。person anotherGuy=new person();应该是“Person-anotherGuy=new-Person();”-这不是你问题的答案,而是一个建议:)并且返回值在方法声明中暗示为object,所以public-guy-getGuy(),应该是public-Person-getGuy():)对不起,我不聪明,但如果你开始练习代码约定就好了:)哈哈..谢谢。对不起,这是打字错误。谢谢大家的解释。所以在Java中,当我将一个对象分配给另一个对象时,我只通过引用来完成。要创建一个全新的对象,我必须执行object.clone()或其他操作,对吗?忘记object.clone(),它在大多数情况下都是坏的(阅读Joshua Bloch的《高效Java》了解更多信息)。您可以使用
newsomeobject()
或工厂方法或复制构造函数(如果可用)创建新对象。感谢所有人的解释。所以在Java中,当我将一个对象分配给另一个对象时,我只通过引用来完成。要创建一个全新的对象,我必须执行object.clone()或其他操作,对吗?忘记object.clone(),它在大多数情况下都是坏的(阅读Joshua Bloch的《高效Java》了解更多信息)。您可以使用
newsomeobject()
或工厂方法或复制构造函数(如果可用)来创建新对象。