比如 这个例子: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 也被克隆了? 换句话就是说,为什么这里可以把向下转型。
2 回答
largeQ
TA贡献2039条经验 获得超7个赞
super.clone()是这个意思,super.clone()调用子类继承父类的那个方法,是子类中的方法,而不是父类中的方法,子类会继承父类中的所有东西。为什么要用super标记呢?因为你重新实现了clone方法,作为区分,用super标记从父类中继承过来的那个clone方法。而由于Java中的多态性,当子类实例使用clone方法是,显然会调用子类中的clone,所以会将abcdef全部复制,而不是仅仅复制父类的那一部分。而且Object类的clone方法是protected,子类中根本不能调用父类中的这个方法,只能调用从父类中继承来的这个方法。
交互式爱情
TA贡献1712条经验 获得超3个赞
实现了Cloneable接口,这是一个标记,证明这个类可以被克隆,并可以调用Object的clone方法,而super.clone()正是克隆当前对象,这里的super.指的是调用父类的clone方法,实现浅克隆,即只clone当前对象而不clone当前对象的子对象。至于clone方法的实现,具体没了解过,只知道利用反射机制实现的,可以完全复制当前对象,但是由于返回值是Object,所以需要强转类型
添加回答
举报
0/150
提交
取消