作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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...
}
}
所有这些的结果都是 n=0。整数 n 是一个对象,因此通过引用传递,那么为什么增量没有反射(reflect)在调用方方法(main)中?我预计输出为 n=0 n=1 n=2 等...
更新:请注意,我更新了上面的代码示例。如果我理解正确,Jon Skeet 回答了为什么 myInt 会增加而 n 不会增加的问题。这是因为 n 正在获取 Increment 方法中分配的新引用。但是 myInt 没有被分配一个新的引用,因为它正在调用一个成员函数。
这听起来像我理解正确吗?
最佳答案
不,对象不是通过引用传递的。引用是按值传递的——有很大的不同。 Integer
是不可变类型,因此不能在方法中更改值。
你的 n++;
语句是有效的
n = Integer.valueOf(n.intValue() + 1);
因此,这会为 Increment
中的变量 n
分配不同的值 - 但由于 Java only 具有按值传递,因此不影响调用方法中n
的值。
编辑:回答您的更新:没错。大概您的“MyIntegerObj”类型是可变的,并且在您调用 plusplus()
时会更改其内部状态。哦,别费心去寻找如何实现一个操作符——Java 不支持用户定义的操作符。
关于java - java - 如何从另一个方法增加一个类整数引用Java中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208943/
我是一名优秀的程序员,十分优秀!