黑马程序员技术交流社区

标题: 关于函数调用的问题 [打印本页]

作者: 王廷顺    时间: 2013-5-3 18:06
标题: 关于函数调用的问题
本帖最后由 王廷顺 于 2013-5-3 20:08 编辑

从一个已解决的程序提取出的部分代码
public class Example
{
     String str ="good";

public static void main(String[] args)
{
      Examle ex = new Examle();
      
      ex.change(ex.str);
     
      System.out.println(ex.str);
}

public void change(String str)
  {
    // this.str = str;

     str = "test ok";
  }
}

我想知道这个change函数具体被调用的过程,希望能全面具体一些。谢谢大家!
作者: 赵利斌    时间: 2013-5-3 19:23
xxxxxx???????????????????????
作者: 不喝茶的陆羽    时间: 2013-5-3 19:44
本帖最后由 不喝茶的陆羽 于 2013-5-3 19:57 编辑

新手,不一定把握哦。我觉得,结果应该是test ok,这个同一个类的函数之间调用应该不用new一个对象来完成吧,不觉得那个有什么必要(错了轻拍),然后,你既然创建了对象,调来调去都是那个堆内存中存的啊。

从一个已解决的程序提取出的部分代码
public class Example
{
     String str ="good";

public static void main(String[] args)
{
      Examle ex = new Examle();               //1,创建对象
      
      ex.change(ex.str);                           //2,change 函数唯一的一次被调用,并且把创建的本类对象ex的str属性传递给了change函数
     
      System.out.println(ex.str);                //4, 输出ex对象下的str值
}

public void change(String str)
  {
    // this.str = str;

     str = "test ok";                   、//3,接收传过来的值,并改变str的值为 test ok;  
  }
}以上是我的想法,事实证明全错,不知道你是不是也是我这么想的,你可以参看下这篇http://bbs.itheima.com/thread-48138-1-1.html和你的问题一样




作者: 王廷顺    时间: 2013-5-3 20:07
这个问题发的没啥技术含量,自己想明白了,自己解决了。
作者: chouwayメ    时间: 2013-5-3 20:21
本帖最后由 chouwayメ 于 2013-5-3 20:29 编辑

我的想法是:注意到方法change传递的是字符串,而字符串是值传递,只是调用了str的值“good"。相当于change(String str)只是个形式参量,函数主体的str也一样。要换成
  1. public void change(String a)
  2.   {
  3.      a = "test ok";  
  4. }
复制代码
应该会清楚些。所以原str的没变,最后运行结果是good。我是这么理解的。   


补充下:如果改成this.str="test ok"。那么最终运行的结果就是test ok。因为this.str是按对象传递的,会改变str的值。

自变量str和类成员同名确实很让人迷惑。。。


作者: 不喝茶的陆羽    时间: 2013-5-3 20:24
额,才发现,你早去了,帮我把楼上删了吧,不丢人现眼了...
作者: 蚂蚁搬家    时间: 2013-5-3 20:32
输出结果是good哦。

/*
哥们儿可能对this用法不太了解,:
1,在main方法中调用change方法时,即//ex.change(ex.str);//这里系统把Example类的 属性str的值“good”传递给
了change方法的形参str,然后在change方法内部你又给change的形参str赋了个值“test ok”,此时change方法的形参str的
值是“test ok”,而Example类的属性str的值不变,依然是“good”,所以你最后调用System.out.println(ex.str)输出的是属性
str的值“good”;
2,如果你把change方法内的//this.str = str;这一句注释去掉,输出结果依然是“good”,因为这一句的功能是把形参str的
值传递给属性str,因为形参的值本身就是属性传递给他的,所以这句等于属性str的值赋给自己,最后输出的时候当然还是“good”了。
*/

this用在构造方法中,代表本次调用构造方法所创建的那个对象;this用在普通方法中代表此次调用这个方法的那个对象,在本例中自然就是Example对象了;
作者: xuluheng718    时间: 2013-5-3 21:18
本帖最后由 xuluheng718 于 2013-5-3 21:41 编辑

很简单的问题,此str非彼str
public class Example
{
     String str ="good";

public static void main(String[] args)
{
      Examle ex = new Examle();
      
      ex.change(ex.str); <-----------------这里把值"good"作为参数传递给了change()
     
      System.out.println(ex.str);
}

public void change(String str)<---------------注意,这里的str不是全局变量的str,而是字符串类型的str
  {
    // this.str = str;

     str = "test ok";<-------------这里的str也不是全局变量的str,这里修改的只是作为参数传递进来的str
  }
你把它改成
public void change(String s)
{
     s = "test ok";
}
这方法和之前的方法是一模一样的。
作者: 曹睿翔    时间: 2013-5-3 21:44
不喝茶的陆羽 发表于 2013-5-3 20:24
额,才发现,你早去了,帮我把楼上删了吧,不丢人现眼了...

没事,学习是个过程,以后注意全局变量和局部变量的作用域,以及形参是值传递和this的调用就行了
作者: 王廷顺    时间: 2013-5-3 23:52
不喝茶的陆羽 发表于 2013-5-3 20:24
额,才发现,你早去了,帮我把楼上删了吧,不丢人现眼了...

这没啥丢人的,大家都是在学习,从不懂到懂得都需要一个过程,这个过程谁还不会犯点错误,当你把这个错误解决了,你也就学到了知识,这一点目前对我们大家来说才是最重要的,不要想那些没有意义的事情,我觉得学习就是在不断的犯错误然后改正错误,这个过程中就学习了,每个人都一样,谁敢说他学习没出过错,全世界都找不出来说自己在学习时没出过错的人,不信让他找找看。说的有点多了,但只需记住一句就行,我们是在学习,犯错误一点都不丢人。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2