能否用构造方法修改私有静态数组?cardNames类静态数组有效性咨询
关于Java静态数组与构造方法的问题解答
1. 构造方法能否修改私有静态数组?
完全可以!构造方法作为类的实例初始化方法,在类内部可以访问所有成员——包括私有静态成员。你代码里通过Arrays.copyOf给私有静态数组赋值的操作是合法且有效的,没有语法或访问权限上的问题。
2. 将数组设为static是否合法?创建新对象后会有新数组吗?
合法性
语法上是合法的,但从你的业务需求来看,这种写法会导致逻辑问题,并不适合你的场景。
核心问题:静态成员的特性
静态成员(包括静态数组)是属于整个类的,而不是某个具体实例。也就是说:
- 不管你创建多少个
cardNames对象,所有实例都会共享同一组characters、weapons、rooms静态数组。 - 当你创建新的
cardNames对象时,构造方法会覆盖静态数组的原有内容——新游戏的卡牌数据会直接替换旧游戏的,多个游戏实例会互相干扰,完全不符合你“每个新实例对应当前游戏卡牌”的需求。
正确的做法
去掉数组的static修饰符,让它们成为实例成员(顺便调整类名遵循Java大驼峰规范):
public class CardNames { private String[] characters; private String[] weapons; private String[] rooms; private int totalCards; public CardNames(String[] theCharacters, String[] theWeapons, String[] theRooms) { characters = Arrays.copyOf(theCharacters, theCharacters.length); weapons = Arrays.copyOf(theWeapons, theWeapons.length); rooms = Arrays.copyOf(theRooms, theRooms.length); totalCards = characters.length + weapons.length + rooms.length; } public String[] getCharacters() { return Arrays.copyOf(characters, characters.length); } }
这样每个CardNames实例都会拥有独立的卡牌数组,创建新对象时会初始化属于当前游戏的专属卡牌数据,不同游戏实例之间不会互相影响。
内容的提问来源于stack exchange,提问作者Daniel Duque
相关产品推荐
相关产品推荐

