String取值

cpisapple 2011-05-16 07:00:08
public class Example{
String str=new String("hello");
char ch[]={'d','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.println(ex.str+"and"+ex.ch[0]);
}
public void change(String str,char ch[]){
str ="world";
ch[0]= 'a';
}
}

结果是helloanda
为什么不是worldanda ? 难道不能通过引用改变字符窜的值吗
...全文
252 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yujixi123 2011-05-18
  • 打赏
  • 举报
回复
画内存分配图
Ranbo 2011-05-16
  • 打赏
  • 举报
回复
另外,String类型的变量一旦赋值是不能改变的
Ranbo 2011-05-16
  • 打赏
  • 举报
回复
如果你在change方法中打印就是你要答案
cpisapple 2011-05-16
  • 打赏
  • 举报
回复
谢谢大家了 我已经搞清楚了

关于Java栈与堆的思考 http://soft.yesky.com/SoftChannel/72342371961929728/20050218/1912444.shtml
zhu6100441 2011-05-16
  • 打赏
  • 举报
回复
传值还是传地址,这个得先弄明白!~
darkor 2011-05-16
  • 打赏
  • 举报
回复
str="hello";这个语句创建了两个字符串对象,str和“hello”,str指向“hello”。而在change()中,它创立了另外一个字符串对象,虽然也命名为str,但与之前的str是不同的对象,为方便说明暂且称其为str1,str1也指向“hello”。当执行str1=“world”之后,str1指向“world”了,而之前的str仍指向“hello”,所以在main()中打印的仍是“hello”。可能表达不清,但大概如此
cpisapple 2011-05-16
  • 打赏
  • 举报
回复
这里看看
http://www.iteye.com/topic/12961#75324

str ="world";只有对参数的 赋值,没有对参数的操作,当然不会产生影响。
把str ="world"; 改成 this.str ="world"; 结果就是world了
传递的参数“值” 会在 函数当前运行栈上 复制一份。所有的 操作和赋值 都是对那个 参数“值”副本 进行的。操作能够 改变成员变量,因为参数“值”副本 是一个 地址,能够正确指向成员变量的位置。而赋值 则根本没用,因为只是改变了当前函数栈内 参数“值”副本 的内容,而没有改变上一层函数栈内的 对应“值”。
l98766666 2011-05-16
  • 打赏
  • 举报
回复
之前这东西我也没理解透,现在也不知道理解透了没...至少我是这样理解的,说不清楚写程序验证就是了!
我是用传值和传址来理解,你们可以用自己方式去理解!
l98766666 2011-05-16
  • 打赏
  • 举报
回复
change1前者,change2后者;前者不变,后者变。前者指向新地址,原地址不变,所以值是不变的;后者是把原地址所指的数据值改变了,所以值变了!


基本数据类型及其对应的封装类和String都只是传值,数组是传址
这句话改为基本数据类型传值,类和数组是传址
l98766666 2011-05-16
  • 打赏
  • 举报
回复
public class Example {
MyString str = new MyString("hello");
char ch[] = { 'd', 'b', 'c' };

public static void main(String args[]) {
Example ex = new Example();
ex.change1(ex.str, ex.ch);
ex.print();
ex.change2(ex.str, ex.ch);
ex.print();
}

public void change1(MyString str, char ch[]) {
str = new MyString("world");
ch[0] = 'a';
}

public void change2(MyString str, char ch[]) {
str.setStr("world");
ch[0] = 'a';
}

public void print(){
System.out.println(str.toString()+"and"+ch[0]);
}
private class MyString{
private String s;
public MyString(String s){
this.s=s;
}
public void setStr(String s){
this.s=s;
}
public String toString(){
return s;
}
}
}
dding_inshili 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 l98766666 的回复:]
哎,我也没说是指针啊,只是说传地址...
[/Quote]
那地址是什么, 回答我?
hepeng_8 2011-05-16
  • 打赏
  • 举报
回复
基本数据类型及其对应的封装类和String都只是传值,数组是传址 有点懂但是不是很清楚……
好好看 主义思想
l98766666 2011-05-16
  • 打赏
  • 举报
回复
java里还是有类似于指针的概念的,有空还是去看看指针这东西吧,对学java数据结构有帮助的!java里的类自递归这东东就像是...哎,不说了!!!
l98766666 2011-05-16
  • 打赏
  • 举报
回复
哎,我也没说是指针啊,只是说传地址...
24K純帥 2011-05-16
  • 打赏
  • 举报
回复
JAVA是木有指针滴
  • 打赏
  • 举报
回复
java说是没有补过跟指针功能相似的貌似有很多 只是不叫指针而已
dding_inshili 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 l98766666 的回复:]
其实这类似swap(int a,int b){int temp=a;a=b;b=temp;}你调用这个函数是不能实现a和b的值交换
c/c++中swap(int &a,int &b){int temp=a;a=b;b=temp;} 就是传值和传址的问题,基本数据类型及其对应的封装类和String都只是传值,数组是传址
[/Quote]
害过我之后, 还要到这里面来害别人, 楼主, 别听他的, 你听过java指针吗???
l98766666 2011-05-16
  • 打赏
  • 举报
回复
ex.ch是一个数组,在调用change(String str,char ch[])时把整个数组引用过来,也就是什么你可以对第进行修改删除等操作,而ex.str相当于我给你这值,你知道这个值是什么东西,可以拿来用,但你作的任何操作原数值都不会改变
cpisapple 2011-05-16
  • 打赏
  • 举报
回复
基本数据类型及其对应的封装类和String都只是传值,数组是传址 有点懂但是不是很清楚……
l98766666 2011-05-16
  • 打赏
  • 举报
回复
其实这类似swap(int a,int b){int temp=a;a=b;b=temp;}你调用这个函数是不能实现a和b的值交换
c/c++中swap(int &a,int &b){int temp=a;a=b;b=temp;} 就是传值和传址的问题,基本数据类型及其对应的封装类和String都只是传值,数组是传址

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧