0

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

代码 :

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
小时
7
小时

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

3 回答 3

5

这就是问题:

static int NodeInt;
static char NodeChar;

如果目的是让每个LLObj人都有自己的值(这似乎很可能),那么这些应该是实例变量。

了解实例字段/方法和静态字段/方法之间的区别非常重要。有关更多详细信息,请参阅Java 教程

于 2013-03-27T09:45:54.917 回答
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 的值将是最后一个创建的对象的初始值..

于 2013-03-27T09:58:32.450 回答
1

您已将 NodeInt 和 NodeChar 定义为静态变量。静态变量处于类级别,并且不为不同的实例保存不同的值。从两者中删除静电,它应该没问题。

于 2013-03-27T09:49:59.880 回答