首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Integer对象是通过值而不是引用传递的?

为什么Integer对象是通过值而不是引用传递的?
EN

Stack Overflow用户
提问于 2021-04-21 11:35:33
回答 1查看 78关注 0票数 0

当我有一个更改对象的函数时,我期望对象的值在调用函数中发生变化(如Is Java “pass-by-reference” or “pass-by-value”中所描述的,因为引用没有被更改)。但它似乎不适用于包装类(如Integer)。

以下代码:

代码语言:javascript
复制
public class Test
{
    private static class MyInt
    {
        private int i;
        public MyInt(int i)
        {
            this.i = i;
        }
        public int get()
        {
            return i;
        }
        public void set(int i)
        {
            this.i = i;
        }
        public void increment()
        {
            ++this.i;
        }
        public String toString()
        {
            return Integer.toString(i);
        }

    }

    public static void test(int a, Integer b, MyInt c)
    {
        ++a;
        ++b;
        System.out.println("b after increment is " + b);
        c.increment();
    }

    public static void main(String[] args)
    {
        int a = 5;
        Integer b = new Integer(5);
        MyInt c = new MyInt(5);

        test(a, b, c);

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

生成以下输出:

代码语言:javascript
复制
b after increment is 6
5
5
6

从中我可以看到,Integer对象实际上在函数内部发生了变化,变为6,但它并没有改变bmain中的值。这里发生了什么事?包装器对象是否以常规对象以外的其他方式传递?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-21 11:35:33

当一个人做以下几行时所发生的事情实际上与你所期望的不同:

代码语言:javascript
复制
Integer b = Integer.valueOf(5);
System.out.println("code of b is " + System.identityHashCode(b));
++b;
System.out.println("code of b is " + System.identityHashCode(b));

从增量后的输出可以看出,b实际上指向的是不同的对象,而不是改变现有对象中的内部值。

因此,++运算符可以用与c.increment()不同的代码行近似,而应该编写c = new MyInt(c.get() + 1);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67195080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档