java的多态特性,让我们可以能写出这样的代码
Employee e;//超类
Manager m;//子类e=m;//子类的实例可以赋给超类的变量,相反则不行但
Employee ee=(Employee )super.clone();//为什么这样的代码能运行super.clone()是返回Object的类,而Object的类是所有类的超类
那不是变成了
子类变量=超类实例了吗?请教大家了

解决方案 »

  1.   

    Employee e;//超类
    Manager m;//子类Employee ee=(Employee )super.clone();//为什么这样的代码能运行
    这种是强制转换,是没有问题的。
    在对象前加用圆括号包起来的类名可以强制转换,前提是被转换的对象本来就是这个类或其子类的对象,而被临时转换成其它类型。
    super.clone();不会返回其父类的对象,更不会返回Object的对象,这只不过是调用父类的这个方法,返回的仍然是当前对象的副本。
    Lz应该自己仔细看看JDK文档才行。
      

  2.   

    编译期间这种写法是绝对不会报错的。
    你这句Employee ee=(Employee )super.clone();应该是在Manager类里面用天的吧。运行应该也是可以的,因为你在Manager里调用了super的方法,也就是说是Employee的clone()方法,它返回的是Object类型的,但它同时也是Employee类型的,所以自然不会出错。
    就如同:
    Employee e = new Manager();
    Manager m = (Manager) e;
    因为这里e虽然是个Employee类型的句柄,但它实际上指向的是一个Manager类型的变量,所以你把它向下转型后自然是没有问题的,但如果把上面的改成:
    Employee e = new Employee();的话,那向下转型就会抛出
    ClassCastingException了
      

  3.   

    Employee ee=(Employee )super.clone();
    两边都是Employee类型的,当然可以运行了。后面那个是强制转换。
      

  4.   

    Employee e;//超类
    Manager m;//子类e=m;//子类的实例可以赋给超类的变量,相反则不行因为m是子类,可以转型为超类,即父类
    m=e;超类无法自动转型为子类,须强制转型 m=(m)e;
    but 这种向下转型是会出错的
      

  5.   

    我的解答是:
    你的Employee类没有重新编写clone函数,而事实上Object的clone是按位拷贝的.所以在Employee ee=(Employee )super.clone();之后,this对象(实际上它是Employee对象)被按位拷贝了,而在它前面加上了强制转换,当然就可以执行这段代码了.但是,如果Employee类需要重新编写clone函数,上面的代码就没有用了.