注册 登录
编程论坛 JAVA论坛

简单小题,请指教!

机智羊 发布于 2016-06-06 17:00, 5199 次点击
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?
11 回复
#2
TsugumiYuu2016-06-06 22:35
说一下个人理解,同新人,思考得出的结论
觉得是字符串不可更改的特性,可以参阅一下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编辑过]

#3
zzjvslove2016-06-07 09:09
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'的地址,即还是原来的值。

#4
zzjvslove2016-06-07 09:21
也就是说、change()内的变量str是指向"test ok"、而main()函数的str变量是指向'good'的。
两个变量使用域不同。
#5
TsugumiYuu2016-06-07 12:45
回复 4楼 zzjvslove
能否理解为两个str相当于两个人同名不同人,指向不同所以不能够进行替换
#6
zzjvslove2016-06-07 17:48
回复 5楼 TsugumiYuu
哈哈、这个回复幽默。不过从某个立场上也可以这样说。
#7
机智羊2016-06-10 13:40
回复 2楼 TsugumiYuu
谢谢你!
#8
平常心q2016-06-11 15:59
String str = "good";
str = str.replaceAll(str, "test ok");
System.out.print(str+" and ");
这就可以了吧,都是新手,一起学习
#9
qitengfei7462016-07-06 20:00
回复 3楼 zzjvslove
我觉得你关于地址指向说得很好,但我觉得程序中只有String是引用类型,字符串不能修改,在非静态方法中创建的新地址没有保存,所以其值未改变,str依然指向good;而char作为基本类型,在change方法中是直接改变变量存储的值的,并未创建新地址,所以ch[0]的修改是有效的
#10
cylin2016-07-12 10:17
String是本身是final,是指String指针指向的内存地址中的内容不能被修改
#11
a10436352232016-09-11 12:10

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

这样试一试
1