public static void main(String[] args) throws CloneNotSupportedException {
Dog d = new Dog("大黄",2) ;
Dog d1 = d;
System.out.println(d.getName());
System.out.println(d1.getName());
//d 的name是 大黄;再把d的值赋给d1.所以d1的name也是大黄;
d.setName("二黄");
//调用setName方法把d的name设置成二黄,这时候d1的名字也变成了二黄。
System.out.println(d.getName()+" == "+d1.getName());
//因为大黄这个名字是在堆空间,复制的只是它的引用。d和d1都是指向大黄这个名字,所以d改变d1也会同时改变;
Dog d2 = new Dog("小黑",2);
Dog d3 = (Dog) d2.clone(); //克隆时候记得把克隆对象转为 正确的对象类型;
System.out.println(d2.name+"==="+d3.name); //输出都是小黑
d2.setName("二黑");
System.out.println(d2.name+"==="+d3.name); //d2 为小黑 ,d3没变 说明克隆成功;
}
}
class Dog implements Cloneable{ //克隆必须先实现 克隆的接口,接口没有实现的方法,是本地方法,交给操作系统去实现
String name; 操作系统实现的效率更高;
int age;
public String getName () {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
return的是一个dog 但是 返回类型是 Object ,所以调用时候要转为当前对象类型
//重写时候 方法权限为Protect 为了可以在其他地方调用此方法 改成public;Dog dog = null;
dog = (Dog)super.clone(); //super.clone得到的是父类的类型,必须把它强转为当前的对象类型;
return dog;
}
}