Java中Object类的clone()(克隆)方法
2015-02-11 23:04
288 查看
Java提供了一个projected修饰的clone()方法,该方法用来实现对象的“自我克隆”,即得到当前对象的一个副本,并且两个对象之间完全隔离。需要注意的是,由于该方法使用projected修饰,因此该方法只能被子类重写或者调用。
自定义类实现克隆的步骤如下:
1、首先自定义类需要实现Cloneable接口,该接口只是一个标记性接口(接口中没有定义任何方法),表明实现该接口的类可以实现“自身复制”;
2、自定义类实现自己的clone方法;
3、实现clone方法时通过super.clone();调用Object类的clone方法得到当前对象的副本,并放回该副本。
我们看以下的例子:
class Address{
String detail;
public Address(String detail){
this.detail = detail;
}
}
class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("杭州");
}
public User clone() throws CloneNotSupportedException{
return (User)super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User(28);
User user1 = user.clone();
System.out.println(user == user1);
System.out.println(user.address == user1.address);
}
}
输出结果是:
false
true
可以看出,克隆出来的对象只是原有对象的副本,因此在判断原有对象和克隆出来的对象是否相等时,返回false。虽然Object对象的clone方法虽然简单易用,但它正是一种浅克隆,即它克隆该对象的所有成员变量值,不会对引用类型的成员变量值所引用的对象进行克隆,因此比较两个对象的address时的返回值为true。
如果需要对对象进行深克隆,那么需要我们自己进行递归克隆,以保证所有引用成员变量所引用的对象都被复制。
《Java疯狂讲义》学习笔记。
自定义类实现克隆的步骤如下:
1、首先自定义类需要实现Cloneable接口,该接口只是一个标记性接口(接口中没有定义任何方法),表明实现该接口的类可以实现“自身复制”;
2、自定义类实现自己的clone方法;
3、实现clone方法时通过super.clone();调用Object类的clone方法得到当前对象的副本,并放回该副本。
我们看以下的例子:
class Address{
String detail;
public Address(String detail){
this.detail = detail;
}
}
class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("杭州");
}
public User clone() throws CloneNotSupportedException{
return (User)super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User(28);
User user1 = user.clone();
System.out.println(user == user1);
System.out.println(user.address == user1.address);
}
}
输出结果是:
false
true
可以看出,克隆出来的对象只是原有对象的副本,因此在判断原有对象和克隆出来的对象是否相等时,返回false。虽然Object对象的clone方法虽然简单易用,但它正是一种浅克隆,即它克隆该对象的所有成员变量值,不会对引用类型的成员变量值所引用的对象进行克隆,因此比较两个对象的address时的返回值为true。
如果需要对对象进行深克隆,那么需要我们自己进行递归克隆,以保证所有引用成员变量所引用的对象都被复制。
《Java疯狂讲义》学习笔记。
相关文章推荐
- Java 深度克隆 clone()方法重写 equals()方法的重写
- Object类中的clone方法 & 浅克隆和深克隆
- Java案例:使用clone()方法克隆对象
- Java 深度克隆 clone()方法重写 equals()方法的重写
- (转)Java克隆方法的研究(clone)
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- 【java】克隆方法clone()和相等方法equals()的重写
- Java克隆方法的研究(clone)
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)
- java中的clone()方法的研究---(2)浅克隆和深克隆
- java之clone(克隆)方法
- 面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
- java 深克隆clone对象或容器的另一种方法
- java Object类 clone()方法 详解
- java克隆对象clone()的使用方法和作用
- Java clone克隆方法 --深拷贝--浅拷贝 --原型模型
- 浅析Java中clone()方法浅克隆与深度克隆
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解
- Java 深度克隆 clone()方法重写 equals()方法的重写