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类型编译反而不行 这是为什么呢 ?不是说一个方法的返回类型要与方法的类型一致么 ?

解决方案 »

  1.   

    "把Object改为Student类型编译反而不行 这是为什么呢 ? "
    我承认我没看懂。。
    你这个问题好像是 父类的变量可以引用子类对象,而子类变量不可以引用父类对象。任何一个类都是object的子类
      

  2.   

    public Object clone(){}这个方法是覆盖了Object类中的public Object clone(){}方法
    如果在Student类中,改成public Student clone(){}那么,在Student类中就有了
    public Object clone(){}和public Student clone(){}这两个方法,
    而方法是不可以用返回值来区分的.所以编译器会报错.
      

  3.   

    Q.return中返回的是Student类型而方法的类型却是Object
    A:Object是所有类的祖先,所以从多态的角度看,Student对象也是一个Object对象,所以把一个
    Strudent类的引用赋给一个指向Object的引用是合理的。这就是多态的一个应用
      

  4.   

    Student向Object转型,只要Student是Object的子类编译器就不会报错,而Object向Student转型,要先将Student转成Object,即(Student)object,这样才能通过编译
      

  5.   

    这段代码为一个克隆的代码,在最后的那个 return中返回的是Student类型而方法的类型 却是Object返回的类型不一致但是编译却通过了,
    之所以能通过,因为Student是Object的子类,而父类对象的变量可以引用子类的实例。
    把Object改为Student类型编译反而不行 这是为什么呢,应该也是可以的,因为这样会把Object类中clone方法给覆盖掉了
      

  6.   

    把Object改为Student类型编译反而不行这是因为:在Student类中就有了
    public Object clone(){}和public Student clone(){}这两个同名的方法.
    名字一样,参数一样,说明方法没有overload.
      

  7.   

    因为is-a
    白马是马,马不是白马