日期:2014-05-20 浏览次数:20868 次
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){..}