黑马程序员技术交流社区
标题:
一个简单JAVA程序问题 求解
[打印本页]
作者:
史卜坤
时间:
2012-7-6 14:09
标题:
一个简单JAVA程序问题 求解
一个简单JAVA程序问题 求解
public class Test{
String str=new String("good");
char[] ch={'a','b','c'};
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
public static void main(String args[]){
Test t=new Test();
System.out.println(t.str);
t.change(t.str,t.ch);
System.out.print(t.str+"and");
System.out.print(t.ch);
}
}
为什么结果是goodandgbc,我怎么感觉是test okandgbc?
作者:
赵志勇
时间:
2012-7-6 14:29
哥,这是一个值传递和引用传递的问题!
t.change(t.str,t.ch);
这句话里面,传递String的是值传递,传递ch[]的是引用传递!
值传递就相当于拷贝一份传过去,我的还是我的,你的是你的,你改成什么样子跟我没一分钱的事!
引用传递就相当于我们两个人中间有同一个框,框里面有球,我们都从框里面拿球,就是说我们指向的都是框!
这个其实区分起来也很简单!!记得具体对象,基本类型是值传递,数组类,集合类是引用传递!酱紫就行啦!!!
作者:
夏儒日
时间:
2012-7-6 14:37
把change函数中的str="test ok";语句改成this.str="test ok";就是你认为的结果了.
change函数中的str="test ok";意思是你传进去一个字符串,然后再把该字符串重新赋值,改变的只是change函数中的局部变量str,并没有改变类中的同名变量str,l此时类中的同名变量还是原来的字符串.而change函数一结束,change函数函数中的局部变量str便从内存中消失,所以输出语句System.out.print(t.str+"and");的打印结果肯定是goodand.当你改成this.str="test ok";后,change函数执行的是将类中的同名变量重新赋值然后输出.故此时输出结果才是test okandgbc.
作者:
刘美丽
时间:
2012-7-6 14:58
public class Test{
String str=new String("good");//成员变量,并给其赋值为“good”,
char[] ch={'a','b','c'};//声明char类型的数组,其中ch[0]='a'
public void change(String str,char ch[]){ //有参数的方法
str="test ok";//进入方法,str的值为“text ok”
ch[0]='g';//数组的第一个元素由'a'改为'g'
}
public static void main(String args[]){
Test t=new Test();//创建对象
System.out.println(t.str);//因为没有进入方法内部,所以调用的是成员属性,输出good
t.change(t.str,t.ch);//调用方法,t.ch={'a','b','c'}它的表达式则为t.change("good",t.ch)
System.out.print(t.str+"and");
/*虽然在方法内部,即str的值为test ok但是呢,它没有返回给成员变量str,因此t.str调用的仍然是成员变量str="good"的值所以,此时输出goodand如果想输出你要的那个test okand则应将代码改为
public class Test {
String str=new String("good");
char[] ch={'a','b','c'};
public String change(String str,char ch[]){
str="test ok";
ch[0]='g';
return str;
}
public static void main(String args[]){
Test t=new Test();
System.out.println(t.str);
t.change(t.str,t.ch);
//输出goodokandgbc
System.out.print(t.str+"and");
System.out.println(t.ch);
//输出为test okandgbc
System.out.print(t.change(t.str,t.ch)+"and");
System.out.print(t.ch);
}
}
*/
}
}
作者:
梁健生
时间:
2012-7-6 16:33
public class Test{
String str=new String("good");
//这里并不是赋值,只是把堆从共享区中复制的“good”应用交给 str。
char[] ch={'a','b','c'};
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
public static void main(String args[]){
Test t=new Test();
//新建对象
System.out.println(t.str);
//输出的当然是“good”,因为str引用了呀!
t.change(t.str,t.ch);
/*这里是关键,调用方法change以后,相当于 局部变量str获得了“good”的引用,
而char[]ch直接指向堆中的数组, 即(局部)str ="good";
(局部)str ="test ok";
char[] ch={'a','b','c'};
ch[0]='g'; */
System.out.print(t.str+"and");
//t.str值还是good没有改变!!
System.out.print(t.ch);
//change唯一改变的也就只有ch[0]了~~·
}
}
//所以最后结果还是goodandgbc
作者:
杨朔
时间:
2012-7-6 17:18
这个就是我们长说的值传递和引用传递。java中的值传递相当于c语言中的指针。
什么事传值呢,传值就是假如你定义了一个对象a,对于传值,那么就会new出一个新的
对象,然后把a的值付给该对象,你怎么修改这个对象的值都不会影响a的值;
什么是传引用呢,传引用通俗的讲就是将指向该引用的指针地址传给它,那么修改会引起值的变化。
引用一下网上的名言,这个很有用
基本数据类型赋值属于值传递;引用类型之间赋值属于引用传递。
值传递传递的是实实在在的变量值;引用传递传递的是对象的引用地址。
值传递后,两个变量改变的是各自的值;引用传递后,两个引用改变的是同一个对象的状态。
你要是想彻底明白,就多看看相关的类型,慢慢就明白了
作者:
李志群
时间:
2012-7-6 22:32
public class Test{
String str=new String("good");//创建字符串 并给他赋值为"good"
char[] ch={'a','b','c'};//创建一个数组
public void change(String str,char ch[])// 定义一个无返回值的方法这个void前面应该加一个 static
{
str="test ok";
ch[0]='g';
}
public static void main(String args[])
{
Test t=new Test();//创建一个新的对象 命名为T
System.out.println(t.str);//调用用的是类的Test里的 Str 而不是change的。
t.change(t.str,t.ch);// 楼主想调用的是Test类的change方法是吧?你没有调用成功change的方法,所以你打印的就是原来的str 里面的字符串good,输出的也就是第一个结果
System.out.print(t.str+"and");//这个你打印的是输出语句是print 不是println下面的也是print 所以你又把str和你打印语句里面的“and”打印了一次
System.out.print(t.ch);//这个直接打印的就是你ch里面的数组。 你public void change里面的方法根本就没有使用。
}
}
/*运行结果是:good
goodandgbc
以上是我的分析,希望楼主采纳嘿嘿 我也0703的基础班新学员,希望我们大家一起学习。
*/
楼主应该是想要用change方法里面的str 替换类里的str 和ch[0]里面0角标为替换
不好意思只能分析这样 希望能帮助到你呵呵 一起加油!
作者:
李志群
时间:
2012-7-6 23:27
public class Test{
String str=new String("good");//创建字符串 并给他赋值为"good"
char[] ch={'a','b','c'};//创建一个数组
String change(String str,char ch[])// 定义一个无返回值的方法
{
str ="test ok"; //改变形参 str的值
ch[0]='g'; //改变数组指针0的值
return str; //返回字符串类型值
}
public static void main(String args[])
{
Test t=new Test();//创建Test类的一个新对象 命名为T
System.out.println(t.str);//类调用全局变量 str
//System.out.println(t.ch);
String s = t.change(t.str,t.ch);//创建一个实参 s 把 change的形参值付给s
System.out.print(s+"and");//输出实参s
System.out.print(t.ch);//输出数组
}
}
楼主 看下 我帮你算出来啦 不知道是不是你想要的结果 看下呵呵 希望采纳哦 写了好半天啊!
作者:
李志群
时间:
2012-7-6 23:29
上面注释忘记改了 第四行代码 创建一个string 类型的返回值方法
public class Test{
String str=new String("good");//创建字符串 并给他赋值为"good"
char[] ch={'a','b','c'};//创建一个数组
String change(String str,char ch[])// 定义一个string返回值的方法
{
str ="test ok"; //改变形参 str的值
ch[0]='g'; //改变数组指针0的值
return str; //返回字符串类型值
}
public static void main(String args[])
{
Test t=new Test();//创建Test类的一个新对象 命名为T
System.out.println(t.str);//类调用全局变量 str
//System.out.println(t.ch);
String s = t.change(t.str,t.ch);//创建一个实参 s 把 change的形参值付给s
System.out.print(s+"and");//输出实参s
System.out.print(t.ch);//输出数组
}
}
楼主 看下 我帮你算出来啦 不知道是不是你想要的结果 看下呵呵 希望采纳哦 写了好半天啊!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2