下面代码中有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接口一样可以运行,不是说一定要在基类中声明的嘛??
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接口一样可以运行,不是说一定要在基类中声明的嘛??
楼主【llm0528】截止到2008-06-25 10:02:10的历史汇总数据(不包括此帖):
发帖数:26 发帖分:550
结贴数:26 结贴分:550
未结数:0 未结分:0
结贴率:100.00% 结分率:100.00%
敬礼!
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();
}
Animal a=new PetDog("","");
你通过a是不能调用clone()的,因为他没有这个方法。只有你PetDog p=(PetDog)a;强制转成子类的引用的时候就可以调用了。道理很简单,你要复制的对象必须要实现clone接口。不用复制就不用实现了
Animal a=new PetDog("","");
你通过a是不能调用clone()的,因为他没有这个方法。只有你PetDog p=(PetDog)a;强制转成子类的引用的时候就可以调用了。道理很简单,你要复制的对象必须要实现clone接口。不用复制就不用实现了
private String name;
private String breed;
你只是PetDog 需要clone,又不是Animal需要clone,这里跟Animal实不实现Cloneable接口没有任何关系