2012-10-31 24 views
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()); 
} 


} 

請幫我個忙人。不明白爲什麼當我使用一個構造函數,我不能值分配到節點,但是當我創建一個實例,我可以......

謝謝你們,愛你的人!很好的幫助!

+1

什麼給你null。 'data'或'head.getValue()'。 –

+0

你從來沒有初始化List對象,它的構造函數沒有被調用,所以在初始化List對象之前,head始終爲空。 –

+0

是的,你從來沒有使用過構造函數。首先創建List(List list = new List())的對象,然後使用head變量。 –

回答

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 int numGears = 6;會創建這樣一個靜態字段 。此外,關鍵字final可以被添加到 表明齒輪數量永遠不會改變。

0

你應該初始化或者在聲明的時候,或者在一個靜態初始化塊的靜態變量。而不是在構造函數中。

構造將只使用,當你實例化你的List類,那你是不是做的任何地方。當類被加載到記憶中時,將執行static initializer塊。所以,你的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()); 
+0

一個更好的解決方案是去除'List'類的'INODE head'屬性的'static'關鍵字。這樣,OP可以在示例中添加多個列表。 –

+0

@LuiggiMendoza。我在前面的發言中早些時候寫過。我仍然添加了更多信息。謝謝:) –

0

你必須初始化列表對象主要方法

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()); 

}

+0

您初始化'List',但不要將它分配給一個變量。 –

0

你可以做到這一點無論哪種方式..或者你可以crea te類實例列表或 您可以初始化頭指向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()); 
} 
相關問題