java中的浅克隆
来源:互联网 发布:知乎怎么发不了文章 编辑:程序博客网 时间:2024/06/10 01:53
java中的克隆方法最简单的就是通过实现Cloneable接口,重写public Object clone()方法,然后调用clone()就行了。
所谓的浅克隆是指,当所克隆的类中包含有对其他类的引用的时候,此时的克隆并没有完全克隆类中的所有元素。
代码见下:
package test2;public class Number{ int num; Number(int num){ this.num=num; } @Override public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("num="+num); return sb.toString(); }}
package test2;public class People implements Cloneable { Number n; int sex; People(Number n,int sex) { this.n=n; this.sex=sex; } public Object clone() { People b=null; try { b=(People)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return b; } @Override public String toString() { StringBuilder sb=new StringBuilder(); sb.append(n.toString()+"\n"); sb.append("sex="+sex); return sb.toString(); }}
package test2;import java.util.*;import java.lang.*;public class MainTest { public static void main(String[] args) { Number n=new Number(100); People p=new People(n,200); People p2=(People)p.clone(); System.out.println("the pre p is: "+"\n"+p); System.out.println("the pre p2 is: "+"\n"+p2); p2.n.num=102; p2.sex=202; System.out.println("the following p is: "+"\n"+p); System.out.println("the following p2 is: "+"\n"+p2); }}
运行结果如下:
the pre p is: num=100sex=200the pre p2 is: num=100sex=200the following p is: num=102sex=200the following p2 is: num=102sex=202
首先创建了一个父类Number,之后创建一个继承Number的子类People。People实现Cloneable接口,重写clone方法。
之后我在主函数中创建了一个People对象p,并初始化。然后声明一个新的People对象p2,用clone方法复制p到p2中。分别打印。可以看见,两个对象的输出是完全一样的。
之后我再单独对p2的成员单独赋值。再打印输出,可以看见,p中的Number元素也做了变化。
说明用clone()方法进行复制的时候,实际上是创建了一个新的引用p2.n,然后这个引用指向了同样一个元素。对p2.n的修改自然也会造成p.n的修改。
这相当于在C语言中只是创建了一个指向相同元素的指针,对一个指针的修改,另一个指针的数据也会改变。
初学java,不知道这样理解对不对,望高手指正。
0 0
- java中的浅克隆
- java中的深克隆和浅克隆
- java中的深克隆浅克隆介绍
- JAVA中的深克隆和浅克隆
- Java中的浅克隆和深克隆
- Java中的假克隆、浅克隆、深克隆
- Java中的clone() 浅克隆与深度克隆
- 浅谈Java中的浅克隆与深克隆
- 深入理解 Java中的深克隆与浅克隆
- java中的克隆
- java中的对象克隆
- java中的克隆
- 关于java中的克隆
- java 中的克隆
- Java中的克隆
- Java中的对象克隆
- java中的深浅克隆
- Java中的克隆
- Linux下如何搭建stm32开发环境
- mysql Access denied for user ‘root’@’localhost’ (using password: YES)解决方法
- div+js实现自制滚动条效果
- ActiveMQ性能优化
- Fiddler显示IP的设置方法
- java中的浅克隆
- 最大流网络之Push-Relabel算法
- Activity & Fragment & tips
- cocos2dx在安卓6.0(android-23)以上版本打包
- 单例模式应用场景和设计失误所引发的问题
- 线段树 模板
- web特殊符号
- python的排序模块bisect
- Cookie免验证自动登录