在java中通过引用传递的解决方法

时间:2014-12-22 22:14:41

标签: java

从此book

找到单个链表的最后一个元素的第k个。 提出的解决方案之一如下:

  public class IntWrapper{
    public int value = 0;
  }

  Node nthToLast3(Node head, int k, IntWrapper i){
    if (head == null){
      return null;
    }
    Node node = nthToLast3(head.next, k, i);
    i.value = i.value + 1;
    if (i.value == k){
      return head;
    }
    return node;
  }

为什么我们必须创建int Wrapper类而不能直接使用int?

4 个答案:

答案 0 :(得分:3)

这个技巧的作用是将int(本机类型)包装在一个对象(Object派生类型)中。所有内容都通过Java中的值传递,对于对象,引用的值在某种意义上作为参数传递(例如,将其视为C/C++中的指针值)。 / p>

答案 1 :(得分:2)

作者使用IntWrapper而不是int,因为他希望在调用者和被调用者之间实现值的持久状态。

调用者可以看到对被调用者中int个实例的IntWrapper成员的修改。

使用普通int,这是不可能的,因为它是一个原始类型,因此它将通过值传递(如果可能的话,它将被“复制”)。

答案 2 :(得分:2)

Java中不可能通过引用传递原始值。这是对语言本身的限制。

从技术上讲,你可以传递给方法的唯一东西是“原语和指向对象的指针”。后者也是一种原始形式。 Java既没有引用也没有const对象传递。

答案 3 :(得分:-1)

关键是您希望能够设置i

的值

int在Java中实现为原始数据,它们是按值传递的。这意味着以下代码未设置a

public void Foo () {
    int a = 5;
    System.out.println(a);//prints 5
    setA(a);
    System.out.println(a);//prints 5
}

public void setA (int a) {
    a = 3;
}

Java会复制堆栈中变量的,并修改副本,使原始a保持不变。

使用Wrapper,将int存储在对象中。由于object是从“变量透视图”传递的值,或者是从对象透视图传递的,因此您引用包含object的{​​{1}}。换句话说,int引用同一个实例。因为您复制 参考而不是对象 callee 所做的更改因此反映在调用者的视图中。

aw

当您想要返回多个值或修改调用者的变量时,这在Java中很有用。

C#或者提供public void Foo () { IntWrapper aw = new IntWrapper(); aw.value = 5; System.out.println(aw.value);//prints 5 setA(aw); System.out.println(aw.value);//prints 3 } public void setA (IntWrapper aw) { aw.value = 3; } 关键字,用于启用原始值的引用调用。