关于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();
}
}
}
关于Clone 的方法使用的更多相关文章
- Clone使用方法详解【转载】
博客引用地址:Clone使用方法详解 Clone使用方法详解 java“指针” Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文 ...
- 独家git clone 加速方法
git clone 独家方法 最近需要下载网上很多github库,所以git clone 4kb/s 的速度可以把人逼疯,为了加速git clone才有了这篇博客 网上有很多加速的方案 比如 blog ...
- java Clone使用方法详解
java"指针" Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能 通过 ...
- Java clone克隆方法 --深拷贝--浅拷贝 --原型模型
什么是深拷贝? 什么是浅拷贝? 创建一个对象的方法有几种? 默认的Object方法中的clone是深拷贝还是浅拷贝? 为什么说很多深拷贝都是不彻底的深拷贝? 什么是原型模型,什么是原型模式? 原型模型 ...
- 深入浅出Java中的clone克隆方法,写得太棒了!
作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/ Java中对象的创建 clone 顾名思义就是 复制 , 在Java语言中, c ...
- git 生成公钥、私钥方法与clone使用方法
我的配置流程 Git配置 Git安装完之后,需做git配置.打开git bash,分别执行以下两句命令 git config --global user.name "用户名" gi ...
- Effective Java 之-----谨慎的覆盖clone方法
1.概述 如果clone方法返回一个由构造器创建的对象,它就得到有错误的类.因此,如果覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone得到的对象.如果类的所有超类都 ...
- Java 的 clone 方法 && 浅复制和深复制
1 Java中对象的创建过程 java创建对象的方式有以下两种: (1)使用new操作符创建一个对象 (2)使用clone的方法复制一个对象,(在Java中,clone是Object类的protect ...
- Java clone方法(下)
1.终于调用的是一个JNI方法,即java本地方法,加高速度 2.使用clone方法,分为浅复制.深复制,这里直接使用网上抄来的案例来说明吧: 说明: 1)为什么我们在派生类中覆盖Object的clo ...
随机推荐
- windows下安装php真正的多线程扩展pthreads教程
扩展地址:http://docs.php.net/manual/zh/book.pthreads.php 注意事项php5.3或以上,且为线程安全版本.apache和php使用的编译器必须一致.通过p ...
- JDBC事务控制管理
1.事务 (1)事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update account set mone ...
- CentOS 如何将.deb 文件 转换.rpm
CentOS 如何将.deb 文件 转换.rpm [root@localhost tmp]#tar zxvf alien_8.88.tar.gz [root@localhost alien]#perl ...
- poj2154
利用bzoj2705的结论我们很容易优化这道等价类计数的问题 sum(n^gcd(i,n))/n mod p (1<=i<=n) =sum(phi(n/L)*n^L)/n mod p (n ...
- 提升你的Java应用性能:改善数据处理
许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题.如果我们看一下性能问题背后的原因,会发现很多是由数据处理不当造成.数据处理在应用面对大数据量时是非常关键的.这里有一些实用的数据处理技巧可以帮 ...
- svn提交时强制注释
不少开发员提交修改的时候都不写注释,导致查看历史时很费劲,也不太符合规范.有的公司要求每次提交修改时都写上bug号或者任务描述,那么如何在工具上防止开发员们不写注释呢? 利用svn的pre-commi ...
- Constructing Roads
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- MySQL 数据库 引擎
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型I ...
- sql date 的精度问题
new java.sql.Date(...) 是经过yyyy-MM-dd 格式化后的时间格式. 如果需要:HH:mm:ss .则要用 new java.sql.Timestamp(.....);
- Closure Compiler(封闭编辑器), Closure Inspector, Closure Templates, 封闭图书馆(Closure Library) Google- 摘自网络
谷歌日前宣布,将自己开发者使用的一系列工具对外开放.这些工具曾用来开发谷歌的主要产品,包括Gmail.谷歌文档(Google Docs)和谷歌地图(Google Maps). 第一个工具叫做Closu ...