你正在創建MenuItem[] menu
爲一個局部變量,永遠不會將其存儲在構造函數之後。所以你不但不能克隆它,你不能再次訪問它。
嘗試使用現場爲menu
變量,就像這樣:
public class Menu implements Cloneable {
final int MAX_ITEMS = 50;
private MenuItem[] menu;
public Menu(){
menu = new MenuItem[MAX_ITEMS];
}
}
現在Menu類中的任何方法都可以訪問menu
施工期間設置。
至於克隆,它取決於你想克隆的深度。如果您只是想要一個指向內存中相同的menu
數組的新菜單對象,請參閱cloneOne。如果您想要一個新的包含與舊menu
陣列相同對象的menu
陣列的對象,請參閱cloneTwo。如果你想要走得更遠,你必須提供MenuItem類的一些細節:
public class Menu implements Cloneable {
final int MAX_ITEMS = 50;
private MenuItem[] menu;
public Menu(){
menu = new MenuItem[MAX_ITEMS];
}
public Menu cloneOne(){
Menu a = new Menu();
a.menu = menu;
return a;
}
public Menu cloneTwo(){
Menu a = new Menu();
a.menu = new MenuItem[menu.length];
for(int i = 0; i < menu.length; i++)
a.menu[i] = menu[i];
return a;
}
如果我使用cloneTwo我將能夠更改一個,而不更改其他呢? – 2014-08-31 15:34:29
和謝謝你的解釋是非常有幫助 – 2014-08-31 15:35:59
是的,cloneTwo將允許這種行爲。但是,如果您對發生在兩個Menu對象中的menuItem進行了更改,則兩者都會被更改。 – Mshnik 2014-08-31 15:51:26