如何在不更改函数参数值的函数中创建引用?

时间:2012-12-11 01:12:12

标签: java

我是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)
        {...

3 个答案:

答案 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;
}