Java中值引用与地址引用

Java中数据类型分为基本类型和引用类型,如果还不清楚有哪些基本类型可以看这里的文章。

基本数据类型采用的是值传递,所谓值传递,也就是说当一个值赋给一个变量了之后,那么这个值就被存储于这个变量之中。

int a=5;    //声明一个整型变量a,并存储数值5
int b=a;    //声明一个整型变量b,并将a的值传递给b
b=6;    //将b的值更改为6

那么现在a中的值是多少?5还是6?答案是5。

原因在于Java中基本数据类型是值引用的,数值是存储在变量中的。声明变量a之后并将5赋给a,然后再将a的值赋给b。此时b已经存储5这个数值,但是和a中的互不干扰,改变任意一个变量的值并不会影响另外一个。这就是值引用。

那么在来看看地址引用。Java中除了基本数据类型之外都是地址引用。程序运行时,对象是被保存于内存中,而一个对象变量存储的是一个对象的地址。

String a=new String(“SoleilNeon”);
String b=a;
b=”Smigoo”;

此时a的值是什么?Soleilneon还是Smigoo。答案是Smigoo。

ref_show

String类型尽管经常被用到,但是却不是Java中的基本数据类型。因此,String类型采用的是地址引用。当创建了一个值为SoleilNeon的String对象后赋给了String类型的对象变量a,a中所存储的并不是值SoleilNeon,而是这个对象的地址。然后声明一个String类型的对象变量b,并把b的引用指向a,接着通过b更改字符串值,实际上更改的就是原来值为SoleilNeon的String对象。所以,最后a的值也被改写了。也就是说对象只有一个,而a和b引用的都是同一个对象,无论通过哪一个改变对象的值都会影响到其它的引用该对象的变量。

今天不算是什么新的内容,只是对已有的一个解释。

10 Comments

  1. 哈~~一对很恩爱的夫妻~~~
    还有。。不是我不想留言。。你这个太专业了。。。我都不知道要说什么~~

    Reply
  2. 哥,这个你试过没有啊
    String a=new String(“SoleilNeon”);
    String b=a;
    b=”Smigoo”;
    System.out.println(a);
    System.out.println(b);
    结果是
    SoleilNeon
    Smigoo

    Reply
  3. 好象是这样哦…
    因为java都是值调用,对象引用都是值传递
    1.构造一个名为a的String对象,值为SoleiNeon.
    2.定义了String类型的变量b,并赋了初值为SoleiNeon,这值是a的拷贝.
    3.最后再赋值给b,值为Smigoo.
    当String b=a;这个赋值方法结束后,就把a的拷贝给丢了…然后a还是引用之前的String对象,还是值为SoleiNeon…
    还是啊?老公…我感觉好象是这样的…
    我下自习了,今天重新看了下第四章,果然清晰多了

    Reply
    • 我很仔细的研究了一下书上所说的
      Java使用值调用,方法得到的是所有参数值的一个拷贝,并且方法不能修改传递给他的任何变量的内容。
      所以构造了一个String类型的对象a并赋值SoleilNeon
      之后将a赋给b,这时确实是a和b都引用值为SoleilNeon的对象
      但是在将b更改为Smigoo的时候,Java创建了一个参数值的拷贝,并修改了这个拷贝之后赋给b
      因此最终才导致两个变量的值不同
      我想这次应该没有错了…还是老婆看书仔细

      Reply

Leave a Comment.