cch*_*ion 27 java pass-by-reference
package myintergertest;
/**
*
* @author Engineering
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//this one does not increment
Integer n = new Integer(0);
System.out.println("n=" + n);
Increment(n);
System.out.println("n=" + n);
Increment(n);
System.out.println("n=" + n);
Increment(n);
System.out.println("n=" + n);
Increment(n);
//this one will increment
MyIntegerObj myInt = new MyIntegerObj(1);
Increment(myInt);
System.out.println("myint = " + myInt.get());
Increment(myInt);
System.out.println("myint = " + myInt.get());
Increment(myInt);
System.out.println("myint = " + myInt.get());
}
public static void Increment(Integer n) {
//NO. this doesn't work because a new reference is being assigned
//and references are passed by value in java
n++;
}
public static void Increment(MyIntegerObj n) {
//this works because we're still operating on the same object
//no new reference was assigned to n here.
n.plusplus(); //I didn't know how to implement a ++ operator...
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些的结果是n = 0.整数n是一个对象,因此通过引用传递,那么为什么增量不会反映在调用方法(main)中?我期望输出为n = 0 n = 1 n = 2等...
更新:注意我更新了上面的代码示例.如果我理解正确,Jon Skeet回答了为什么myInt会增加以及为什么n不会增加的问题.这是因为n正在获取在Increment方法中指定的新引用.但myInt没有被分配一个新的引用,因为它调用了一个成员函数.
这听起来像我理解正确吗?
Jon*_*eet 38
不,对象不通过引用传递.参考文献通过价值传递 - 这有很大的不同.Integer是一个不可变类型,因此您无法更改方法中的值.
你的n++;陈述是有效的
n = Integer.valueOf(n.intValue() + 1);
Run Code Online (Sandbox Code Playgroud)
所以,这赋予不同的值的变量n中Increment-但如Java 只具有传递的价值,不影响价值n的调用方法.
编辑:回答你的更新:是的.据推测,您的"MyIntegerObj"类型是可变的,并在您调用时更改其内部状态plusplus().哦,不要四处寻找如何实现运算符 - Java不支持用户定义的运算符.
您正在寻找类似于C++参考或C#'out参数的东西.Java(和许多其他语言)不支持这一点.
通常通过将方法从void更改为(在本例中)int来实现此类行为: public static int increment(int n) { return ++n; }
如果该方法已经返回了某些内容,那么您可以创建一个具有两个字段(甚至可以是公共字段)的新类:原始返回值和n的新值.
或者,您也可以将整数包装在通用Cell类中.你只需要写一次这个Cell类:
public class Cell<T> {
public Cell(T t) { value = t; }
public void set(T t) { value = t; }
public T get() { return value; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在需要更改基元的方法的所有情况下使用它:
public static void increment(Cell<Integer> n) {
n.set(n.get()++);
}
Cell<Integer> n = new Cell<Integer>(0);
increment(n);
increment(n);
increment(n);
System.out.println(n.get()); // Output: 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67754 次 |
| 最近记录: |