黑马程序员技术交流社区
标题:
值类型和引用类型
[打印本页]
作者:
林其荣
时间:
2013-1-15 22:16
标题:
值类型和引用类型
本帖最后由 张向辉 于 2013-1-16 10:49 编辑
//值类型和引用类型的区别,有没有人能给详细解释下!
public class b {
public static void main(String[] args) {
int[] a={7,5,3,2,6,8,1};
int k = 1;
String str = "bs";
b b = new b();
b.print(a,k,str);
b.selec(a,k,str);
b.print(a,k,str);
}
public void selec(int[] b,int k,String str){
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;
str = "as";
}
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);
}
}
复制代码
我知道值类型是直接在栈中分配了一个空间,而引用类型是在堆中开辟了一个空间,然后把引用给了变量,但是我不明白的是我上面的代码,会出现这样的结果
7532681
1
bs
1235678
1
bs
第一行的输出是数组,属于引用类型,变化了,我可以理解;
第二行是int值类型,没有变化,也可以理解;
第三行的string是引用类型,为什么没有跟第一行的引用类型一样变化呢!这是我所不明白的。
作者:
王阳
时间:
2013-1-15 22:58
首先,值传递就是在栈中新建一个值,而引用传递则是创建一个引用的副本。也就是再栈中创建一个指向堆中的地址副本。值传递没有变化显而易见,是因为传的值是栈中新建的值,而引用传递则是方法前和方法中传递的引用共同指向一个堆中对象,所以当其中一个引用改变了对象的值,其他引用该对象的依然会变化,但是String是个特殊的类,由于其是一个final类,所以初始化值了后不会改变,而方法中的改变引用的值,其实是将引用指向的地址改变了,由于是显示赋值,所以是指向了字符串常量池中的地址。这也就是为什么打印的字符串没有变化的原因。
作者:
罗会涛
时间:
2013-1-15 23:09
这是String的特性之一,String类型是不可变的。
String虽然是引用类型,在selec方法中,在执行到23行之前,形参和实参str确实都是引用,并且都指向“bs”对象上。但是在执行到23行时,形参(也就是selec中的局部变量str)试图改变它所指向的String对象“bs”的值,前面说了String不可变,这个时候与其它的引用类型就不一样了。这是会创建一个新的String对象“as”,并且让形参str指向它。在这一步之后,形参和实参指向的对象就不一样了。实参任然是“bs”,而形参是“as”。方法结束后形参消失,局部变量释放。由于实参没变,即main中的str没变,它再一次传递给print方法的形参str。print中打印的当然是“bs”
作者:
夏振博
时间:
2013-1-15 23:14
本帖最后由 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";
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2