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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王廷顺 中级黑马   /  2013-5-3 18:06  /  1819 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王廷顺 于 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函数具体被调用的过程,希望能全面具体一些。谢谢大家!

9 个回复

倒序浏览
xxxxxx???????????????????????
回复 使用道具 举报
本帖最后由 不喝茶的陆羽 于 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和你的问题一样



评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 鼓励下,补足你没抢到的楼层,别伤心了.

查看全部评分

回复 使用道具 举报
这个问题发的没啥技术含量,自己想明白了,自己解决了。
回复 使用道具 举报
本帖最后由 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和类成员同名确实很让人迷惑。。。

回复 使用道具 举报
额,才发现,你早去了,帮我把楼上删了吧,不丢人现眼了...
回复 使用道具 举报
输出结果是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: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 20:24
额,才发现,你早去了,帮我把楼上删了吧,不丢人现眼了...

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

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