• Tags
  •         
  • www.breakyizhan.com
  •    

    考虑下面的Java程序。

    // Java program to demonstrate that prmitive
    // wrapper classes are immutable
    class Demo
    {
        public static void main(String[] args)
        {
            Integer i = new Integer(12);
            System.out.println(i);
            modify(i);
            System.out.println(i);
        }
    
        private static void modify(Integer i)
        {
            i = i + 1;
        }
    }
    
    

    输出:

    12
    12

    参数i在修改中引用并引用与main()中的i相同的对象,但对i的更改未反映在main()中,为什么?

    说明:
    所有原始包装类(Integer,Byte,Long,Float,Double,Character,Boolean和Short)在Java中都是不可变的,因此加法和减法等操作会创建一个新对象而不会修改旧对象。

    modify方法中的下面一行代码在包装类Integer上运行,而不是int

    i = i + 1;

    它执行以下操作:

    1. Unbox i为int值
    2. 将1添加到该值
    3. 将结果存储到另一个Integer对象中
    4. 将生成的整数分配给i(从而更改我引用的对象)

    由于对象引用是按值传递的,因此在modify方法中采取的操作不会更改在修改调用中用作参数的i。因此,主程序在方法返回后仍然打印12。

     
    转载请保留页面地址:https://www.breakyizhan.com/java/5002.html