2012-09-11 20 views
0

我知道有被聲明爲protected一個clone()方法對象類,因此,這意味着我可以叫clone()在我自己的類,因爲每個類都是從對象類繼承,例如:調用clone()在我自己的類

public class CloneTest 
{ 
    public static void main(String args[]) 
    { 
     Employee employee1 = new Employee(...); 
     Employee employee2 = employee1.clone(); // but here has 2 errors 
    } 
} 

class Employee 
{ 
    ... 
} 

第一個錯誤是什麼「在訪問受保護對象」
第二個錯誤是「不兼容的類型」
爲什麼這些錯誤發生?

回答

3

如果未覆蓋,clone method將返回一個Object。所以你必須得出結果:

Employee employee2 = (Employee) employee1.clone(); 

第一個錯誤與Employee類的內容有關,我們沒有看到。它是否覆蓋克隆方法?它應該,這是從被稱爲類的其他類訪問它的條件。

+0

你的意思是說,如果我不重寫Employee類中的clone()方法,它會產生一個錯誤?但我認爲'clone()'是** Object **類中的** protected **方法,所以我可以將它用於我的CloneTest類(因爲CloneTest是Object的子類) –

+0

是的,您必須重寫它。這將使其可訪問(如果您願意,您可以公開發布)。 CloneTest中的方法無法調用在Employee上調用的Object類的受保護方法。 –

+0

施法應該在clone()方法中完成,而不是由客戶端 – dcernahoschi

0

第一個錯誤是因爲.clone在Object類中受到保護。它不是公開的.`

訪問對象的.clone()方法的唯一方法是知道它有一個編譯時類型,它有一個公開的.clone()方法。

覆蓋clone方法Employee

class Employee implements Cloneable 
{ 
    @Override 
    protected Employee clone() throws CloneNotSupportedException { 
    // TODO Auto-generated method stub 
    return (Employee)super.clone(); 
} 
} 
} 
1

Employee類應該是這個樣子的clone()工作:

public class Employee implements Cloneable { 
    ... 

    public Employee clone() { 
     try { 
      return (Employee) super.clone(); 
     } 
     catch(CloneNotSupportedException e) { 
      throe new IllegalStateException("I forgot to implement cloneable"); 
     } 
    } 

    ... 
} 

第一個錯誤是因爲clone保護了訪問在Object類,第二個是因爲它通過返回Object默認。