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

值类型和引用类型的区别,有没有人能给详细解释下!
public class Test {
 public static void main(String[] args) {
  int[] a={2,5,3,9,8,1,6};
  int k = 1;
  String s = "as";
  
  Test test = new Test();
  
  test.print(a,k,s);
  
  test.selectionSort(a,k,s);
  
  test.print(a,k,s);

 
 }
 
 public void selectionSort(int[] b,int k,String s){
  for(int i=0;i<b.length;i++){
   for(int j=i+1;j<b.length;j++){
    if(b[i]>b[j]){
     int temp = b[i];
     b[i] = b[j];
     b[j] = temp;
    }
   }
  }
  
  k = 10;
  s = "asasasasass";
 }
 
 public void print(int[] a,int k,String s){
  for(int i=0;i<a.length;i++){
   System.out.print(a[i]);
  }
  System.out.println();
  System.out.println(k);
  System.out.println(s);
 }

 
}
我明白值类型是直接在栈中分配了一个空间,而引用类型是在堆中开辟了一个空间,然后把引用给了变量,但是我不明白的是我上面的代码,会出现这样的结果
2539816
1
as
1235689
1
as
第一行的输出是数组,属于引用类型,变化了,我可以理解;
第二行是int值类型,没有变化,也可以理解;
第三行的string是引用类型,为什么没有跟第一行的引用类型一样变化呢!这是我所不明白的。
------最佳解决方案--------------------
那为什么数组会变化呢。如果按照这个理解的话,不应该是数组也产生了一个副本,然后main方法中的……[/quote]
 public void selectionSort(int[] b,int k,String s){//此处传递b是数组引用
//此处是通过下标访问内存中的对象,要弄清楚,b是一个引用,b[i]是通过引用找到的具体对象,不是副本。
/*
如果你这么写:
b = new int [5];
for(int i=0; i<b.length; i++){
b[i] = i ;
}
就能看出区别了
*/
   for(int i=0;i<b.length;i++){
    for(int j=i+1;j<b.length;j++){
     if(b[i]>b[j]){
      int temp = b[i];
      b[i] = b[j];
      b[j] = temp;

     }
    }
   }
   
   k = 10;
   s = "asasasasass";
  }
------其他解决方案--------------------
函数是值传递,即当你传递S的引用的时候,栈产生一个副本S1,保存S的值,当你执行 s = "asasasasass"的时候,其实是对S1进行操作,指向 "asasasasass"这个对象,S本身并没有改变。有点像C语言的指针一样。
------其他解决方案--------------------
public void selectionSort(int[] b,int k,String s){
   for(int i=0;i<b.length;i++){
    for(int j=i+1;j<b.length;j++){
     if(b[i]>b[j]){
      int temp = b[i];
      b[i] = b[j];
      b[j] = temp;
     }
    }
   }
   
   k = 10;
   s = "asasasasas";//在这之中,你的s属于局部的变量,只修改了局部变量的值,对你的成员变量没有  影响!所以你在输出的时候没有改变!