标题:简单小题,请指教!
只看楼主
机智羊
Rank: 1
等 级:新手上路
帖 子:5
专家分:4
注 册:2016-5-20
结帖率:100%
已结贴  问题点数:20 回复次数:11 
简单小题,请指教!
public class Show {
    String str = new String ("good");
    char[] ch = {'a','b','c'};
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Show show = new Show();
        show.change(show.str, show.ch);
        System.out.print(show.str+" and ");
        System.out.print(show.ch);

    }
    public void change(String str,char ch[]){
        str = "test ok";
        ch[0] = 'g';
    }
}

 为什么运行的结果中str不是test ok 而是原来的good?
搜索更多相关主题的帖子: public change method 
2016-06-06 17:00
TsugumiYuu
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:32
专家分:126
注 册:2016-5-14
得分:15 
说一下个人理解,同新人,思考得出的结论
觉得是字符串不可更改的特性,可以参阅一下String的值传递(总结一下就是1java没有引用传递,任何传递都是值传递
2、String里面是个常量,给String重新赋值不会改变那个常量,也不会在你的方法中传递改变的值),good是一个值,
change方法里的str实际是另外一个值
如果你想替代应该str = "test ok";下写this.str =str;或者写String str1="test ok";this.str=str1;就OK了
有没有大神可以解释的更完善一点,新人回答不对见谅

[此贴子已经被作者于2016-6-6 22:44编辑过]

2016-06-06 22:35
zzjvslove
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:46
专家分:197
注 册:2016-5-23
得分:5 
java是引用传递、传递的地址、就像C语言的指针一个道理。
在show类中定义了str字符串、和ch[0],ch[1],ch[2]、在内存地址开辟了各个对应的字符空间,
ch[0]地址指向字符'c'、str地址指向'good'。

定义了change()方法、把以上两个参数地址传入。
在change()函数体内又在地址上开辟了'tesk ok'和'g'、字符的地址。开辟的是新地址、因为字符的值是无法改善的(除非使用StringBuffer)。
然后在函数体内、改变了str和ch[0]的地址指向。
即把str的地址指向原指向是good, 现在指向 tesk ok所在的地址。原good的地址因为没有引用了、就等待垃圾来回收。此函数返回的是空值。

在main函数内中的str地址还是指向'good'、ch[0]也是指向'a'。因为他未发生地址传递,仍旧指向的是'good'和'a'的地址,即还是原来的值。

收到的鲜花
  • 机智羊2016-06-10 13:42 送鲜花  3朵   附言:我很赞同
2016-06-07 09:09
zzjvslove
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:46
专家分:197
注 册:2016-5-23
得分:0 
也就是说、change()内的变量str是指向"test ok"、而main()函数的str变量是指向'good'的。
两个变量使用域不同。
2016-06-07 09:21
TsugumiYuu
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:32
专家分:126
注 册:2016-5-14
得分:0 
回复 4楼 zzjvslove
能否理解为两个str相当于两个人同名不同人,指向不同所以不能够进行替换
2016-06-07 12:45
zzjvslove
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:46
专家分:197
注 册:2016-5-23
得分:0 
回复 5楼 TsugumiYuu
哈哈、这个回复幽默。不过从某个立场上也可以这样说。
2016-06-07 17:48
机智羊
Rank: 1
等 级:新手上路
帖 子:5
专家分:4
注 册:2016-5-20
得分:0 
回复 2楼 TsugumiYuu
谢谢你!
2016-06-10 13:40
平常心q
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:120
专家分:550
注 册:2016-3-31
得分:0 
String str = "good";
str = str.replaceAll(str, "test ok");
System.out.print(str+" and ");
这就可以了吧,都是新手,一起学习
2016-06-11 15:59
qitengfei746
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-7-6
得分:0 
回复 3楼 zzjvslove
我觉得你关于地址指向说得很好,但我觉得程序中只有String是引用类型,字符串不能修改,在非静态方法中创建的新地址没有保存,所以其值未改变,str依然指向good;而char作为基本类型,在change方法中是直接改变变量存储的值的,并未创建新地址,所以ch[0]的修改是有效的
2016-07-06 20:00
cylin
Rank: 1
等 级:新手上路
威 望:1
帖 子:3
专家分:7
注 册:2016-7-11
得分:0 
String是本身是final,是指String指针指向的内存地址中的内容不能被修改
2016-07-12 10:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465653-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.108060 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved