java中链表代码的意外结果

时间:2013-03-27 09:44:04

标签: java

以下代码编译并执行时没有任何错误或警告。但是给出了意想不到的结果。

代码:

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
  ħ

  1. 为什么会这样?
  2. 如何获得预期结果?

3 个答案:

答案 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的值将是最后创建的对象的初始值。