包装类和java中的引用调用

时间:2013-12-27 17:16:00

标签: java

以下是我的代码:

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;
    System.out.println(i);
}

}

上述代码的输出是 12 12 但据我所知,我们传递包装器对象“i”,这意味着它应该是“按引用调用”,然后值应该更改为13.但是它的12。 有人对此有正确的解释吗?

5 个答案:

答案 0 :(得分:8)

引用按值传递,除此之外,整数为immutable

i传递给方法modify时,传递引用的值(引用是该方法的本地引用),当您为其分配另一个对象时,只修改该本地引用/变量持有参考。原件保持不变。

不可变意味着一旦创建/实例化了一个对象,就不可能再改变它的状态了。

答案 1 :(得分:3)

modify方法中的这行代码:

    i= i + 1;

正在使用Integer,而不是int。它执行以下操作:

  1. unbox i为int值
  2. 为该值添加1
  3. 将结果输入另一个Integer对象
  4. 将结果Integer分配给i(从而更改对象i引用)
  5. 由于对象引用是按值传递的,因此modify方法中的操作不会更改在modify调用中用作参数的变量。因此,在方法返回后,主例程仍然会打印12

    如果你想改变对象本身,你必须传递一个可变对象(正如其他人所提到的,Integer是不可变的),你必须调用mutator方法或直接修改字段。例如:

    class Demo{
        static class IntHolder {
            private int value;
            public IntHolder(int i) {
                value = i;
            }
            public IntHolder add(int i) {
                value += i;
                return this;
            }
            public String toString() {
                return String.valueOf(value);
            }
        }
        public static void main(String[] args) {
            IntHolder i = new IntHolder(12);
    
            System.out.println(i);
    
            modify(i);
    
            System.out.println(i);
    
        }
        private static void modify(IntHolder i) {
    
            i.add(1);
            System.out.println(i);
        }
    
    }
    

答案 2 :(得分:1)

包装类是不可变的,因此加法和减法等操作会创建一个新对象,而不是修改旧对象。

如果要通过引用传递基元,一种方法是传递单个元素数组:

int[] i= new int[1]{12};
...
private static void modify(int[] i) {

    i[0]= i[0] + 1;
    System.out.println(i[0]);
}

答案 3 :(得分:0)

Java始终是按值传递的。困难的是可以理解Java将对象作为引用传递,并且这些引用是按值传递的。

检查出来:

Is Java "pass-by-reference" or "pass-by-value"?

答案 4 :(得分:0)

检查我的eclipse它给出输出12 13 12.修改方法按值传递12然后i= i + 1;它添加一个。

package com.demo.swain;

public 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;
            System.out.println(i);
        }

        }

Output:12
       13
       12

enter image description here我强烈说这段代码不给出输出12,12。