让一个方法修改引用,而不是一个新对象



我打赌这个问题已经回答了,但我不知道如何用简单的话来解释这个问题,在谷歌上找到一个简单的答案-我很抱歉!

这是我的测试代码:
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;

,其中Ee的类型。

也就是说,表达式等价于

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
}

相关内容

最新更新