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();
}
}
}

最新文章

  1. kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装
  2. Find linux下
  3. PHP 表单验证
  4. LaTeX 页眉页脚的设置
  5. 【MySQL】MySQL 5.7 sys Schema
  6. GDUT 校赛02 dp回文串
  7. Android窗口为弹出框样式
  8. oracle ibatis 存储过程 返回游标 嵌套表
  9. 解析xml的几种方式
  10. C# 使用IENUMERABLE,YIELD
  11. MSIL实用指南-装箱拆箱
  12. aix 6.1系统怎么安装?这里有详细图文教程
  13. JAVA截取字符串的几种方式
  14. [C#]使用 Jenkins 为 .Net Core 实现持续集成/部署
  15. 数据库between and
  16. UVa 902 - Password Search
  17. 1.2socket服务器使用多线程
  18. oracle多表查询之内连接,外连接语句总结
  19. 基于node安装gulp-一些命令
  20. cocos2d-x的win32编译环境

热门文章

  1. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列
  2. hdu 4764 && 2013长春网赛题解
  3. poj 1273
  4. js template
  5. comet ajax轮询
  6. TC598 div2
  7. 一起啃PRML - 1.2.1 Probability densities 概率密度
  8. Delphi TcxTreeList 节点添加图片
  9. 基于Noootes/Dooomino的文档工作流系统(转)
  10. sqrt (x) 牛顿迭代法