Java “的区别是什么?”;直接将类对象分配给同一类的另一个对象;及;使用克隆();

Java “的区别是什么?”;直接将类对象分配给同一类的另一个对象;及;使用克隆();,java,clone,Java,Clone,我不熟悉Java编码。我怀疑是否能得到一个物体的副本 我试着用同一类的另一个对象分配obj,结果成功了。我通过访问两个对象中的类项来确认这一点,它们是相同的。那么,clone()有什么用呢 代码示例: 班级学生 { int-id; 字符串名; } 学生s1=新学生(); 学生s2=新学生(); s1.id=10; s2=s1指定对象只不过是指向已创建对象的引用。但克隆是整个对象的精确副本。 尝试使用新引用更改值,实际对象属性将更改,但在克隆中,只有新创建的对象才会更改。实际对象保持不变。指定对

我不熟悉
Java
编码。我怀疑是否能得到一个物体的副本

我试着用同一类的另一个对象分配obj,结果成功了。我通过访问两个对象中的类项来确认这一点,它们是相同的。那么,
clone()
有什么用呢

代码示例:

班级学生
{
int-id;
字符串名;
}
学生s1=新学生();
学生s2=新学生();
s1.id=10;

s2=s1指定对象只不过是指向已创建对象的引用。但克隆是整个对象的精确副本。
尝试使用新引用更改值,实际对象属性将更改,但在克隆中,只有新创建的对象才会更改。实际对象保持不变。

指定对象只不过是指向已创建对象的引用。但克隆是整个对象的精确副本。
尝试使用新引用更改值,实际对象属性将更改,但在克隆中,只有新创建的对象才会更改,实际对象保持不变。

克隆()方法保存了创建对象精确副本的额外处理任务。如果我们使用new关键字执行此操作,将需要执行大量的处理,这就是为什么我们使用对象克隆。

clone()方法节省了创建对象精确副本的额外处理任务。如果我们使用new关键字执行,将需要执行大量的处理,这就是为什么我们使用对象克隆。

当您将一个对象指定给另一个对象时,它仅引用同一位置。i、 e.两个对象具有相同的内存位置。如果选中,两个对象的属性值将相同

但是,这暴露了一个问题。每当更新第一个对象时,第二个对象的值也会更新

例如:

public class Student implements Cloneable{

int id;
String name;

public Student(int id, String name) {
    this.id = id;
    this.name = name;
}

public static void main(String[] args) throws CloneNotSupportedException {
    Student s1 = new Student(10, "A");
    Student s2 = s1;                        //simply assigning the s1 object's reference to s2
    Student s3= (Student)s1.clone();        //assigning s1 object's clone to s3

    System.out.printf("Before updation::s1.id->%d, s1.name->%s\n",s1.id, s1.name);
    System.out.printf("Before updation::s2.id->%d, s2.name->%s\n",s2.id, s2.name);
    System.out.printf("Before updation::s3.id->%d, s3.name->%s\n",s3.id, s3.name);

    s1.id = 20;
    s1.name= "Z";

    System.out.printf("After updation::s1.id-%d, s1.name->%s\n",s1.id, s1.name);
    System.out.printf("After updation::s2.id-%d, s2.name->%s\n",s2.id, s2.name);
    System.out.printf("After updation::s3.id-%d, s3.name->%s\n",s3.id, s3.name);
}
}
输出:
更新之前的
:s1.id->10,s1.name->A

更新之前的
:s2.id->10,s2.name->A

更新之前的
:s3.id->10,s3.name->A

更新后的
:s1.id-20,s1.name->Z

更新后的
:s2.id-20,s2.name->Z

更新后::s3.id-10,s3.name->A

通常克隆对象的方法,创建同一类的新实例,并将所有字段复制到新实例并返回它。这只是肤浅的复制品。对象类提供了一个克隆方法并支持浅拷贝。它将“Object”作为类型返回,您需要显式地转换回原始对象

因此,更改原始对象的值时,克隆对象的值保持不变


由于对象类具有克隆方法(受保护),因此不能在所有类中使用它。要克隆的类应该实现clone方法并覆盖它。它应该为copy提供自己的含义,或者至少应该调用super.clone()。此外,您还必须实现可克隆标记接口,否则您将获得CloneNotSupportedException

将一个对象指定给另一个对象时,它仅引用同一位置。i、 e.两个对象具有相同的内存位置。如果选中,两个对象的属性值将相同

但是,这暴露了一个问题。每当更新第一个对象时,第二个对象的值也会更新

例如:

public class Student implements Cloneable{

int id;
String name;

public Student(int id, String name) {
    this.id = id;
    this.name = name;
}

public static void main(String[] args) throws CloneNotSupportedException {
    Student s1 = new Student(10, "A");
    Student s2 = s1;                        //simply assigning the s1 object's reference to s2
    Student s3= (Student)s1.clone();        //assigning s1 object's clone to s3

    System.out.printf("Before updation::s1.id->%d, s1.name->%s\n",s1.id, s1.name);
    System.out.printf("Before updation::s2.id->%d, s2.name->%s\n",s2.id, s2.name);
    System.out.printf("Before updation::s3.id->%d, s3.name->%s\n",s3.id, s3.name);

    s1.id = 20;
    s1.name= "Z";

    System.out.printf("After updation::s1.id-%d, s1.name->%s\n",s1.id, s1.name);
    System.out.printf("After updation::s2.id-%d, s2.name->%s\n",s2.id, s2.name);
    System.out.printf("After updation::s3.id-%d, s3.name->%s\n",s3.id, s3.name);
}
}
输出:
更新之前的
:s1.id->10,s1.name->A

更新之前的
:s2.id->10,s2.name->A

更新之前的
:s3.id->10,s3.name->A

更新后的
:s1.id-20,s1.name->Z

更新后的
:s2.id-20,s2.name->Z

更新后::s3.id-10,s3.name->A

通常克隆对象的方法,创建同一类的新实例,并将所有字段复制到新实例并返回它。这只是肤浅的复制品。对象类提供了一个克隆方法并支持浅拷贝。它将“Object”作为类型返回,您需要显式地转换回原始对象

因此,更改原始对象的值时,克隆对象的值保持不变


由于对象类具有克隆方法(受保护),因此不能在所有类中使用它。要克隆的类应该实现clone方法并覆盖它。它应该为copy提供自己的含义,或者至少应该调用super.clone()。此外,您还必须实现可克隆标记接口,否则您将获得CloneNotSupportedException

你能发布你的代码吗;Thingy t2=t1;t2.s=“你好”;System.out.println(t1.s)在您发布的代码中,我没有看到任何对
clone()
的调用。我的问题是,使用clone()和我在没有它的情况下显示的实现有什么区别。您可以发布您的代码
类Thingy{String s;}Thingy t1=new Thingy();Thingy t2=t1;t2.s=“你好”;System.out.println(t1.s)在您发布的代码中,我没有看到对
clone()
的任何调用。我的问题是,使用clone()和我在没有它的情况下显示的实现有什么区别。哦,我明白了。听起来不错。谢谢你提供的信息。哦,我明白了。听起来不错。谢谢你提供的信息。