当前位置:编程学习 > JAVA >>

一个String问题,想了半天搞不懂

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.println(ex.str + " and " + ex.ch);
}

public void change(String str, char ch[]){
str = "test ok";
System.out.println("str:" + str);
ch[0] = 'g';
}
}

原本题目是这样的,结果是
str:test ok
good and 
gbc                       
这里我看网友解答都感觉有点抽象,不是很理解,什么按值传的,按地址传的,数组我知道是按地址,但是字符串这个请网友能不能详细解释一下啊?



我把题目改了一下,答案又变成另外样子,我又糊涂了
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.println(ex.str + " and ");
System.out.println(ex.ch);
}



public void change(String str, char ch[]){
this.str = "test ok";
System.out.println("str:" + str);
ch[0] = 'g';
}
}


怎么在方法里加了个this之后,方法内打印出的就不是test ok 了,
希望好心人帮忙解答一下,最好画个图给看看
--------------------编程问答-------------------- 可以画个图片发到我邮箱,感激不尽2630968269@qq.com --------------------编程问答--------------------

public void change(String str, char ch[]){
this.str = "test ok";
System.out.println("str:" + str);
ch[0] = 'g';
}

首先,这里楼主要分清楚,形参str和类属性str。
在函数参数上的str是形参,而加上this后就变成了类属性Example.str了。
而后面,楼主print的是形参str,所以加上this后,形参str就没有赋值了,所以不会输出"test ok" --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 原来如此,我一直已经基本数据类型,才会出现那样的情况,字符型原来是比较特殊。
怪不得每次set方法,前面都是this.什么的

--------------------编程问答--------------------
引用 2 楼 tiwerbao 的回复:
Java code?12345public void change(String str, char ch[]){this.str = "test ok";System.out.println("str:" + str);ch[0] = 'g';}
首先,这里楼主要分清楚,形参str和类属性str。
在函数参数上的str是形参,而加上this后就变成了类属性Examp……



原来如此,我一直已经基本数据类型,才会出现那样的情况,字符型原来是比较特殊。
怪不得每次set方法,前面都是this.什么的

--------------------编程问答-------------------- 我想问问为什么这句str = "test ok";,赋值的是形参的str,而这句ch[0] = 'g';赋值的就是类里的属性ch呢? --------------------编程问答-------------------- ex.change(ex.str, ex.ch);因为这句中,ex.ch传的数组的首地址,所以就是地址传递,然后就把数组ch的第一个值‘a’改为‘g’了 --------------------编程问答-------------------- 学习了   以前不懂的  呵呵 --------------------编程问答-------------------- 其实就是(基础类型)传值和传引用(对象,数组,集合)的区别

你传过来的str是值,然后str = "test ok";
public void change(String str, char ch[]){}在这个范围作用域内str的值为:"test ok";如果你还不了解的话,在方法第一行打印System.out.println(str);你看到的值是good,str = "test ok";
赋值后才是:"test ok";
此值的作用范围在change方法之内。不会改变,成员变量,因为String str =new String("good"); 
成员变量str存放在堆中,而String str = "test ok";只存在栈中。 --------------------编程问答-------------------- str = "test ok";
其实他在栈中创建了一个新的对象,存放test ok
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,