黑马程序员技术交流社区
标题:
引用类型做参数的问题
[打印本页]
作者:
程旦
时间:
2012-4-20 11:36
标题:
引用类型做参数的问题
public class PassTest {
float ptValue;
public void changeInt(int value) {
value = 23;
}
public void changeStr(String value) {
value = new String("change");
}
public void changeObj(PassTest pt) {
pt.ptValue = 45.0f;
}
public static void main(String[] args) {
String str;
int val;
PassTest pt = new PassTest();
// 测试基本类型参数的传递
val = 11;
pt.changeInt(val);
System.out.println("Int value is:" + val);
// 测试引用类型(字符串)参数的传递
str = new String("Hello");
pt.changeStr(str);
System.out.println("String value is:" + str);
// 测试引用类型(对象类型)参数的传递
pt.ptValue = 77.0f;
pt.changeObj(pt);
System.out.println("Obj value is:" + pt.ptValue);
}
}
复制代码
此题的结果很让我迷惑 第一 第三个我知道 就是字符串不也和对象一样吗 不也传递的是自己的引用(即地址)为什么对象就能改变原来的值 而字符串却没有呢????
作者:
程旦
时间:
2012-4-20 11:46
运行结果是
Int value is:11
String value is:Hello
Obj value is:45.0
作者:
zhaishuang
时间:
2012-4-20 12:01
个人理解:字符串被一次赋值之后就可以在整个程序中终身存在。创建字符串对象后它回去字符串池中去寻找,如果没有所定义的字符串,则会在池中出现。所以每定义一个String类型的引用变量也只能用这么一次。
作者:
奥特曼爱小怪兽
时间:
2012-4-20 12:09
public void changeStr(String value) {
09. value = new String("change");
10. }
String str;
str = new String("Hello");
pt.changeStr(str);
对于传递进来的参数str,在临时区域创建一个String 引用,指向字符串数值区的“Hello”
所以方法执行后只是将临时区域的string引用指向了字符串数值区的“change”
而str引用依然指向“Hello”
作者:
陈坚
时间:
2012-4-20 12:22
String是一个很final类型,和普通引用类型不一样,是一种不可变类型。简单说,就是每个字符串都占据着一部分内存地址,并且它的值是不可改变的。Java运行时会维护一个String Pool(String池),String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。而楼主使用
str = new String("Hello");则会在内存的在堆区或栈区再创建一个对象,所以打印出来的还是Hello
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2