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是引用类型,为什么没有跟第一行的引用类型一样变化呢!这是我所不明白的。

解决方案 »

  1.   

    函数是值传递,即当你传递S的引用的时候,栈产生一个副本S1,保存S的值,当你执行 s = "asasasasass"的时候,其实是对S1进行操作,指向 "asasasasass"这个对象,S本身并没有改变。有点像C语言的指针一样。
      

  2.   


    那为什么数组会变化呢。如果按照这个理解的话,不应该是数组也产生了一个副本,然后main方法中的数组也不会变么,有点绕,不太懂。
      

  3.   

    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属于局部的变量,只修改了局部变量的值,对你的成员变量没有  影响!所以你在输出的时候没有改变!
      }
      

  4.   

    那为什么数组会变化呢。如果按照这个理解的话,不应该是数组也产生了一个副本,然后main方法中的……
     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";
      }
      

  5.   

     public void selectionSort(int[] b,int k,String s){//此处传递b是数组引用
    //此处是通过下标访问内存中的对象,要弄清楚,b是一个引用,b[i]是通过引用找到的具体对象,不是副本。
    /*
    如果你这么……有点明白了,虽然不是很透彻,但是打算做几个小例子,继续巩固下!!谢谢你哈!