package scau.edu.prototype;class SunMonkey implements Cloneable{
private Cat cat;
private String name;
private int height;
private int weight;

public SunMonkey(){

}

public SunMonkey(String name, int height, int weight,Cat cat) {
this.name = name;
this.height = height;
this.weight = weight;
this.cat =cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Cat getCat(){
return cat;
}
public void setCat(Cat cat){
this.cat = cat;
}

public Object clone(){
Object o = null;
try{
o = (SunMonkey)super.clone();
}catch(CloneNotSupportedException e){
System.out.println("不支克隆!");
}
return o;
}
}
class Cat{
private String catName; public Cat(String catName) {
this.catName = catName;
} public String getCatName() {
return catName;
} public void setCatName(String catName) {
this.catName = catName;
}

}
public class Client { public static void main(String[] args) {
Cat Kcat = new Cat("Kcat");
SunMonkey sm1 = new SunMonkey("sun1",50,30,Kcat);
System.out.println(sm1.getName());
System.out.println(sm1.getCat().getCatName());
SunMonkey sm2 = (SunMonkey)sm1.clone();
//通过sm2改变sm1的属性name和它的属性对象的名字
sm2.getCat().setCatName("xiong");
sm2.setName("sun2");

System.out.println(sm1.getCat().getCatName());
System.out.println(sm1.getName());

}}String 类也是引用类型啊 为什么就不能改变呢 还是sun1 不是sun2sun1
Kcat
xiong
sun1

解决方案 »

  1.   

    String 类也是引用类型啊 为什么就不能改变呢 还是sun1 不是sun2 String为final类,其实例不能改变.
    例如:String str1 = "abc";
    String str2 = str1; //浅clone就是这个样子.
    str2 = "1234";//和set方法执行的效果是一样的.
    str1不会改变.
      

  2.   

    final类比较特殊除String,还有个Integer,浅拷贝和深拷贝效果一样
      

  3.   

    字符串类的变量一旦被创建,那就不会改变,比如String a="asd";如果改变a的值,如a="dsa";那么这是在内存中(String对象池中)新申请了空间来存放dsa,a引用的地址改变了!!!