A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程旦 中级黑马   /  2012-4-20 11:36  /  2252 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
运行结果是
Int value is:11
String value is:Hello
Obj value is:45.0
回复 使用道具 举报
个人理解:字符串被一次赋值之后就可以在整个程序中终身存在。创建字符串对象后它回去字符串池中去寻找,如果没有所定义的字符串,则会在池中出现。所以每定义一个String类型的引用变量也只能用这么一次。
回复 使用道具 举报
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”

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
String是一个很final类型,和普通引用类型不一样,是一种不可变类型。简单说,就是每个字符串都占据着一部分内存地址,并且它的值是不可改变的。Java运行时会维护一个String Pool(String池),String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。而楼主使用 str = new String("Hello");则会在内存的在堆区或栈区再创建一个对象,所以打印出来的还是Hello

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马