从此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?
答案 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;
}
关键字,用于启用原始值的引用调用。