public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String[]args){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
这里的结果为什么是:good and gbc
高手解答一下@!
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String[]args){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
这里的结果为什么是:good and gbc
高手解答一下@!
解决方案 »
- 循环中处理异常的问题
- 一个关于servlet中的service()问题
- Java字符串,大小写转化的,我写了可是转换不了,请高手指点,谢谢!
- jxl问题 我在服务器端用jxl读写了一个excel文件 下下来 居然文件未找到,然后修复才看到
- Date与String之前的转化问题
- Applet中动态画图的问题
- 求救:谁有远程控制软件tightvnc源码,要java的,还得有模块划分和程序流程
- 如何使用一个线程模仿挂机功能。
- jb8的帮助文件没有啊,谁可以提供下载网址啊
- 求大神给个能用的好用的eclipse
- 越深入java 就觉得java做得越烂(个人觉得应当做得更好) 问题三
- 为什么? 关于Java只有按值传递
str="test ok";
ch[0]='g';
}
这里的str与成员属性上的str不是同一个引用变量.
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String[]args){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
this.str="test ok";
ch[0]='g';
}
}
成员属性一个引用.方法的参数里也有一个引用.
在方法里,改了参数的引用的,但并没有改变它原来所引用的对象.
在方法,通过ch引用,改变了它所引用的对象.String a = new String("aaa");String b = a;a和b是不同的引用变量.但是它们引用同一个对象,就是刚才创建的那个.
如果你想修改的效果。。可以把前面的对象作为值传递进来。public class Example {
String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) {
Example ex = new Example();
ex.change(ex, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
} public void change(Example exp, char ch[]) {
exp.str = "test ok";
ch[0] = 'g';
}
}
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String[] args) {
Example ex = new Example();
ex.change(ex , ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch); } public void change(Example exp, char ch[]) {
exp.str = "test ok";
ch[0] = 'g';
}
} 运行结果 test ok and gbc
String已经定义了,它只是个应用,所以它的值是不会改变的,但是数组就不同了
String中存放的是真实的值。
数组可以是因为数组存放的是地址。
this.str="test ok"; // str是String类型的变量,这句话相当于在堆中另外申请一片空间存放"testok"; 而str在堆中的原来的值没改变------相当于String类型的值是不能改变的 ch[0]='g'; //数组的长度不能改变,但是他其中的值是可以改变的。
}
}
在我看,调用change(String str,char ch[]);的过程实参把数组的引用给了ch,也就是说ch指向了实参,因此ch改变,实参也就跟着改变
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
其实理解方法有很多种,我倾向于这种理解:ex.change(ex.str,ex.ch);这句话调用change这个函数,并且将2个参数的值传进去,也就是说一开始public void change(String str,char ch[])中str指向字符串池中"good",注意此时已有2个引用指向"good"的,同样ch[]也相同。不同的是str="test ok"; 字符串池中新建个值为test ok的对象,此时str指向这个对象,但原来的那个引用并没有改变,还是指向原来的"good",而ch[]和字符串池是不同的,他将他所指向的对象的ch[0]改变之后,原来的对象也就改变了,所以这个知识还需要了解字符串池的相关知识。