一,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. 我使用过的Linux命令

    我使用过的Linux命令之tee - 重定向输出到多个文件 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出 ...

  2. HTML中小问题

    1.a标签不添加href这个属性时,不会出现鼠标变成手型~

  3. POJ 1823 Hotel 线段树

    题目链接 线段树的区间合并. 和上一题差不多....第三种操作只需要输出maxx[1]的值就可以. #include <iostream> #include <vector> ...

  4. 阿里云ECS每天一件事D9:nginx1.7整合tomcat8.0

    仅通过8080端口访问jsp显然不是一算是一个太好的方法,可以使用nginx的proxy_pass子模块,实现nginx转发jsp请求至tomcat. 典型的配置如下: server { listen ...

  5. Cocos2d-iPhone V3 (2) 场景转换

    Cocos2d-iPhone V3 (2) 场景转换 博客:http://blog.csdn.net/prevention 作者:大锐哥 - 1. 准备工作 创建一个场景会吧? #import &qu ...

  6. Android studio 开发在真机测试

    真机测试 首先按照这设置android studio:   http://jingyan.baidu.com/article/fea4511a75d627f7ba912540.html 2.打开and ...

  7. ie6兼容性,还需要测试么?迷茫。。。

    最近公司网站在谷歌,火狐上测试都没有问题,但是在ietest,ie6上出现兼容问题 ,由于ietest好几次打开ie6都报错(尝试卸载重新安装几次无果),下载virtualbox安装自带ie6的xp系 ...

  8. C++面向对象类的书写相关细节梳理

    类的问题 继承类的原因:为了添加或者替换功能. 1. 继承时重写类的方法 v 替换功能 ① 将所有方法都设置为virtual(虚函数),以防万一. Virtual:经验表明最好将所有方法都设置为vir ...

  9. IOS使用pch预编译文件

    首先新建一个pch文件,然后要修改这个项目的Build Setting中的Prefix Header 修改为 $(SRCROOT)/项目名称/预编译文件名: 一般pch文件的用处: 1.导入框架,如: ...

  10. #ifndef 与 #program once 的区别(转)

    转自http://hi.baidu.com/hrx20091001/item/ee70f7cc6d036d4ea9ba94e0 #ifndef 与 #program once 的区别 为了避免同一个文 ...