下面代码中有2个很菜的问题,不用看完代码~
public class PetDog extends Animal implements Cloneable {
public PetDog(String name , String breed){
super("Dog");
petFlea = new Flea("Max" , "circus flea");
this.name = name;
this.breed = breed;
}

public void setName(String name){
this.name = name;
}

public String getName(){
return name;
}

public String getBreed(){
return breed;
}

public Flea getFlea(){
return petFlea;
}

public void sound(){
System.out.println("Woof");
}
public String toString(){
return super.toString() + "\nIt's " + name + " the "
                        + breed + " &\n" + petFlea;
}

public Object clone() throws CloneNotSupportedException {
PetDog pet = new PetDog(name, breed);  //问题:这里创建一个新对象我是明白,只是语法上里面的实参有点不明白
pet.setName("aaa");                    //这里面的name和breed算什么类型的实参?如果是string类型那么为什么,这里的实参不会被传到构造函数里初始化,如果不是string类型,那么他怎么找到构造函数的??
pet.getFlea().setName("Atlas");
return pet;
//return super.clone();
}

private Flea petFlea;
private String name;
private String breed;
}问题2:
  这个PetDog类是继承Animal类,但是我在Animal这个基类中不声明implements Cloneable接口一样可以运行,不是说一定要在基类中声明的嘛??

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【llm0528】截止到2008-06-25 10:02:10的历史汇总数据(不包括此帖):
    发帖数:26                 发帖分:550                
    结贴数:26                 结贴分:550                
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

     public Object clone() throws CloneNotSupportedException {
            PetDog pet = new PetDog(name, breed);  //这里的意思是说使用已经存在的对象的name和breed做为参数构造一个对象。例如你已经有一个
                                                           //对象 PetDog pet = new PetDog("a", "b")了,你要复制一个,那么你用pet.clone(),就是
                                                           //这个时候这个clone里面的这个构造函数就使用这两个存在的属性 a和b。
            pet.setName("aaa");                    //这里就是简单的设置值而已,是String类型的。构造函数是前面new的时候调用的啊。
            pet.getFlea().setName("Atlas");
            return pet;
            //return super.clone();
        }
      

  3.   

    忘记第二个问题了。呵呵,对于所谓的必须实现clone是指,如果你要复制一个对象,那么就要实现这个接口,这里你在子类petDog里面实现的也可以,比如
    Animal a=new PetDog("","");
    你通过a是不能调用clone()的,因为他没有这个方法。只有你PetDog p=(PetDog)a;强制转成子类的引用的时候就可以调用了。道理很简单,你要复制的对象必须要实现clone接口。不用复制就不用实现了
      

  4.   

    忘记第二个问题了。呵呵,对于所谓的必须实现clone是指,如果你要复制一个对象,那么就要实现这个接口,这里你在子类petDog里面实现的也可以,比如
    Animal a=new PetDog("","");
    你通过a是不能调用clone()的,因为他没有这个方法。只有你PetDog p=(PetDog)a;强制转成子类的引用的时候就可以调用了。道理很简单,你要复制的对象必须要实现clone接口。不用复制就不用实现了
      

  5.   

    name和breed是你自己声明的,都为String,在程序的最下面
    private String name;
    private String breed;
      

  6.   

    public class PetDog extends Animal implements Cloneable PetDog 继承了Animal,实现了Cloneable JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口
      

  7.   

    哦~~对了,被你提醒了,因为搁天改的,所以把name 和 breed两个变量给忘了~~那第2个问题呢??为什么我在基类中没把Animal声明为implements Cloneable接口一样可以运行??
      

  8.   

    3楼其实已经回答了你的问题了
    你只是PetDog 需要clone,又不是Animal需要clone,这里跟Animal实不实现Cloneable接口没有任何关系