我对一个Java List<>类有一些奇怪的行为,它用最后添加的值覆盖所有的值。
以下面的代码为例...
import java.io.*;
import java.sql.*;
import java.lang.*;
import java.util.*;
public class alist
{
//
public static class item
{
public static String name;
public static long type;
item() {}
item( String n, long t )
{
name = n;
type = t;
}
public String toString()
{
return "name: " + name +
", type: " + String.valueOf( type );
}
}
public static void main(String [] args)
{
List<item> lst = new ArrayList<item>();
lst.add( new item( "abc", 0 ) );
lst.add( new item( "xyz", 1 ) );
for ( item i : lst )
System.out.println( i.toString() );
}
}我原以为这会输出以下内容...
name: abc, type: 0
name: xyz, type: 1..。但它却打印了..。
name: xyz, type: 1
name: xyz, type: 1..。想法?
我敢肯定这是很愚蠢的事情,因为有树,我根本看不到森林。。
发布于 2014-06-09 23:57:50
您将Item类属性声明为静态的,因此,它们由所有Item实例共享。静态属性是类属性,每个属性只有一个值与类本身关联,而不是与每个单独的对象关联。
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
第二次调用Item构造函数是为了改变值,这就是为什么你会得到相同的字符串。
更改:
public static String name;
public static long type;适用于:
public String name;
public long type;发布于 2014-06-09 23:58:04
您的Item类具有静态变量,而不是成员变量。每次调用构造函数时,都会更改静态值。
将其更改为:
public static class item
{
public String name;
public long type;
item() {}
item( String n, long t )
{
name = n;
type = t;
}
public String toString()
{
return "name: " + name +
", type: " + String.valueOf( type );
}
} 发布于 2014-06-09 23:58:37
这是因为您在声明名称和类型时添加了static。Static关键字只创建对象的一个实例,所以无论何时更新该值,它的所有值都是相同的。只需移除静电并尝试。
https://stackoverflow.com/questions/24124001
复制相似问题