以下代码编译并执行时没有任何错误或警告。但是给出了意想不到的结果。
代码:
import java.util.LinkedList;
import java.util.Scanner;
//defining a custom data-type (class)
class LLObj{
static int NodeInt;
static char NodeChar;
LLObj(int x, char y){
NodeInt = x;
NodeChar = y;
}
}
class LLexp{
static LinkedList<LLObj> list = new LinkedList<>();
public static void main(String[] args){
list.addLast(new LLObj(5,'c'));
System.out.println(list.get(0).NodeInt);
System.out.println(list.get(0).NodeChar);
list.addLast(new LLObj(7,'h'));
System.out.println(list.get(0).NodeInt);
System.out.println(list.get(0).NodeChar);
System.out.println(list.get(1).NodeInt);
System.out.println(list.get(1).NodeChar);
}
}
预期产出 -
5
ç
5
ç
7
ħ
获得输出 -
5
ç
7
^ h
7
ħ
答案 0 :(得分:5)
这是问题所在:
static int NodeInt;
static char NodeChar;
如果每个LLObj
的意图都有自己的值(似乎很可能),那么这些值应该是实例变量。
了解实例字段/方法与静态字段/方法之间的区别非常重要。有关详细信息,请参阅Java tutorial。
答案 1 :(得分:1)
您已将NodeInt和NodeChar定义为静态变量。静态变量属于类级别,并且对于不同的实例不具有不同的值。 从两者中删除静电,它应该没问题。
答案 2 :(得分:1)
//defining a custom data-type (class)
class LLObj
{
static int NodeInt;
static char NodeChar;
LLObj(int x, char y)
{
NodeInt = x;
NodeChar = y;
}
}
您从LLObj类创建的所有对象共享相同的数据成员,
静态数据成员与类关联,而不是已启动的对象
在您的示例中,从LLObj创建的所有对象的NodeInt和NodeChar的值将是最后创建的对象的初始值。