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 の値を取得できますが、コンストラクターを使用して設定しても、値 = 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
}

別の有効な代替手段は、1 行だけを変更することです。

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

Java チュートリアルなどで、クラス (静的) 変数とインスタンス変数の違いを確認することをお勧めします(抜粋は次のとおりです)。

  • インスタンス変数 (非静的フィールド) 技術的に言えば、オブジェクトは個々の状態を「非静的フィールド」、つまり static キーワードなしで宣言されたフィールドに格納します。非静的フィールドは、その値がクラスの各インスタンス (つまり、各オブジェクト) に対して一意であるため、インスタンス変数とも呼ばれます。ある自転車の currentSpeed は、別の自転車の currentSpeed から独立しています。

  • クラス変数 (静的フィールド) クラス変数は、static 修飾子で宣言された任意のフィールドです。これにより、クラスがインスタンス化された回数に関係なく、この変数のコピーが 1 つだけ存在することがコンパイラに伝えられます。特定の種類の自転車のギア数を定義するフィールドは、概念的には同じ数のギアがすべてのインスタンスに適用されるため、静的としてマークできます。コード static int numGears = 6; そのような静的フィールドを作成します。さらに、キーワード final を追加して、ギアの数が決して変わらないことを示すことができます。

于 2012-10-31T05:14:54.303 に答える
0

これはどちらの方法でも行うことができます.. Class List のインスタンスを作成するか、INode のオブジェクトを指すように head を初期化することができます。これは、必要なビジネス ロジックによって異なります。

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 に答える
0

宣言の時点で、または静的初期化ブロックで静的変数を初期化する必要があります。コンストラクターではありません。

コンストラクターは、クラスをインスタンス化するときにのみ使用され、Listどこにも行っていません。static initializerブロックは、クラスが memoty にロードされるときに実行されます。したがって、INodeクラスがロードされると、あなたは初期化されます。

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

あるいは単に: -

public static INode head = new INode(8);
  • static変数はすべてのインスタンスに共通です。1 つのインスタンスに変更を加えると、すべてのインスタンスに反映されます。したがって、それらを使用する前に、実際にそれが必要であることを確認してください。可能であれば、変数INodeとして宣言してください。non-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

メインメソッドで 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 に答える