java - 让方法修改引用而不是新对象

标签 java object methods reference

我敢打赌这个问题已经有人回答了,但我不知道如何用简单的词来解释这个问题,以便在谷歌上找到一个简单的答案 - 对不起!

这是我的测试代码:

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 并想通过无效方法“increase(..)”修改它。 由于 Integer 是一个对象,x 是指向该对象的指针。 我想要“increase(..)”来修改 Integer 本身,所以“i”指的是与“x”相同的对象。但是,如果我查看 print(x)(即“10”),我假设该方法创建了一个内容为“x”的新整数。

我希望有人能理解我...

我需要它做什么?

我正在尝试使用多个线程对从 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]);
}
}

Out of interest, can you explain why this works? I thought java was strictly pass by value?

Java 是按值传递的。引用按值传递,但这是浅拷贝而不是深拷贝。也就是说,您不能更改引用,但可以更改引用的对象。

您不能直接使用 Integer 执行此操作,因为它是不可变的,因此您无法更改任何内容。传递对可变对象的引用,您可以更改它。

关于java - 让方法修改引用而不是新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971453/

相关文章:

java - 将 Cucumber 集成到测试框架中?

java - InetAddress 不断变化,我没有得到我期望的地址

java - 在 EditText View 中键入内容后隐藏键盘

javascript - 将对象的值分组到新数组中 - JavaScript

java - 遍历方法参数

java - 根据 JSON 请求正文中的另一个属性反序列化抽象属性

javascript - 了解使用 'Object.create()' 而不是 'new' 关键字创建原型(prototype)对象

javascript - 设置函数 javascript 的属性

java - 调用所有并行类线程的方法

c++ - exe从c++中的方法出来后崩溃