A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林其荣 中级黑马   /  2013-1-15 22:16  /  1914 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 10:49 编辑

//值类型和引用类型的区别,有没有人能给详细解释下!
  1. public class b {
  2.   public static void main(String[] args) {
  3.    int[] a={7,5,3,2,6,8,1};
  4.    int k = 1;
  5.    String str = "bs";
  6.    b b = new b();
  7.    b.print(a,k,str);
  8.    b.selec(a,k,str);
  9.    b.print(a,k,str);
  10. }
  11.   
  12.   public void selec(int[] b,int k,String str){
  13.    for(int i=0;i<b.length;i++){
  14.     for(int j=i+1;j<b.length;j++){
  15.      if(b[i]>b[j]){
  16.       int temp = b[i];
  17.       b[i] = b[j];
  18.       b[j] = temp;
  19.      }
  20.     }
  21.    }
  22.    k = 10;
  23.    str = "as";
  24.   }
  25.   
  26.   public void print(int[] a,int k,String s){
  27.    for(int i=0;i<a.length;i++){
  28.     System.out.print(a[i]);
  29.    }
  30.    System.out.println();
  31.    System.out.println(k);
  32.    System.out.println(s);
  33.   }


  34. }
复制代码
我知道值类型是直接在栈中分配了一个空间,而引用类型是在堆中开辟了一个空间,然后把引用给了变量,但是我不明白的是我上面的代码,会出现这样的结果
7532681
1
bs
1235678
1
bs
第一行的输出是数组,属于引用类型,变化了,我可以理解;
第二行是int值类型,没有变化,也可以理解;
第三行的string是引用类型,为什么没有跟第一行的引用类型一样变化呢!这是我所不明白的。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
首先,值传递就是在栈中新建一个值,而引用传递则是创建一个引用的副本。也就是再栈中创建一个指向堆中的地址副本。值传递没有变化显而易见,是因为传的值是栈中新建的值,而引用传递则是方法前和方法中传递的引用共同指向一个堆中对象,所以当其中一个引用改变了对象的值,其他引用该对象的依然会变化,但是String是个特殊的类,由于其是一个final类,所以初始化值了后不会改变,而方法中的改变引用的值,其实是将引用指向的地址改变了,由于是显示赋值,所以是指向了字符串常量池中的地址。这也就是为什么打印的字符串没有变化的原因。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是String的特性之一,String类型是不可变的。
String虽然是引用类型,在selec方法中,在执行到23行之前,形参和实参str确实都是引用,并且都指向“bs”对象上。但是在执行到23行时,形参(也就是selec中的局部变量str)试图改变它所指向的String对象“bs”的值,前面说了String不可变,这个时候与其它的引用类型就不一样了。这是会创建一个新的String对象“as”,并且让形参str指向它。在这一步之后,形参和实参指向的对象就不一样了。实参任然是“bs”,而形参是“as”。方法结束后形参消失,局部变量释放。由于实参没变,即main中的str没变,它再一次传递给print方法的形参str。print中打印的当然是“bs”

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 arno942 于 2013-1-15 23:18 编辑

java只有值传递(对引用类型传的是地址的值)
public void selec(int[] b,int k,String str)中,
str是局部变量,函数执行完毕,str消失(在selec()执行的时候,传递的str与局部变量str的值是
一样的,所以指向同一个对象,但在后来局部变量str就重新赋值了,传递的str还是原来的)
所以对str根本就没有什么影响
String str = "bs"; 地址值 :1111
public void selec(int[] b,int k,String str){
     str = "as"; //"as"地址值:2222 ,
}
b.print(a,k,str);  //这个时候str还是地址值1111的这个  String str = "bs";

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马