5 回答

TA貢獻1條經驗 獲得超4個贊
我想我明白你問的是什么。
舉個例子:
clone()方法是Object里面的protected方法,只允許在同包和子類內部調用。
現在有一個類Cat,默認繼承Object,所以假如你的調用測試寫在Cat類里面,那么是可以調用的。
但是假如你在和Cat同包的下面寫了一個Test測試類,并嘗試在Test里面實例化Cat,并調用clone(),是無法調用的。
原因是,假如Cat沒有重寫clone()方法,Cat調用的clone()方法是Object類的,而Test類和Object不同包。你可能會問Test也是Object的子類呀?是的沒錯,你可以在子類內部調用自己的clone()方法,但是你不可以調用你兄弟類的clone()方法,protected的語義就是這樣的。

TA貢獻1條經驗 獲得超0個贊

TA貢獻1847條經驗 獲得超7個贊
clone() 是protected的作用域。繼承Cloneable接口后要重寫方法,然后在方法里調用父類的clone()的方法。同時默認的克隆對于引用對象只是淺克隆。給你一段代碼自己去運行試試吧:
package cesar.Test0810;
/**
* Created by Cesar on 2016/8/10.
*/
public class A implements Cloneable{
private int a;
private B b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public B getB() {
return b;
}
@Override
public String toString() {
return "A{" +
"a=" + a +
", b=" + b +
'}';
}
public void setB(B b) {
this.b = b;
}
protected A clone() throws CloneNotSupportedException {
return (A) super.clone();
}
}
package cesar.Test0810;
/**
* Created by Cesar on 2016/8/10.
*/
public class B {
private int b1;
private int b2;
@Override
public String toString() {
return "B{" +
"b1=" + b1 +
", b2=" + b2 +
'}';
}
public B(int b1, int b2){
this.b1 = b1;
this.b2 = b2;
}
public int getB1() {
return b1;
}
public void setB1(int b1) {
this.b1 = b1;
}
public int getB2() {
return b2;
}
public void setB2(int b2) {
this.b2 = b2;
}
}
package cesar.Test0810;
/**
* Created by Cesar on 2016/8/10.
*/
public class TestClone {
public static void main(String[] args) {
A a = new A();
B b = new B(1, 2);
a.setA(10);
a.setB(b);
try {
A a1 = a.clone();
System.out.println("a=" + a.toString());
System.out.println("a1=" + a1.toString());
a.setA(1000);
a.getB().setB1(10000);
a.getB().setB2(8000);
System.out.println("a=" + a.toString());
System.out.println("a1=" + a1.toString());
a.setB(new B(9999,9999));
System.out.println("a=" + a.toString());
System.out.println("a1=" + a1.toString());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
其中A繼承了cloneable接口,同時持有了對B的引用。

TA貢獻1813條經驗 獲得超2個贊
添加回答
舉報