我打赌这个问题已经回答了,但我不知道如何用简单的话来解释这个问题,在谷歌上找到一个简单的答案-我很抱歉!
这是我的测试代码:public class test {
public static void increase(Integer i){
i++;
}
public static void main(String[] args){
Integer x = new Integer(10);
increase(x);
System.out.println(x);
}
}
我有一个整数x,并希望通过void方法"increase(..)"修改它。由于Integer是Object,所以x是指向该对象的指针。我想要"increase(…)"来修改Integer本身,所以"I"one_answers"x"指的是同一个对象。但是如果我看一下print(x)(它是"10"),我假设该方法创建了一个内容为"x"的新Integer。
我希望有人能理解我…
我需要它做什么?
我试图使用多个线程来总结从1到"n"的数字。我创建了一个类"MyThread",它得到一个lowerLimit和一个upperLimit来总结间隔,以及一个"结果"(但作为参考-不是一个新对象),其中添加了间隔的数字。
致以最亲切的问候Tak3r07
有三种方法。
public class test {
public static void increase(AtomicInteger i){
i.getAndIncrement()
}
public static void main(String[] args){
AtomicInteger x = new AtomicInteger(10);
increase(x);
System.out.println(x);
}
}
或
public class test {
public static void increase(int[] i){
i[0]++;
}
public static void main(String[] args){
int[] x = { 10 };
increase(x);
System.out.println(x[0]);
}
}
或与整型
public class test {
public static void increase(Integer[] i){
i[0]++;
}
public static void main(String[] args){
Integer[] x = { 10 };
increase(x);
System.out.println(x[0]);
}
}
出于兴趣,你能解释一下为什么会这样吗?我以为java是严格按值传递的?
Java按值传递。引用是按值传递的,但是这是一个浅拷贝而不是深拷贝。也就是说,你不能改变引用,但是你可以改变被引用的对象。
您不能直接对Integer
执行此操作,因为它是不可变的,因此您无法更改任何内容。传递一个引用到一个可变对象,你可以改变它
Integer
类像String
和其他原始包装类是不可变的,这意味着它们的值不能改变,所以每次你试图改变它们的值时,你实际上是在创建它们的一个新实例。您可以使用AtomicInteger
, AtomicLong
, AtomicDouble
…
形式的表达式e++
是
E old = e;
e = (E) (old + 1);
return old;
,其中E
为e
的类型。
也就是说,表达式等价于
i = (Integer) (i + 1);
通过计算i + 1,创建(或重用)一个Integer对象来保存该值,并将对该对象的引用存储在变量i中来求值。原始Integer对象不被修改,调用者仍然引用原始对象,因此看到原始值。
要解决这个问题,您可以返回对新Integer对象的引用,并要求调用者存储它,或者将引用传递给支持更改值的类的对象。唉,Integer不是这样的类,因为一旦对象创建,它的值就不能更改。请参阅Peter和Braj的回答,了解合适的课程示例。
创建一个单独的类:
示例代码:
public class MyInteger {
int value;
public MyInteger(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void increase() {
value++;
}
@Override
public String toString(){
return String.valueOf(value);
}
}
....
public static void main(String[] args){
MyInteger x = new MyInteger(10);
x.increase();
System.out.println(x.getValue()); // print 11
System.out.println(x); // print 11
}