【菜鸟求助】以下代码的输出结果。。。

books1958 2013-03-31 09:33:17
public class AboutStr {
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String[] args) {
AboutStr ex=new AboutStr();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.println(ex.ch);
}
public void change(String str,char[] ch1){
str="text ok";
ch1[0]='g';
}

}

为什么输出结果是 good and gbc 呢?
...全文
351 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
books1958 2013-04-02
  • 打赏
  • 举报
回复
问题已解决,结贴。
GeekZFZ 2013-04-01
  • 打赏
  • 举报
回复
引用 11 楼 books1958 的回复:
引用 6 楼 fengzhou0920 的回复: 以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如: Java code ? 12345678 public static void main(String[] args……
是的,java和c语言里面的指针相似,都是传值,基本类型直接传递值本身,非基本类型传递对象的地址值,String是非基本类型,为final类,不可以修改,你通过a = "123"相当于直接修改其地址,并非它所具有的的属性,对源对象不产生影响;而其他的非基本类型比如StringBuffer,其通过append等方法修改内部属性value,当然会影响源对象,其都是浅拷贝,只是拷贝了对象本身的地址,并未对对象的属性进行深层次拷贝。 你可以在编辑框上面一排看看,可以调整格式,各种语言的格式都可以设置
草帽小子_DJ 2013-04-01
  • 打赏
  • 举报
回复
str是传值,chr[]是引用,str虽然在方法中改变但不能返回给实参,方法结束后等待销毁,而chr[]是引用传值,方法中的操作就是对实参的操作!
books1958 2013-04-01
  • 打赏
  • 举报
回复
引用 6 楼 fengzhou0920 的回复:
以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如: Java code ? 12345678 public static void main(String[] args) throws IOException { c……
另外问一下,为什么你的代码放在上面是那种比较规范的格式而且左边有行数啊?
books1958 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 coolboyyzy 的回复:
第一个传的是值,第二个传的引用,指向同一个对象,改了就改了
明白了,谢谢哦!
books1958 2013-04-01
  • 打赏
  • 举报
回复
引用 6 楼 fengzhou0920 的回复:
以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如: Java code ? 12345678 public static void main(String[] args) throws IOException { c……
哦,明白了。 ex.ch变了就好比A和B都指向C,然后A改变了C的具体值,所以导致B的具体值也发生了变化。 而 ch1=null 就好比把A指向另外一个地址,所以不影响B的值。 是这么理解的么?
失落夏天 2013-04-01
  • 打赏
  • 举报
回复
引用 3 楼 books1958 的回复:
引用 1 楼 AA5279AA 的回复:很正常啊。这就是新手经常犯的错 public void change(String str,char[] ch1){ str="text ok"; ch1[0]='g'; } 这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有……
\ 字符串传的是值,但是数组传的是对象。。。就这样。。。 搞清传对象还是传值就行了
Cute_Tiger 2013-04-01
  • 打赏
  • 举报
回复
引用 2 楼 books1958 的回复:
我主要不明白的是,为什么ex.ch的值变了?
ch1[0]='g'; 这个就是将'g'赋值给ch1[0],ch1[0]是char[] ch={'a','b','c'}数组里面的第一个'a',这样'g'把'a'覆盖了,ch[] ch 就变成{'g','b','c'}了,有什么不明白的
菜鸟级高手 2013-03-31
  • 打赏
  • 举报
回复
第一个传的是值,第二个传的是ch的首地址
百八烦恼风 2013-03-31
  • 打赏
  • 举报
回复
第一个传的是值,第二个传的引用,指向同一个对象,改了就改了
GeekZFZ 2013-03-31
  • 打赏
  • 举报
回复
以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如:
	public static void main(String[] args) throws IOException {
	  char[]test = {'a','b','c'};
	  exchange(test);
	  System.out.println(test);
	}
	private static void exchange(char[] test){
		test = null;
	}
如果它直接修改自己本身,对源对象不会有丝毫影响,但是他内部的属性修改是可以直接影响到的,比如A和B都指向地址C,A修改自己本身其实修改了自己指向的地址,可是他们共同指向C的属性是可以相互影响的,这就牵扯到深拷贝和浅拷贝了。
dw_java08 2013-03-31
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
很正常啊。这就是新手经常犯的错 public void change(String str,char[] ch1){ str="text ok"; ch1[0]='g'; } 这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有变。 你改成这样就可以了。 publ……
+1
GeekZFZ 2013-03-31
  • 打赏
  • 举报
回复
数组是对象,传递的是引用,所以可以修改其值
books1958 2013-03-31
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
很正常啊。这就是新手经常犯的错 public void change(String str,char[] ch1){ str="text ok"; ch1[0]='g'; } 这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有变。 你改成这样就可以了。 public void chang……
我主要不明白的是,为什么ex.ch的值变了?
books1958 2013-03-31
  • 打赏
  • 举报
回复
我主要不明白的是,为什么ex.ch的值变了?
失落夏天 2013-03-31
  • 打赏
  • 举报
回复
很正常啊。这就是新手经常犯的错 public void change(String str,char[] ch1){ str="text ok"; ch1[0]='g'; } 这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有变。 你改成这样就可以了。 public void change(String str,char[] ch1){ this.str="text ok"; this.ch1[0]='g'; }

62,620

社区成员

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

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