你正在创建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