黑马程序员技术交流社区

标题: 引用类型做参数的问题 [打印本页]

作者: 程旦    时间: 2012-4-20 11:36
标题: 引用类型做参数的问题
  1. public class PassTest {
  2.         float ptValue;

  3.         public void changeInt(int value) {
  4.                 value = 23;
  5.         }

  6.         public void changeStr(String value) {
  7.                 value = new String("change");
  8.         }

  9.         public void changeObj(PassTest pt) {
  10.                 pt.ptValue = 45.0f;
  11.                
  12.         }

  13.         public static void main(String[] args) {

  14.                 String str;
  15.                 int val;
  16.                 PassTest pt = new PassTest();
  17.                 // 测试基本类型参数的传递
  18.                 val = 11;
  19.                 pt.changeInt(val);
  20.                 System.out.println("Int value is:" + val);
  21.                 // 测试引用类型(字符串)参数的传递
  22.                 str = new String("Hello");
  23.                 pt.changeStr(str);
  24.                 System.out.println("String value is:" + str);
  25.                 // 测试引用类型(对象类型)参数的传递
  26.                 pt.ptValue = 77.0f;
  27.                 pt.changeObj(pt);
  28.                 System.out.println("Obj value is:" + pt.ptValue);

  29.         }

  30. }
复制代码
此题的结果很让我迷惑 第一 第三个我知道  就是字符串不也和对象一样吗 不也传递的是自己的引用(即地址)为什么对象就能改变原来的值 而字符串却没有呢????



作者: 程旦    时间: 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