关于Clone 的方法使用

package cn.hncu.day7.clone.v1;
//克隆的套路:
// 第1步:重写User类的clone()方法,以供外面调用。因为外面的类无法直接调用User类父类中的clone()方法--protected
// 第2步:让User类实现Cloneable接口,否则clone时会抛出异常
// 第3步:在需要进行克隆的其它类中调用:User u2 = (User)user.clone()

//一个类的对象要想能够被clone,那么该类必须要实现Cloneable接口,否则clone时会抛出异常
public class User implements Cloneable{
private String name;
private int age;

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

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

--------------------------------------------------

package cn.hncu.day7.clone.v1;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
System.out.println(user);

try {
User user2 = (User)user.clone();//该clone()方法必须是User类自己的,不能调用它的父类Object中的clone()方法,因为权限是protected--只有user对象自己克(在User类中能够调用它的clone)
user2.setAge(100);
System.out.println(user2);
System.out.println(user);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

-------------------------------------------------------------

package cn.hncu.day7.clone.v2;

public class User implements Cloneable{
private String name;
private int age;

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

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

----------------------------------------------------------------------

package cn.hncu.day7.clone.v2;
//该v2版本是有问题的---浅拷贝问题
//※※注意,简单的clone是浅拷贝,如果对象当中的成员变量是引用类型,那么这样的变量是捆绑的--克隆体和原型对象

public class Account implements Cloneable{
private User user;// 账户对应的用户
private double balance;// 余额

public Account(User user, double balance) {
super();
this.user = user;
this.balance = balance;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "Account [user=" + user + ", balance=" + balance + "]";
}

}

-------------------------------------------------------------------------------------------

package cn.hncu.day7.clone.v2;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
Account account = new Account(user, 100);
System.out.println(account);
try {
Account account2 = (Account)account.clone();
account2.setBalance(200);
account2.getUser().setName("Tom");
System.out.println(account2);
System.out.println(account);

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

-----------------------------------------------------------------------

package cn.hncu.day7.clone.v3;

public class User implements Cloneable{
private String name;
private int age;

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

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

---------------------------------

package cn.hncu.day7.clone.v3;
//相比v2版本,我们解决浅拷贝问题就是修改这一个类.
//※※如果一个类中的变量都是primitive(基本数据类型或final型的引用类型),重写的克隆方法直接调用super.clone()就OK
//※※如果一个类中含有引用变量,那么克隆方法就如这个类所写---把浅copy的引用指向原型对象新的克隆体。

public class Account implements Cloneable{
private User user;// 账户对应的用户
private double balance;// 余额

public Account(User user, double balance) {
super();
this.user = user;
this.balance = balance;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override//深克隆
public Object clone() throws CloneNotSupportedException {
Account a =(Account) super.clone();

if(user!=null){
//※※把浅copy的引用指向原型对象新的克隆体。
a.user =(User)user.clone();
}
return a;
}

@Override
public String toString() {
return "Account [user=" + user + ", balance=" + balance + "]";
}

}

-------------------------------------------

package cn.hncu.day7.clone.v3;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
Account account = new Account(user, 100);
System.out.println(account);
try {
Account account2 = (Account)account.clone();
account2.setBalance(200);
account2.getUser().setName("Tom");
System.out.println(account2);
System.out.println(account);

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

时间: 2024-10-17 06:59:08

关于Clone 的方法使用的相关文章

java Object对象的clone方法

参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎么看过,刚好要用,就看看了. 源码解释: /** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class of the object. The

Java clone方法(下)

1.最终调用的是一个JNI方法,即java本地方法,加快速度 2.使用clone方法,分为浅复制.深复制,这里直接使用网上抄来的案例来说明吧: 说明: 1)为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中. 2)继承自java.lang.Object.clone()方法是浅层复制.一下代码可以

clone方法是如何工作的

clone()是java.lang.Object类下面的一个很难处理的方法,clone()的作用很简单,提供一种克隆机制创建对象的副本,对于如何实现它已成为一个棘手的事,同时还长期被广受批评.不管怎样,我们不去争论历史,现在我们将尝试学习clone方法是怎样工作的.说实在的,想理解克隆机制并不简单,甚至有经验的java程序员也很难解释可变对象的克隆是如何运作的.深克隆(deep copy)与浅克隆(shallow copy)的区别.这文章分为三部分,我们首先看clone方法是如何工作的,第二部分

关于清空节点删除节点和clone方法

关于清空节点内容,在jquary里的实现有: 1.html("")为空 $("div").html();//仅仅清空元素的内容,会保留事件 像这种就是清空内容,但是若是有事件的话还会保留,缺点在于会占用内存,虽然有时候占有内存不多但是总归是占有一定的空间. 2.empty() $("div").empty();//仅仅清空元素的内容,也会清空事件,释放内存 而empty方法就是清空所有内容,包括清空事件,当然也就释放了内存,解决了内存泄漏的问题.

【转】JavaScript中的对象复制(Object Clone)

JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制. 用jQuery进行对象复制 在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制. a = {k1:1, k2:2, k3:3}; b = {}; $.extend(b,a); 自定义clone

Object类有哪些公用方法?

Object是所有类的父类,任何类都默认继承Object. clone 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常 equals 在Object中与==是一样的,子类一般需要重写该方法 hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法.这个方法在一些具有哈希功能的Collection中用到 getClass final方法,获得运行时类型 wait 使当

JavaScript 中的对象深度复制(Object Deep Clone)

JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b中的元素的时候,也就改变了对象a中的元素. a = {k1:1, k2:2, k3:3}; b = a; b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制. 用jQuery进行对象复制 在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制.

学习zepto.js(对象方法)[5]

继续说. clone: 该方法不接收任何参数,会返回对象中的所有元素集合,但不会对象绑定的事件. var $temp = $("div").clone(); //并不接收任何参数. 方法的实现就是循环调用方法对象.然后将所有的dom元素克隆并返回 而且使用的深度克隆,就是说,会将节点下方的子节点统统克隆过来. closest: 方法接收1-2个参数,第一个为selector(选择器),第二个为context(上下文); 方法会从调用节点开始,逐级向上匹配. 如果只传入selector,

JavaScript中的对象复制(Object Clone)

JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3};b = a;b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制. 用jQuery进行对象复制 在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制. a = {k1:1, k2:2, k3:3};b = {};$.extend(b,a); 自定义clone()方法