猿问

父类明明没有子类扩展出来的变量d e f 怎么也可以转型成功?

比如 这个例子:

class Test implements Cloneable
{
Test o=null;
String name;

Test(String name)
{
this.name=name;
}

public Test clone()
{
try
{
o=(Test)super.clone(); //这里只是复制了 父类?
}
catch(Exception e)
{
System.out.println(e.toString());
}
return o;
}
}

这个super.clone 克隆了也只是父类的啊? 那么子类拓展出来的那些变量都没克隆,那为什么结果里, 却是都克隆了。
比如 我一个 父类有变量 a b c 我子类添加了 d e f , 那么,用super.clone()的时候不是 就复制了 a b c 吗? 那么我子类的 d e f 都没复制啊, 为什么 结果出来的时候, 子类里的 d e f 也被克隆了? 换句话就是说,为什么这里可以把向下转型。 

慕斯709654
浏览 110回答 2
2回答

largeQ

super.clone()是这个意思,super.clone()调用子类继承父类的那个方法,是子类中的方法,而不是父类中的方法,子类会继承父类中的所有东西。为什么要用super标记呢?因为你重新实现了clone方法,作为区分,用super标记从父类中继承过来的那个clone方法。而由于Java中的多态性,当子类实例使用clone方法是,显然会调用子类中的clone,所以会将abcdef全部复制,而不是仅仅复制父类的那一部分。而且Object类的clone方法是protected,子类中根本不能调用父类中的这个方法,只能调用从父类中继承来的这个方法。

交互式爱情

实现了Cloneable接口,这是一个标记,证明这个类可以被克隆,并可以调用Object的clone方法,而super.clone()正是克隆当前对象,这里的super.指的是调用父类的clone方法,实现浅克隆,即只clone当前对象而不clone当前对象的子对象。至于clone方法的实现,具体没了解过,只知道利用反射机制实现的,可以完全复制当前对象,但是由于返回值是Object,所以需要强转类型
随时随地看视频慕课网APP

相关分类

Java
我要回答