Java 引用类型的疑惑

ouroborossinn 2014-01-09 11:13:48

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
...全文
191 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
花木兰1闪21A 2014-01-10
  • 打赏
  • 举报
回复
引用 7 楼 Q80470101 的回复:
首先给你一个肯定的答案: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); // 你试试
你说的没错,不过你举的例子和楼主的不太一样,有一点我不明白,比如说在change中i=3是i=new Integer(3);也就是说这是i是指向3的,这个方法走完后,这个值是3的Integer应该会被回收,也就是没用到的,问题是之后i值为什么又可以指向1了,它这个过程是怎么回事?
家里敷泥呀 2014-01-10
  • 打赏
  • 举报
回复
引用 12 楼 tlfu_12344 的回复:
[quote=引用 7 楼 Q80470101 的回复:] 首先给你一个肯定的答案: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); // 你试试
你说的没错,不过你举的例子和楼主的不太一样,有一点我不明白,比如说在change中i=3是i=new Integer(3);也就是说这是i是指向3的,这个方法走完后,这个值是3的Integer应该会被回收,也就是没用到的,问题是之后i值为什么又可以指向1了,它这个过程是怎么回事?[/quote] 你需要理清楚,main中的i和change中的i是两个i,change方法里改变的是自己的i,main中的i就压根没变,所以不存在重新指向的问题。你试着画画内存图,理解理解。
家里敷泥呀 2014-01-09
  • 打赏
  • 举报
回复
首先给你一个肯定的答案: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); // 你试试
ouroborossinn 2014-01-09
  • 打赏
  • 举报
回复
引用 5 楼 heaimnmn 的回复:

Integer i = new Integer(1);
private static void change(Integer i)
    {
        i = 3;
    }
     
    public static void main(String argv[])
    {
        change(i);
        System.out.println(i);
    }
你这样写就是3了
我想知道的是Java中引用类型的函数传递是怎样的?
哎,真难 2014-01-09
  • 打赏
  • 举报
回复

Integer i = new Integer(1);
private static void change(Integer i)
    {
        i = 3;
    }
     
    public static void main(String argv[])
    {
        change(i);
        System.out.println(i);
    }
你这样写就是3了
ouroborossinn 2014-01-09
  • 打赏
  • 举报
回复
引用 1 楼 fudongrifdr 的回复:
值传递。。。
引用类型传递的不是实例对象的引用吗?
ouroborossinn 2014-01-09
  • 打赏
  • 举报
回复
引用 2 楼 huxiweng 的回复:
看看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;
    }
也就是说,value属性是final,不允许更改?
teemai 2014-01-09
  • 打赏
  • 举报
回复
看看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;
    }
末日哥 2014-01-09
  • 打赏
  • 举报
回复
值传递。。。
锅盖头 2014-01-09
  • 打赏
  • 举报
回复
[quote=引用 7 楼 Q80470101 的回复:] 首先给你一个肯定的答案:Java中引用类型的参数传递的是引用(即地址值),你所认知的是对的。 其次,你之所以问这个问题是因为你忽视了一点:

i = 3; // 请问这句话是什么过程?
i = 3; 是修改原对象的值为3呢?还是重新new了一个值为3的Integer对象,并修改i的引用地址? 其实这个问题huxiweng提供的源码已经给出答案了,Integer中过的value属性是final的。 所以答案只能是后者,即重新new了一个值为3的Integer对象,并修改i的引用地址。 如果你还怀疑的话你可以思考这么一个问题: Java中参数传递的都是值,对应基本类型,传递的是原值的拷贝;对于类类型,传递的是引用即地址的拷贝. 对于函数对参数的改变是否会影响原值的问题:值类型自然不会影响到原值.而对于类类型要看改变的是参数的地址还是值,如果是前者,参数和原引用指向了不同的地址,它们自然脱离了关系;如果是后者,修改的实例就是原引用指向的实例,这当然对原值进行了修改.
  • 打赏
  • 举报
回复
得,看这样lz还是没懂。。。感觉他们解释的都没错啊,只是解释的出发点不同而已
ouroborossinn 2014-01-09
  • 打赏
  • 举报
回复
引用 8 楼 heaimnmn 的回复:
怎么和你解释了,你在一个局部main函数中定义了一个i,并且赋值1,你把这个i传到change这个方法里面,因为i是局部变量,change里面用的是值传递,i=3,这个赋值其实是赋值了change(Integer i)里面这个i的值,而main函数里面的i其实没有改变,而我写的那样是全局变量,所以change传的引用传递,所以就改变了,do you understand?其实我都不知道我说些啥,反正就那样,,,
看你楼上,并不是值传递。
哎,真难 2014-01-09
  • 打赏
  • 举报
回复
怎么和你解释了,你在一个局部main函数中定义了一个i,并且赋值1,你把这个i传到change这个方法里面,因为i是局部变量,change里面用的是值传递,i=3,这个赋值其实是赋值了change(Integer i)里面这个i的值,而main函数里面的i其实没有改变,而我写的那样是全局变量,所以change传的引用传递,所以就改变了,do you understand?其实我都不知道我说些啥,反正就那样,,,

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧