日期:2014-05-20  浏览次数:20804 次

Java 引用类型的疑惑

public class JavaTest
{
private static void change(Integer i)
{
i = 3;
}

public static void main(String argv[])
{
Integer i = new Integer(1);
change(i);
System.out.println(i);
}
}

Integer不是引用类型吗,为何最终结果仍是输出1

------解决方案--------------------
看看Integer源码就明白了


/**
     * The value of the <code>Integer</code>.
     *
     * @serial
     */
    private final int value;

    /**
     * Constructs a newly allocated <code>Integer</code> object that
     * represents the specified <code>int</code> value.
     *
     * @param   value   the value to be represented by the 
     * <code>Integer</code> object.
     */
    public Integer(int value) {
this.value = value;
    }

------解决方案--------------------
首先给你一个肯定的答案:Java中引用类型的参数传递的是引用(即地址值),你所认知的是对的。
其次,你之所以问这个问题是因为你忽视了一点:

i = 3; // 请问这句话是什么过程?

i = 3; 是修改原对象的值为3呢?还是重新new了一个值为3的Integer对象,并修改i的引用地址?
其实这个问题huxiweng提供的源码已经给出答案了,Integer中过的value属性是final的。
所以答案只能是后者,即重新new了一个值为3的Integer对象,并修改i的引用地址。
如果你还怀疑的话你可以思考这么一个问题:

Integer a = new Integer(1);
Integer b = a; // 没错b和a同时指向一个对象
b = 3; // 这句话说明什么?他只是修改了b的引用,对a的值有影响吗?
System.out.println(a); // 你试试