黑马程序员技术交流社区
标题:
关于函数调用的问题
[打印本页]
作者:
王廷顺
时间:
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也一样。要换成
public void change(String a)
{
a = "test ok";
}
复制代码
应该会清楚些。所以原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