gpt4 book ai didi

java - 对象值为空

转载 作者:行者123 更新时间:2023-12-01 17:29:49 27 4
gpt4 key购买 nike

我是 Java 新手,我正在尝试实现一个链接列表(我确实知道为此目的存在一个列表类,但是从头开始做可以让我了解该语言的内部工作原理)

在 main 方法中,我声明了 4 个节点并初始化了 3 个。链表的头节点设置为 null。第一次使用参数 head 和 newNode 调用 add 函数时,head 为 null,因此我初始化 head 并将 newNode 的值赋给它。在 main 方法中,我希望 head 对象应该具有通过 add 方法设置的新值。但头仍然是空的。

我很乐意理解为什么会发生这种情况。

如果代码不干净,我们深表歉意,非常感谢!

public class LinkedList
{
public void add(Node newNode, Node head)
{
if(head == null)
{
head = new Node();
head = newNode;
}
else
{
Node temp = new Node();
temp = head;

while(temp.next!=null)
{
temp = temp.next;
}
temp.next = newNode;
}
}

public void traverse(Node head)
{
Node temp = new Node();
temp = head;

System.out.println("Linked List:: ");

while(temp.next!=null);
{
System.out.println(" " + temp.data);
temp = temp.next;
}
}

public static void main(String args[])
{
Node head = null;
Node newNode = new Node(null, 5);
Node newNode2 = new Node(null, 15);
Node newNode3 = new Node(null,30);

LinkedList firstList = new LinkedList();

firstList.add(newNode,head);

// Part that I don't understand
// why is head still null here?

if(head==null)
{
System.out.println("true");
}

firstList.traverse(head);
firstList.add(newNode2,head);
firstList.traverse(head);
firstList.add(newNode3,head);
firstList.traverse(head);

}

}

public class Node
{
public Node next;
public int data;

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

public Node()
{
this.next = null;
this.data = 0;
}

}

最佳答案

Java 方法参数是按值传递的。

public void add(Node newNode, Node head)
{
if(head == null)
{
head = new Node();
head = newNode;
}
...

上面只修改了add范围内的局部变量head。不可能在 main 范围内引用局部变量 head。如果您希望调用者能够检索新值,也许您应该返回该值。

<小时/>

说实话,面向对象编程的一个主要原则就是封装;理想情况下,LinkedListhead 应该是内部维护的字段。为什么它应该是一个单独的部分?如果您确实希望将 head 隔离,那么为什么 traverseadd 不是静态的呢?你应该尝试修改你的设计。我决定重写你的代码here .

final class List {

private Node head;

public void add(final Node node) {
if (head == null) {
head = new Node();
}
Node cur;
for (cur = head; cur.next != null; cur = cur.next)
;
cur.next = node;
}

public String toString() {
final StringBuilder builder = new StringBuilder("Linked List::");
for (Node cur = head.next; cur != null; cur = cur.next) {
builder.append("\n ").append(cur.data);
}
return builder.toString();
}
}

final class Node {

int data;
Node next;

Node(final int data) {
this.data = data;
}

Node() { }
}

...然后,测试:

  private static Node[] nodesFor(final int... values) {
int n = values.length;
final Node[] nodes = new Node[n];
while (n > 0) {
nodes[--n] = new Node(values[n]);
}
return nodes;
}

public static void main(final String[] argv) {
final List list = new List();
for (final Node node : nodesFor(5, 15, 30)) {
list.add(node);
System.out.println(list);
}
}

关于java - 对象值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com