繁体   English   中英

关于 Java 接口 Cloneable

[英]About the Java interface Cloneable

我有一个关于接口 Cloneable.that 的问题:

  1. 首先,我定义了一个名为 User 的类。

    public class User{ public String name; public int age; public User(String name,int age){ this.name=name; this.age=age; } }

  2. 然后我定义一个名为 Account 的类,它包含嵌套对象 User 并实现 Cloneable。

    public class Account implements Cloneable{ public User user; public int num; public Account(User user,int num){ this.user=user; this.num=num; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }

  3. 最后,我创建了一个名为 A 的 Test 类来验证来自原始对象的用户是否等于来自克隆对象的用户,并打印用户的姓名和年龄。 结果让我感到困惑,因为一些教程演示的对象引用只是肤浅的copy 并且原始对象和克隆对象都使用相同的内存地址。

    public class A { public static void main(String[] args) throws CloneNotSupportedException { User user=new User("alan", 24); Account a1=new Account(user, 0); Account a2=(Account) a1.clone(); System.out.println(a1.user==a2.user); System.out.println(a1.user.equals(a2.user)); System.out.println("a1.user.name="+a1.user.name); System.out.println("a1.user.age="+a1.user.age); System.out.println("a2.user.name="+a2.user.name); System.out.println("a2.user.age="+a2.user.age); a2.user=new User("mary", 20); System.out.println(a1.user==a2.user); System.out.println(a1.user.equals(a2.user)); System.out.println("a1.user.name="+a1.user.name); System.out.println("a1.user.age="+a1.user.age); System.out.println("a2.user.name="+a2.user.name); System.out.println("a2.user.age="+a2.user.age); } }

  4. 结果。

    true true a1.user.name=alan,a1.user.age=24 a2.user.name=alan,a2.user.age=24 false false a1.user.name=alan,a1.user.age=24 a2.user.name=mary,a2.user.age=20

我认为来自原始对象的用户与克隆对象相同。并且两个用户在更改后都具有相同的名称和年龄。请原谅我的英语不好,谢谢。

您正在调用Objectclone Javadoc 声明此方法执行浅复制:

类 Object 的方法 clone 执行特定的克隆操作。 首先,如果这个对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException。 请注意,所有数组都被认为实现了接口 Cloneable,并且数组类型 T[] 的克隆方法的返回类型是 T[],其中 T 是任何引用或原始类型。 否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样; 字段的内容本身不会被克隆。 因此,此方法执行此对象的“浅拷贝” ,而不是“深拷贝”操作。

这就是克隆后a1.user==a2.user的原因,因为两者都引用同一个User对象。 但是, a1 != a2

一些教程演示对象引用只是浅拷贝,原始对象和克隆对象使用相同的内存地址

我不确定你对什么感到困惑。 您的代码演示了同样的事情(如 Javadoc 中所述) - 克隆对象的成员是浅拷贝。 克隆对象的每个成员引用与原始对象的相应成员相同的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM