A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-6 14:09  /  2461 人查看  /  8 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

一个简单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?

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
哥,这是一个值传递和引用传递的问题!
t.change(t.str,t.ch);
这句话里面,传递String的是值传递,传递ch[]的是引用传递!
值传递就相当于拷贝一份传过去,我的还是我的,你的是你的,你改成什么样子跟我没一分钱的事!
引用传递就相当于我们两个人中间有同一个框,框里面有球,我们都从框里面拿球,就是说我们指向的都是框!
这个其实区分起来也很简单!!记得具体对象,基本类型是值传递,数组类,集合类是引用传递!酱紫就行啦!!!
回复 使用道具 举报
把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.
回复 使用道具 举报
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);
  }
}

*/
}
}
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个就是我们长说的值传递和引用传递。java中的值传递相当于c语言中的指针。
什么事传值呢,传值就是假如你定义了一个对象a,对于传值,那么就会new出一个新的
对象,然后把a的值付给该对象,你怎么修改这个对象的值都不会影响a的值;
什么是传引用呢,传引用通俗的讲就是将指向该引用的指针地址传给它,那么修改会引起值的变化。
引用一下网上的名言,这个很有用
基本数据类型赋值属于值传递;引用类型之间赋值属于引用传递。  
值传递传递的是实实在在的变量值;引用传递传递的是对象的引用地址。  
值传递后,两个变量改变的是各自的值;引用传递后,两个引用改变的是同一个对象的状态。
你要是想彻底明白,就多看看相关的类型,慢慢就明白了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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角标为替换
                        不好意思只能分析这样 希望能帮助到你呵呵 一起加油!
回复 使用道具 举报
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);//输出数组
                       
        }
}
楼主 看下 我帮你算出来啦 不知道是不是你想要的结果 看下呵呵 希望采纳哦 写了好半天啊!
回复 使用道具 举报
上面注释忘记改了 第四行代码 创建一个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);//输出数组
                        
        }
}
楼主 看下 我帮你算出来啦 不知道是不是你想要的结果 看下呵呵 希望采纳哦 写了好半天啊!

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马