我是java的新手。 问题可能不那么清楚。让我解释一下使用代码。 下面的代码是一个在链表中打印出值的函数。 函数的第一行创建一个引用,指向HeadNode引用指向的同一对象。因此,对currentNode的任何更改都将影响HeadNode指向的对象。 现在,在while循环中,我正在更改currentNode,但我观察到在退出函数后linkList没有改变。为什么呢?
static void PrintLinkedList(ListNode HeadNode)
{
ListNode currentNode = HeadNode;
while(currentNode != null)
{
System.out.println(currentNode.getData());
currentNode = currentNode.getNext();
}
}
更新
我提出这个问题的原因是,当我实现一个函数来反转一个链表时,我的tempNode在执行下面的代码后变为null:
static ListNode ReverseLinkedList(ListNode headNode)
{
ListNode headNodeTemp = headNode;
headNodeTemp.setNext(null);
ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
ListNode currentNode = headNodeTemp;
while(tempNode != null)
{...
答案 0 :(得分:2)
因此对currentNode的任何更改都会影响HeadNode指向的对象。
不,currentNode
是对HeadNode
引用的对象的引用。你永远不会改变那个对象,你改变的只是currentNode
所指的。
currentNode = currentNode.getNext();
使currentNode
指向下一个对象,它不会更改任何对象。
要更改对象,您需要调用方法或设置属性
currentNode.mutate();
currentNode.property = 17;
会更改指向对象,当通过HeadNode
查询对象时,这些更改将会显示。
currentNode = currentNode.getNext();
只是让currentNode
指向另一个对象。
在
static ListNode ReverseLinkedList(ListNode headNode)
{
ListNode headNodeTemp = headNode;
headNodeTemp.setNext(null);
这里,我们调用一个改变指向对象的方法。按名称命名,它会将next
字段设置为null
。对象headNodeTemp
指向的是headNode
指向的对象。
ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
ListNode currentNode = headNodeTemp;
while(tempNode != null)
{...
你应该移动
ListNode tempNode = headNode.getNext();
在setNext(null)
行之上。
static ListNode ReverseLinkedList(ListNode headNode)
{
ListNode headNodeTemp = headNode;
ListNode tempNode = headNode.getNext();
headNodeTemp.setNext(null);
ListNode currentNode = headNodeTemp;
while(tempNode != null)
{...
答案 1 :(得分:0)
你混淆了对象和引用。
currentNode = x
不会更改currentNode
指向的对象。相反,它会将currentNode
变量更改为指向其他对象。
这不会影响碰巧指向旧对象的任何其他字段或变量。
答案 2 :(得分:0)
与其他职位达成一致。所有参数都是Java中的pass-by-value - 演示:
public static void main(String[] args) {
List a = new ArrayList();
a.add("Fred");
changeA(a);
// contents of a is "Fred" not "Barney" (change to 'a' not reflected back here)
// because all arguments are Pass-By-Value
addToA(a);
// contents of a is "Fred" AND "Barney"
int b = 10;
changeB(b);
// b = 10 (not 20)
}
static void changeA(List a) {
a = new ArrayList(); // a is now a different object
a.add("Barney");
}
static void addToA(List a) {
a.add("Barney");
}
static void changeB(int b) {
b = 20;
}