0
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

4 回答 4

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 教程中(摘录如下):

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

  • 类变量(静态字段) 类变量是使用 static 修饰符声明的任何字段;这告诉编译器存在这个变量的一个副本,无论该类被实例化了多少次。定义特定类型自行车的齿轮数量的字段可以标记为静态,因为从概念上讲,相同数量的齿轮将应用于所有实例。代码 static int numGears = 6; 会创建这样一个静态字段。此外,可以添加关键字 final 来表示齿轮的数量永远不会改变。

于 2012-10-31T05:14:54.303 回答
0

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

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

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

要不就: -

public static INode head = new INode(8);
  • static变量对所有实例都是通用的。如果对一个实例进行了更改,它将反映在所有实例中。因此,请确保在使用它们之前,您确实需要它。如果可能,将您的声明INodenon-static变量。List class并在使用之前实例化你的 。

    public INode head = new INode(8);
    

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

List list = new List();
System.out.println(list.head.getValue());
于 2012-10-31T05:15:48.677 回答
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());

}

于 2012-10-31T05:16:01.983 回答
0

你可以用任何一种方式做到这一点..你可以创建一个类列表的实例,或者你可以初始化 head 以指向 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());
}
于 2012-10-31T05:27:28.963 回答