值类型和引用类型的区别,有没有人能给详细解释下!
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属于局部的变量,只修改了局部变量的值,对你的成员变量没有 影响!所以你在输出的时候没有改变!