浅克隆:可以得到一个和原来的类具有完全一样的属性值的对象。如果一个类里面有其他类,那么克隆出来的类里面的其他类是共用的,比如:A类包含B类的,A类可以通过getB()获取B1类,假设克隆出来的是A2,那么通过A.getB()得到的B1和A2.getB()得到的B2是同一个对象,修改B1的属性的同时B2也会被修改,同样修改B2的属性同时B1也会被修改
深克隆:可以得到一个和原来的类具有完全一样的属性值的对象。但是修改B1的属性时B2不会被修改,因为B1和B2已经不是同一个对象。
浅克隆示例代码:
public class Car implements Cloneable {
private int price;
private String name;
private Tire tire;
public Car(int price, String name) {
this.price = price;
this.name = name;
}
public Tire getTire() {
return tire;
}
public void setTire(Tire tire) {
this.tire = tire;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class Tire {
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
Car car1 = new Car(60000, "吉利汽车");
Tire tire1 = new Tire();
tire1.setBrand("米其林轮胎");
car1.setTire(tire1);
Car car2 = null;
try {
car2 = (Car) car1.clone();
Tire tire2 = car2.getTire();
tire2.setBrand("普利司通轮胎");
car2.setPrice(40000);// 注意修改car2的price值 但是没有影响car1的值
System.out.println("-----car1:" + car1.getName() + "-->"+ car1.getPrice()+"-->"+tire1.getBrand());
System.out.println("-----car2:" + car2.getName() + "-->"+ car2.getPrice()+"-->"+tire2.getBrand());
System.out.println("-----car1:" + car1.getName() + "-->"+ car1.getPrice()+"-->"+tire1.getBrand());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
深克隆示例代码:
//注意:被引用的Tire类记得实现Cloneable接口并实现clone()
public class Tire implements Cloneable{
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class Car implements Cloneable {
private int price;
private String name;
private Tire tire;
public Car(int price, String name) {
this.price = price;
this.name = name;
}
public Tire getTire() {
return tire;
}
public void setTire(Tire tire) {
this.tire = tire;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//注意:只有这里和浅克隆不一样
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Car car = (Car)super.clone();
car.setTire((Tire) car.getTire().clone());
return car;
}
}