我正在尝试制作一个包含不同对象的列表。
List<Object> list = new ArrayList<Object>();
defObject defObj;
optObject optObj;
和defObject只有一个String属性。
public static class defObject
{
public static String defObj;
public defObject(String x)
{
setDefObj(x);
}
public static String getDefObj() {
return defObj;
}
public static void setDefObj(String defObj) {
defObject.defObj = defObj;
}
}
如果我在列表中添加多个defObject并在完成添加元素之后遍历列表,则它们都包含相同的字符串,这是添加到列表中的最后一个defObject。
我正在做这样的事情来将对象添加到列表中:
if (whatever)
list.add(defObj = new defObject("x"));
else if(whatever)
list.add(defObj = new defObject("y"));
,结果是两个defObjects,字符串为“y”
请帮我弄清楚为什么没有正确添加对象,并且属性与添加到列表中的最后一个defObj完全相同。
答案 0 :(得分:12)
问题是defObj
是static
所以所有实例都共享同一个变量。从班级中的任何地方删除单词static
,一切都可能按预期工作。
答案 1 :(得分:3)
String defObj
变量是静态的,因此对于defObject的所有实例它总是相等的。在方法和属性声明之前删除“static
”,它应该有效。
答案 2 :(得分:3)
替换:
public static class defObject
{
public static String defObj;
...
使用:
public static class defObject
{
public String defObj;
....
甚至更好:
public class DefObject {
private String defObj;
....
使用关键字static
会使属性或方法成为class
方法,这意味着只有一个用于所有实例。
从代码中删除它。另外,在Java中按照惯例注意,类名以大写开头,而左大括号在同一行。
答案 3 :(得分:0)
从static
移除public static String defObj;
并将其设为private
后,您还需要从方法签名中删除static
,因为static
方法无法从静态上下文访问实例变量,即defObject.getDefObj()
无法访问实例变量defObj
,因为编译器无法确保它已经存在 - 没有实例实例化,因此没有实例变量。这只能在类加载时使用static
属性来完成。