2014-08-31 130 views
0

編寫一個完整記錄的類Menu,它存儲數組中的項目列表並提供與此列表進行交互的接口。 A菜單可以同時容納50個項目,所以使用最後一個變量MAX_ITEMS = 50如何訪問對象中的數組

我創建的構造,並呼籲菜單項

public class Menu implements Cloneable { 

     final int MAX_ITEMS = 50; 

     public Menu(){ 
      MenuItem[] menu = new MenuItem[MAX_ITEMS]; 
     } 
    } 

我想創建一個方法克隆一個單獨的類一份菜單。如何訪問Menu中每個單獨的MenuItem的屬性?

回答

0

你正在創建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; 
} 
+0

如果我使用cloneTwo我將能夠更改一個,而不更改其他呢? – 2014-08-31 15:34:29

+0

和謝謝你的解釋是非常有幫助 – 2014-08-31 15:35:59

+0

是的,cloneTwo將允許這種行爲。但是,如果您對發生在兩個Menu對象中的menuItem進行了更改,則兩者都會被更改。 – Mshnik 2014-08-31 15:51:26

0

我不認爲你必須經歷這一切,假設A是菜單...

public static Menu clone(){ 
Menu B = this; 
return B; 
} 

然後,只需調用它使用

Menu B = A.clone(); 
+0

默認的克隆方法不會做深度複製,這意味着它們將共享菜單項。 – folkol 2014-08-31 14:57:45