0

當我使用匿名內部類創建節點時。當我打印所有的鍵,他們打印爲0,而不是我在匿名類聲明中分配的值。難道我做錯了什麼?這裏是我的代碼:匿名內部類成員在java中不可訪問

public class LinkedListTest { 
Node head; 

public void addInOrder(final int value) { 
    if (head == null) { 
     head = new Node() { 
      int key = value; 
     }; 
    } 
    else if(head.key > value) { 
     final Node temp = head; 
     head = new Node() { 
      int key = value; 
      Node next = temp; 
     }; 
    } 
    else { 
     Node theNode = head; 
     while(theNode.key < value) { 
      if (theNode.next == null) { 
       theNode.next = new Node() { 
        int key = value; 
       }; 
       return; 
      } 
      else if(theNode.next.key > value) { 
       final Node temp = theNode.next; 
       theNode.next = new Node() { 
        int key = value; 
        Node next = temp; 
       }; 
       return; 
      } 
      theNode = theNode.next; 
     } 
    } 
} 

這是我爲我的節點類聲明:

class Node { 
    int key; 
    Node next; 
} 

這是我的打印方法:

public void printAll(Node hasNode) { 
    if (hasNode != null) { 
     System.out.println(hasNode.key); 
     if (hasNode.next != null) { 
      printAll(hasNode.next); 
     } 
    } 
} 

回答

3

這是因爲你不分配值分配給Node中的字段,則您將爲具有相同名稱的匿名子類中的字段賦值。

添加一個構造函數來Node,並且不創建一個匿名子類:

class Node { 
    int key; 
    Node next; 

    Node(int key, Node next) { 
    this.key = key; this.next = next; 
    } 
} 

或者,您可以添加第二個構造函數只需要關鍵:

Node(int key) { 
    this(key, null); 
    } 

另一種方法是隻需撥打new Node(key, null)

+0

安迪打敗了我幾秒鐘:-),但是,這就是發生了什麼。匿名子類中的'int key = value;'聲明並初始化匿名子類中的實例變量,該實例變量覆蓋'Node'中相同名稱的字段。 – blm

+0

我明白了,但是如果我賦值給它們的值字段,匿名內部類的最後一點是不能在它們聲明的範圍之外訪問的?我認爲在這種情況下「陰影」會起作用。 感謝您的反饋! –

+0

匿名內部類有很多用途,不涉及聲明相同名稱的成員變量。但是,在匿名內部類中聲明的任何成員變量或非重寫方法幾乎都是不可訪問的,因爲您只需引用「Node」,而不是「NodeList」的特定子類LinkedListTest $ 1。 –

0

安迪·特納回答說,你在你的匿名類爲匿名類的實例變量聲明keynext,並且要初始化這些實例變量,但他們無關,從類Node同名的實例變量。

如果它會更容易理解,這一點:

theNode.next = new Node() { 
    int key = value; 
    Node next = temp; 
}; 

相當於本地類是這樣的:

class Foo extends Node { 
    int key = value; 
    Node next = temp; 
}; 
theNode.next = new Foo(); 

,或者你甚至可以解除類的方法的這樣捕捉更加清晰:

// outside the method 
class Foo extends Node { 
    int key; 
    Node next; 
    Foo(int value, Node temp) { key = value; next = temp; } 
}; 
// inside the method 
theNode.next = new Foo(value, temp); 

的觀點是,在所有這些情況下,您要分配值s到實例變量Foo,而不是實例變量Node

您可以在匿名類中執行初始化,使您可以分配給實例變量Node。雖然匿名類沒有構造函數(他們並不需要他們),初始化可以在實例初始化完成:

theNode.next = new Node() { 
    { 
     key = value; 
     next = temp; 
    } 
}; 

它經常寫在「雙大括號初始化」樣式:

theNode.next = new Node() {{ 
    key = value; 
    next = temp; 
}}; 
相關問題