当前位置: 首页 > 面试题库 >

如何通过引用正确传递Integer类?

公羊招
2023-03-14
问题内容

我希望有人可以为我澄清这里发生的事情。我在整数类中挖了一下,但是由于整数 覆盖+运算符,所以我无法弄清楚出了什么问题。我的问题是这条线:

Integer i = 0;
i = i + 1;  // ← I think that this is somehow creating a new object!

这是我的推理:我知道java通过值传递(或通过reference的值传递),因此我认为在下面的示例中,整数对象应每次递增。

public class PassByReference {

    public static Integer inc(Integer i) {
        i = i+1;    // I think that this must be **sneakally** creating a new integer...  
        System.out.println("Inc: "+i);
        return i;
    }

    public static void main(String[] args) {
        Integer integer = new Integer(0);
        for (int i =0; i<10; i++){
            inc(integer);
            System.out.println("main: "+integer);
        }
    }
}

这是我的预期输出:

公司:1
主:1
公司:2
主:2
公司:3
主:3
公司:4
主:4
公司:5
主:5
公司:6
主:6
...

这是实际输出。

公司:1
主:0
公司:1
主:0
公司:1
主:0
...

为什么会这样?


问题答案:

有两个问题:

  1. 整数是通过值而不是通过引用传递的。在方法内部更改引用不会反映到调用方法中的传入引用中。
  2. 整数是不可变的。没有像这样的方法Integer#set(i)。否则,您可以利用它。

要使其正常工作,您需要重新分配该inc()方法的返回值。

integer = inc(integer);

要了解有关按值传递的更多信息,这是另一个示例:

public static void main(String... args) {
    String[] strings = new String[] { "foo", "bar" };
    changeReference(strings);
    System.out.println(Arrays.toString(strings)); // still [foo, bar]
    changeValue(strings);
    System.out.println(Arrays.toString(strings)); // [foo, foo]
}
public static void changeReference(String[] strings) {
    strings = new String[] { "foo", "foo" };
}
public static void changeValue(String[] strings) {
    strings[1] = "foo";
}


 类似资料:
  • 问题内容: 您可以使用关键字“ ref”在.NET中进行操作。用Java有什么办法吗? 问题答案: 您正在用自己的方法做什么?如果仅填充现有数组,则不需要.NET或Java中的按引用传递语义。在这两种情况下,引用都将按值传递-因此对 对象的 更改将由调用者看到。这就像告诉某人您的住所地址,并要求他们向其提供物品-没问题。 如果您 确实 需要传递引用语义,即调用方将看到对参数本身所做的任何更改,例如

  • 问题内容: 这两个代码有什么区别: 代码A: 哪里 VS. 代码B: 这两个代码之间有什么区别吗? 问题答案: Java始终按值传递参数,而不按引用传递参数。 让我通过一个例子解释一下: 我将逐步解释这一点: 声明一个名为ftype 的引用,Foo并将其分配给Foo具有属性的type的新对象”f”。 从方法方面,声明Foo具有名称的类型引用,a并将其初始分配给null。 调用方法时changeRe

  • 问题内容: 通过此链接:如何通过引用传递变量?我们知道,Python在将字符串(作为不可变类型变量)作为参数传递给函数时会复制它,但是我认为如果字符串很大,它将浪费内存。在许多情况下,我们需要使用函数来包装一些字符串操作,所以我想知道如何使其更有效? 问题答案: Python不会复制传递给函数的对象(包括字符串): 如果您需要“修改”函数中的字符串,请返回新字符串并将其分配回原始名称: 不幸的是,

  • 问题内容: Python文档似乎尚不清楚参数是通过引用还是通过值传递,并且以下代码会产生未更改的值“原始” 我可以做些什么来通过实际引用传递变量吗? 问题答案: 传入的参数实际上是对对象的引用(但引用是通过值传递的) 有些数据类型是可变的,但有些则不是 所以: 如果将可变对象传递给方法,则该方法将获得对该对象的引用,并且可以对其进行突变,但是如果您将该引用重新绑定到该方法中,则外部作用域对此一无所

  • 我的程序显示一行水平滑动的按钮,其中包含艺术作品的文字描述。单击按钮时,ImageActivity启动以显示相应的艺术品。但是,当我点击任何文本按钮时,它总是显示数组中最后一幅画。 我试图将int ID传递给第二个活动,以便一旦单击相应的描述,它将显示正确的绘画。 非常感谢。 以下是我的主要活动: 我正在尝试将整数ID传递给: } 还有绘画数据库,我要从那里获取身份:

  • 问题内容: 我想知道在您仅读取变量时是否将其作为按引用传递的优良作法,还是应始终将其作为值传递。 引用传递示例: 传递值的示例: 哪个更好 ?例如,如果我要循环运行1000次? 循环示例: 问题答案: 如果您打算传递一个 值 (因此该函数不会对其进行修改) ,则没有理由通过引用传递它:这只会使您的代码更难以理解,因为人们会认为“ 此函数可以修改我将要修改的内容。传递给它-哦,它没有修改? ” 在您