2014-08-31 129 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