java字符串基础问题

飞翔的乌龟 2014-04-21 05:22:49

public class Test{
String str=new String ("Girl");
char ch[]={'d','b','c'};
public static void main(String [] args){
Test x=new Test();
x.change(x.str,x.ch);
System.out.println(x.str+"and"+x.ch[0]+x.ch[1]+x.ch[2]);
}
public void change(String str,char ch[]){
str="Boy";
ch[0]='a';
}
}

最后输出结果为什么是Girl and abc,请各位大神详细解释一下,还有就是String 类字符串在创建后为什么不能被修改?
...全文
454 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔的乌龟 2014-04-22
  • 打赏
  • 举报
回复
引用 14 楼 u014602497 的回复:
[quote=引用 8 楼 u013533380 的回复:] [quote=引用 3 楼 u014602497 的回复:] 你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下[/quote] 定义①→Object(name="张三",age="22") (引用①指向Object(name="张三",age="22") )//上一条这里写错了。。。 change(②){ ②→Object(name="李四",age="55") } 调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。 定义①→Object(name="张三",age="22") change(②){ ②.age="12" } 这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object[/quote] 非常感谢,大神
fuxiaoshao 2014-04-22
  • 打赏
  • 举报
回复
引用 8 楼 u013533380 的回复:
[quote=引用 3 楼 u014602497 的回复:] 你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下[/quote] 定义①→Object(name="张三",age="22") (引用①指向Object(name="张三",age="22") )//上一条这里写错了。。。 change(②){ ②→Object(name="李四",age="55") } 调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。 定义①→Object(name="张三",age="22") change(②){ ②.age="12" } 这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object
fuxiaoshao 2014-04-22
  • 打赏
  • 举报
回复
引用 8 楼 u013533380 的回复:
[quote=引用 3 楼 u014602497 的回复:] 你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下[/quote] 定义①→Object(name="张三",age="22") (引用①指向"123") change(②){ ②→Object(name="李四",age="55") } 调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。 定义①→Object(name="张三",age="22") change(②){ ②.age="12" } 这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object
u010388171 2014-04-22
  • 打赏
  • 举报
回复
感觉就像是swap(int ,int) 与swap(int *,int *)的区别
穆哲 2014-04-22
  • 打赏
  • 举报
回复
引用 3 楼 u014602497 的回复:
你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
该楼的解释是对的,Java编程思想里面有提到过这个问题。
lasting00001 2014-04-22
  • 打赏
  • 举报
回复
只有传递引用值的才能通过修改形参的方式改变值
lasting00001 2014-04-22
  • 打赏
  • 举报
回复
Java的传值都是值传递,一种是传递常量值(8种原始数据类型和字符串),一种是传递引用值
kosora曹 2014-04-22
  • 打赏
  • 举报
回复
引用 16 楼 xiaopeipei2004 的回复:
记住java全部是值传递,无引用传递。 建议看本基础的书。
就是,凡是宣扬"Java有引用传递"的都是谬论.
grapepaul 2014-04-22
  • 打赏
  • 举报
回复
记住java全部是值传递,无引用传递。 建议看本基础的书。
u013330547 2014-04-22
  • 打赏
  • 举报
回复
值传递和地址传递问题,跟String没有关系,就算这里换成int或其他的数据类型,效果一样。值传递:不管怎么传,原来的实参的值都不会改变。地址传递,原来的实参的值可能被改变。 数组传递做的的是地址,所以'd'--->'a',String做的值传递,故原值出了方法就还原了。
-江沐风- 2014-04-21
  • 打赏
  • 举报
回复
引用 9 楼 lb8870931 的回复:
[quote=引用 1 楼 u012724379 的回复:] String生成的是常量,一旦生成,就无法改变了;
引用 4 楼 wlwlwlwl015 的回复:
因为String类在源码中定义的是final类型的。如果要修改的话JDK提供了很好用的StringBuffer和StringBuilder。
楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。 输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样[/quote] String 定义的字符串本身就是常量;
Z-ero 2014-04-21
  • 打赏
  • 举报
回复
引用 9 楼 lb8870931 的回复:
[quote=引用 1 楼 u012724379 的回复:] String生成的是常量,一旦生成,就无法改变了;
引用 4 楼 wlwlwlwl015 的回复:
因为String类在源码中定义的是final类型的。如果要修改的话JDK提供了很好用的StringBuffer和StringBuilder。
楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。 输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样[/quote] 层主理解错了,java的API文档里详细的说了:字符串是常量;它们的值在创建之后不能更改。这是JVM做的事情,自动给在定义字符串时添加了final来修饰。 楼主如果这样写就对了

public void change(String str, char ch[]) {
		this.str = "Boy";
		ch[0] = 'a';
	}
xiguanmzh 2014-04-21
  • 打赏
  • 举报
回复
改成这样: public void change(String str, char ch[]) { this.str = "Boy"; ch[0] = 'a'; } 这样就可以修改!
心塞的饺子 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 u012724379 的回复:
String生成的是常量,一旦生成,就无法改变了;
引用 4 楼 wlwlwlwl015 的回复:
因为String类在源码中定义的是final类型的。如果要修改的话JDK提供了很好用的StringBuffer和StringBuilder。
楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。 输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样
飞翔的乌龟 2014-04-21
  • 打赏
  • 举报
回复
引用 3 楼 u014602497 的回复:
你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下
飞翔的乌龟 2014-04-21
  • 打赏
  • 举报
回复
引用 5 楼 haozhongjun 的回复:
[quote=引用 3 楼 u014602497 的回复:] 你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
我感觉3楼说的就很对我可以再给你详细解释一下 传参传的都是复制了原来地址的一份引用当你操作str="Boy";时就相当于str=new String("Boy"); 引用被改变了已经指向了新的地址和原来的String没有关系了;当你操作ch[0]='a';时操作的是对象里的内存值内存被改变了所以ch对象再次操作时值就被改变了[/quote] 谢谢,解释的很详细
飞翔的乌龟 2014-04-21
  • 打赏
  • 举报
回复
引用 3 楼 u014602497 的回复:
你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
谢谢大神
haozhongjun 2014-04-21
  • 打赏
  • 举报
回复
引用 3 楼 u014602497 的回复:
你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
我感觉3楼说的就很对我可以再给你详细解释一下 传参传的都是复制了原来地址的一份引用当你操作str="Boy";时就相当于str=new String("Boy"); 引用被改变了已经指向了新的地址和原来的String没有关系了;当你操作ch[0]='a';时操作的是对象里的内存值内存被改变了所以ch对象再次操作时值就被改变了
小灯光环 2014-04-21
  • 打赏
  • 举报
回复
因为String类在源码中定义的是final类型的。如果要修改的话JDK提供了很好用的StringBuffer和StringBuilder。
fuxiaoshao 2014-04-21
  • 打赏
  • 举报
回复
你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
加载更多回复(2)

62,614

社区成员

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

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