代码改变世界

Java引用与地址盲点

2013-04-17 23:46  Polarisary  阅读(344)  评论(0编辑  收藏  举报

一直以为Java中引用和地址是一个概念,容易混淆,下面的小程序让我加深了对引用的理解。

public class Test
{
    public static void main(String[] args){
        Test t  = new Test();
        t.amethod();
    }

    public void amethod(){
        int i=99;
        ValHold v = new ValHold();
        v.i=30;
        another(v,i);
        System.out.println(v.i);
    }
    public void another(ValHold v,int i){
        i=0;
        v.i=20;
        ValHold vh = new ValHold();
        v=vh;
        System.out.println(v.i+" "+i);
    }
    class ValHold{
        int i = 10;
    }
}

之前以为会打印10 0 \n 10,结果如下:

在amethod()方法调用another()方法的v=vh之前,amethod方法把v的引用的值传给了another方法中的v(其实可以是ValHold类型的任何名称),这样another方法中所有对v的操作都会修改amethod中v的指向的对象。所以第二行打印20,然后v=vh,把v指向了新的地址了(新对象),所以第一行打印10 0,此时amethod中的v和another中的v不是同一个引用,another中的v只在其方法块内是有效的,但amethod中的v仍然指向原来的对象地址。

对象引用变化如下: