比如 這個例子: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條經驗 獲得超8個贊
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
提交
取消