日期:2014-05-20  浏览次数:20702 次

大家帮忙看下这个
class   Student   implements   Cloneable  
{  
String   name;  
int   age;  
Student(String   name,int   age)  
{  
this.name=name;  
this.age=age;  
}  
public   Object   clone()  
{  
Student   o=null;  
try  
{  
o=(Student)super.clone();  
}  
catch(CloneNotSupportedException   e)  
{  
System.out.println(e.toString());  
}  
return   o;  
}  
}  
这段代码为一个克隆的代码,在最后的那个   return中返回的是Student类型而方法的类型   却是Object返回的类型不一致但是编译却通过了。把Object改为Student类型编译反而不行   这是为什么呢   ?不是说一个方法的返回类型要与方法的类型一致么   ?

------解决方案--------------------
"把Object改为Student类型编译反而不行 这是为什么呢 ? "


我承认我没看懂。。
你这个问题好像是 父类的变量可以引用子类对象,而子类变量不可以引用父类对象。任何一个类都是object的子类
------解决方案--------------------
public Object clone(){}这个方法是覆盖了Object类中的public Object clone(){}方法
如果在Student类中,改成public Student clone(){}那么,在Student类中就有了
public Object clone(){}和public Student clone(){}这两个方法,
而方法是不可以用返回值来区分的.所以编译器会报错.
------解决方案--------------------
Q.return中返回的是Student类型而方法的类型却是Object
A:Object是所有类的祖先,所以从多态的角度看,Student对象也是一个Object对象,所以把一个
Strudent类的引用赋给一个指向Object的引用是合理的。这就是多态的一个应用