一,a和b都指向同一个对象,改变其中一个另一个也会改变

package com.ciaos;

class Human{
public Human(String string, int i) {
// TODO Auto-generated constructor stub
name = string;
age = i;
}
String name;
int age;
} public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
/* int num[][] = {{1,2,3,4},{5,6,7,8},{2,3,4,5},{4,5,6,7}};
for(int x[]:num){
for(int y:x){
System.out.print(y);
}
}*/
Human a = new Human("ciaos",26);
System.out.println("a:"+a.name+" "+a.age);//a:ciaos 26 Human b = a;
b.name = "stone";
System.out.println("a:"+a.name+" "+a.age);//a:stone 26
System.out.println("b:"+b.name+" "+b.age);//b:stone 26
}
}

二,继承Cloneable接口,实现clone方法,实现浅拷贝

package com.ciaos;

class Human implements Cloneable{
public Human(String string, int i) {
// TODO Auto-generated constructor stub
name = string;
age = i;
}
String name;
int age; public Object clone(){
Human h = null;
try {
h = (Human)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return h;
}
} public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub Human a = new Human("ciaos",26);
System.out.println("a:"+a.name+" "+a.age);//a:ciaos 26 Human b = (Human)a.clone();
b.name = "stone";
System.out.println("a:"+a.name+" "+a.age);//a:ciaos 26
System.out.println("b:"+b.name+" "+b.age);//b:stone 26
}
}

三,如果对象中有变量指向别的对象,成员变量指向的对象仍然是同样的

package com.ciaos;

class Addr{
public Addr(String country2, String city2) {
// TODO Auto-generated constructor stub
country = country2;
city = city2;
}
String country;
String city;
} class Human implements Cloneable{
public Human(String string, int i, String country, String city) {
// TODO Auto-generated constructor stub
name = string;
age = i;
addr = new Addr(country,city);
}
String name;
int age;
Addr addr; public Object clone(){
Human h = null;
try {
h = (Human)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return h;
}
} public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub Human a = new Human("ciaos",26,"china","shenzhen");
System.out.println("a:"+a.name+" "+a.age+" "+a.addr.country+" "+a.addr.city);//a:ciaos 26 china shenzhen Human b = (Human)a.clone();
b.name = "stone";
b.addr.city = "shanghai";
System.out.println("a:"+a.name+" "+a.age+" "+a.addr.country+" "+a.addr.city);//a:ciaos 26 china shanghai
System.out.println("b:"+b.name+" "+b.age+" "+b.addr.country+" "+b.addr.city);//b:stone 26 china shanghai
}
}

四,需要对成员变量指向对象的类继承拷贝接口,修改Human类复制方法

package com.ciaos;

class Addr implements Cloneable{
public Addr(String country2, String city2) {
// TODO Auto-generated constructor stub
country = country2;
city = city2;
}
String country;
String city;
public Object clone(){
Addr a = null;
try {
a = (Addr)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
} class Human implements Cloneable{
public Human(String string, int i, String country, String city) {
// TODO Auto-generated constructor stub
name = string;
age = i;
addr = new Addr(country,city);
}
String name;
int age;
Addr addr; public Object clone(){
Human h = null;
try {
h = (Human)super.clone();
h.addr = (Addr)this.addr.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return h;
}
} public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub Human a = new Human("ciaos",26,"china","shenzhen");
System.out.println("a:"+a.name+" "+a.age+" "+a.addr.country+" "+a.addr.city);//a:ciaos 26 china shenzhen Human b = (Human)a.clone();
b.name = "stone";
b.addr.city = "shanghai";
System.out.println("a:"+a.name+" "+a.age+" "+a.addr.country+" "+a.addr.city);//a:ciaos 26 china shenzhen
System.out.println("b:"+b.name+" "+b.age+" "+b.addr.country+" "+b.addr.city);//b:stone 26 china shanghai
}
}

java对象复制的更多相关文章

  1. Java 对象复制

    Java 对象的一共有 3 种复制对象的方式. 1.直接赋值 (引用复制 ),此种复制方式比较常用. 诸如 A  a = b ;  a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象. 此时 ...

  2. JAVA对象转换JSON

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...

  3. java中复制对象通过反射或序列化

    在使用缓存读取数据后修改发现缓存被修改.于是找了下复制对象的方法. 关于对象克隆 按我的理解,对象是包含引用+数据.通常变量复制都是将引用传递过去.比如: Person p1 = new Person ...

  4. Java反射 - 2(对象复制,父类域,内省)

    为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...

  5. Java——对象的复制、克隆、序列化

    原创作者: https://blog.csdn.net/lmb55/article/details/78277878对象克隆(复制)假如说你想复制一个简单变量.很简单: int apples = 5; ...

  6. java对象实现深复制的方法

    p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...

  7. Java对象和集合的拷贝/克隆/复制

    昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...

  8. java对象克隆复制

    原文链接:https://blog.csdn.net/ztchun/article/details/79110096 自己先简单描述总结一下:当想要将一个对象中已有的值直接给另外一个对象的时候,其实并 ...

  9. java对象拷贝和复制

    参考文章:http://blog.csdn.net/XIAXIA__/article/details/41652057 解决问题:深拷贝.浅拷贝 和普通的对象赋值有什么区别? 对象复制 例如:Pers ...

随机推荐

  1. 记录hyperic-hq搭建开发环境遇到的坑

    这个星期接到一个新的任务:解决HQ(一个用JAVA开发的开源的运维监控平台)现在遇到的snmp升级到3.0后bug.公司用的HQ是4.6版本.于是,我把项目从gitlab上clone下来后,就开始了我 ...

  2. Oracle经典书籍推荐

    转自:http://www.cnblogs.com/fjfzhkb/archive/2007/12/05/983381.html 很多网友询问如何选择入门书籍,学Oracle有什么好书,这里给出一些常 ...

  3. HDU 5823 color II(FWT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5823 [题目大意] 定义一张无向图的价值:给每个节点染色使得每条边连接的两个节点颜色不相同的最少颜 ...

  4. HDU 5787 K-wolf Number(数位DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5787 [题目大意] 求区间[L,R]内十进制数相邻k位之间不相同的数字的个数. [题解] 很显然的 ...

  5. CodeForces 235C Cyclical Quest(后缀自动机)

    [题目链接] http://codeforces.com/contest/235/problem/C [题目大意] 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是 ...

  6. python 在 for i in range() 块中改变 i 的值的效果

    先上一段代码: for i in range(3): i = 2 print(i) 实际结果是: 2 2 2 可以发现实际效果就是 在每次执行 for 语句块的内容后 i 会被重新赋值

  7. 从头開始写项目Makefile(七):统一目标输出文件夹

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu. Mail:shallnew at 163 dot com]     上一节我们把规则单独提取出来,方便了Makefile的 ...

  8. vmware虚拟机上linux操作系统进行tty1~tty6切换方法和具体步骤

    vmware虚拟机上linux操作系统怎样进行tty1~tty6切换? 现象: Linux的终端机(文字)界面与图形界面间的切换热键为: 进入终端机也就是字符界面(tty1-tty6):[Ctrl] ...

  9. xcode 不值钱的动画UIButton

    #import "ViewController.h" @interface ViewController () /** 按钮 */ @property(nonatomic,weak ...

  10. window.showModalDialog刷新父窗口和本窗口的方法及注意

    window.showModalDialog刷新父窗口和本窗口的方法及注意:   一.刷新父窗口的方法:    A.使用window.returnValue给父窗口传值,然后根据值判断是否刷新. 在w ...