为什么列表给了我一个值,但另一个不是?

时间:2012-10-31 05:08:59

标签: java list

public class INode
{
    private int value;
    private INode right, down;
    private int row, col;

    public INode(int value)
    {
        this.value = value;
    }

    public int getValue() 
    {
        return value;
    }

    public void setValue(int value) 
    {
        this.value = value;
    }

    public INode getRight() 
    {
        return right;
    }

    public void setRight(INode right) 
    {
        this.right = right;
    }

    public INode getDown() 
    {
        return down;
    }

    public void setDown(INode down)
    {
        this.down = down;
    }

    public int getRow() 
    {
        return row;
    }

    public void setRow(int row) 
    {
        this.row = row;
    }

    public int getCol() 
    {
        return col;
    }

    public void setCol(int col) 
    {
        this.col = col;
    }


}

我可以得到a = 8的值但是对于head,即使我使用构造函数来设置,仍然给我value = null ...不知道为什么。

司机是:

import java.util.*;
public class List
{
public static INode head;
public List()
{
    head = new INode(8);

}
public static void main (String[] args)
{
    INode a = new INode(8);
    int data = a.getValue();
    System.out.println(data);
    System.out.println(head.getValue());
}


}

请帮帮我一个人。不明白为什么当我使用构造函数时,我无法将值赋给节点,但是当我创建一个实例时,我可以......

谢谢你们,爱你们!很好的帮助!

4 个答案:

答案 0 :(得分:1)

您没有实例化类List。将您的代码更改为

public INode head; // remove static
public List() {
    head = new INode(8);
}

修改你的主要方法:

public static void main (String[] args) {
    INode a = new INode(8);
    int data = a.getValue();
    System.out.println(data);

    List l = new List(); // create new List instance
    System.out.println(l.head.getValue()); // get the head from List instance
}

另一个有效的替代方案是只改变一行:

public static INode head = new INode(8); // create instance during class initialization

我建议查看类(静态)和实例变量之间的区别,例如:在Java Tutorials中(摘录如下):

  
      
  • 实例变量(非静态字段)从技术上讲,对象将其各个状态存储在“非静态字段”中,即   声明没有static关键字的字段。非静态字段也是   称为实例变量,因为它们的值对每个变量都是唯一的   类的实例(换句话说,对每个对象); currentSpeed   一辆自行车是独立于另一辆自行车的当前速度。

  •   
  • 类变量(静态字段)类变量是使用static修饰符声明的任何字段;这告诉编译器那里   正好是这个变量的一个副本,无论如何   很多时候这个类已经被实例化了。定义的字段   特定种类的自行车的齿轮数量可以标记为   从概念上讲,相同数量的齿轮将适用于所有齿轮   实例。代码static int numGears = 6;会创造这样一个   静态场。此外,可以添加关键字final   表示齿轮的数量永远不会改变。

  •   

答案 1 :(得分:0)

您应该在声明点或静态初始化程序块中初始化静态变量。而不是在构造函数中。

只有在实例化List类时,才会使用构造函数,而不是在任何地方。当类加载到memoty中时,执行static initializer块。因此,当加载类时,您的INode将被初始化。

public static INode head;
static {
    head = new INode(8);
}

或只是: -

public static INode head = new INode(8);
  • static变量对所有实例都是通用的。如果进行了更改 例如,它将反映在所有实例中。好吧 确定在使用它们之前,你真的想要它。如果可能的话, 将您的INode声明为non-static变量。并实例化你的 使用前List class

    public INode head = new INode(8);
    

然后在您的main方法中,您可以像这样访问它: -

List list = new List();
System.out.println(list.head.getValue());

答案 2 :(得分:0)

您必须在main方法

中初始化List对象
 public static void main (String[] args)
 {
   new List();
     INode a = new INode(8);
     int data = a.getValue();
    System.out.println(data);
    System.out.println(head.getValue());

}

答案 3 :(得分:0)

您可以这样做。要么您可以创建班级列表的实例,要么 你可以初始化头部指向INode的对象。 这取决于您需要的业务逻辑

public static void main(String[] args) {
    INode a = new INode(8);
    int data = a.getValue();
    System.out.println(data);
    List list = new List();
    System.out.println(list.head.getValue());

    head = new INode(6);
    System.out.println(head.getValue());
}