日期:2014-05-20 浏览次数:20680 次
public class Test { public void change(String str,char[] c,StringBuffer buffer1,StringBuffer buffer2) { str+="world"; c[2]='d'; buffer1.append("AAA"); buffer2=new StringBuffer("BBB"); } /** * @param args */ public static void main(String[] args) { Test t=new Test(); String str="hello"; char[] c={'a','b','c'}; StringBuffer buffer1=new StringBuffer("aaa"); StringBuffer buffer2=new StringBuffer("bbb"); t.change(str, c, buffer1,buffer2); System.out.println(str); System.out.println(c[2]); System.out.println(buffer1); System.out.println(buffer2); } }
public class Test { public void change(String str,char[] c,StringBuffer buffer1,StringBuffer buffer2) { //LZ想想看,这个str是什么,是变量还是对象?"word"又是什么,它和main的str又是什么关系? str+="world"; //这个是改变变量的指向,让变量指向新的对象,但不影响main的str的指向 c[2]='d'; //这个是改变变量指向的对象的属性,所以main的c也能知道对象的属性改变了 buffer1.append("AAA"); //这个也是改变变量指向的对象的属性 buffer2=new StringBuffer("BBB"); //这个是改变变量的指向,让变量指向新的对象 } /** * @param args */ public static void main(String[] args) { Test t=new Test(); String str="hello"; char[] c={'a','b','c'}; StringBuffer buffer1=new StringBuffer("aaa"); StringBuffer buffer2=new StringBuffer("bbb"); t.change(str, c, buffer1,buffer2); System.out.println(str); System.out.println(c[2]); System.out.println(buffer1); System.out.println(buffer2); } }
------解决方案--------------------
你学过c/c++把 其实就是
指针传递问题 + String不变对象概念
指针传递就是值传递(区别与引用传递)-其实就是传地址
1.java中String是不变的就是说 new出来后不能直接修改其内部数据.只能生成新的对象.
str+="world" //生成了新的对象,但是main中还是指向原来的对象
c[2]='d'; //java中其实数组就是一个对象 而且main传递的也是指针
buffer1.append("AAA"); //对象内部数据被改变
buffer2=new StringBuffer("BBB"); //对象内部数据被改变
其实可以详细看一下 scjp的教材开头对参数传递的描述.
java的引用 其实从表面上可以看作指针
------解决方案--------------------
8楼的讲解很详细,我以前也看到他的才豁然开朗,话说你放形参看做一个拷贝,也就是对象引用,就好理解多了。不要看做对象传递,是引用传递。
------解决方案--------------------
其实 还是建议搂主仔细看一下 基础教程...里面有...
------解决方案--------------------
这个问题的本质就是java数据类型的底层实现与final关键字的问题.
java在方法调用是,所有的参数都是copy一份出来,将copy后的数据做参数,调用方法。
比如 private void test(int a){..}