Object提供了colne方法给我们定义的类,用来进行对象克隆,但是这个clone方法是protected的,所以需要在我们需要使用clone的类中重写Object的clone方法,并且需要实现Cloneable接口,Cloneable接口是一个标记接口,可以理解为是一种规则,实现了Cloneable接口就相当于有了克隆的能力,实际上Cloneable接口里什么都没有,如果不去实现这个接口,虚拟机就不认为你这个类有克隆的能力,使用clone就会报错。
完成这些在调用类的clone函数时,ide还会抛出异常,提醒你clone可能会写错,将这个异常抛出即可:
以上只是一个浅克隆,浅克隆拷贝出的新对象,与原对象中的数据一模一样(引用类型拷贝的只是地址)。所有在在上面的拷贝之后,新对象中的分数成员变量直接将地址赋值过来了:
PS:因为字符串是不可变的,所以当修改String对象时,实际上是创建了一个新的String对象,而不是修改原始String对象的值。因此,即使拷贝对象和原始对象引用的是同一个String实例,对String值的修改只会影响到修改所属的对象。
而深克隆是:1.对象中基本类型的数据直接拷贝;2.对象中的字符串数据拷贝的还是地址,这个比较特殊,因为字符串是不可变的;3.对象中还包含的其他对象,不会拷贝地址,会创造新对象。
针对上面的情况,想要进行深拷贝,就要对scores单独再拷贝一次: