java对象复制

时间:2022-11-08 03:34:32

一,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
}
}