关于Java按值传递的学习
来源:互联网 发布:淘宝网咨询电话 编辑:程序博客网 时间:2024/06/04 08:55
今天看《重构-改善既有代码的设计》这本书的时候,有提及到"Java按值传递"的思想,然后把已经关闭的电脑,重新打开,在Eclipse做一个简单的演练。(我比较笨,只能通过无数的次的main方法不断的测试,原主赐予我智商!阿门!)
在一个方法中,我们一般都会接收参数。如果在这个方法内部,我们不小心修改了传递进来的参数的值,那么结果会什么样呢?如下方法:
public Object changeObject(Object obj){if(obj instanceof String)obj = new String("changeObject");else if (obj instanceof Boolean)obj = new Boolean(true);else if (obj instanceof Double)obj = new Double(100);else if(obj instanceof StringBuffer)obj = new StringBuffer("new StringBuffer ");return obj;}在上述这个方法中,我们在找工作的笔试过程中会碰到,在各种考试中也会碰到。一般是会咨询:如果参数变量value=1,那么调用方法之后,返回值是什么?value值是什么?
按照Java的按值传递思想,参数的值是不会被改变的,也就是不会被重新赋值。换个角度来说,传递的参数可以作为方法的内部变量,其生命周期与方法一样,方法作废,它也就“作废”了。可以有另外一种情况,比如以下方法:
public ArrayList<String> changeArraylist(ArrayList<String> list){list.add("fish");list.add("fish");list.add("fish");return list;}
如果说,我们声明了一个空的list,作为参数传递给changeArraylist方法,那么调用该方法,返回的值是什么?调用后list会编程了什么?
测试一下,会发现,返回的结果与list的结果一样:list的值变了!不再是空,而是与返回值一样!
这是为什么呢?(请原谅我学艺不精,无法解释清楚这种现象!)
另外一种情况,如果我们的方法如下:
public ArrayList<String> changeArraylist(ArrayList<String> list){list = new ArrayList<String>();list.add("fish");list.add("fish");list.add("fish");return list;}此时调用后返回的结果,与上面的方法一致。而list的值,保持不变!
这种现象,充分说明了list只是作为了方法的内部变量参与了计算,方法无效了,它也就“作废”了。当它的职责完成以后,它也就回归本位!
PS:据说,java的new操作,实际上创建了一个对象实例。而等号的赋值操作,只是把变量指向了对象的一个实例的引用。
可以尝试用这种说法去解释上述一种可以改变传入参数list的值,一种不可改变list值的方法。
- 关于Java按值传递的学习
- 关于JAVA中参数传递问题的总结(按值传递和引用传递)
- 关于Java的值传递和引用传递的总结
- 关于指针、引用、值传递的学习
- 关于JAVA的值传递和引用传递&String
- 关于JAVA方法的值传递和引用传递
- 关于Java值传递和引用传递的总结
- 关于Java的值传递和引用传递
- 自我理解关于Java的值传递和引用传递
- 关于JAVA的传递方式只能是“值传递”
- 关于java中的值传递与引用传递的见解
- 关于Java的值传递和引用传递
- 关于java 值传递
- java中关于“按值传递”的相关问题
- 关于java 参数 值传递的感悟
- 关于Java值传递的故事
- 我的java学习笔记(4)关于方法参数传递
- [学习笔记]Java的值传递和引用传递,引用传递转值传递
- 行末記号
- Fedora 17 x64如何配置nfs服务
- c语言之预处理
- 快速排序的实现
- 【面试题】找出字符串中连续出现次数最多的子串
- 关于Java按值传递的学习
- 指向临时变量的指针的返回
- Linux下C编程习惯
- IOS 应用获取应用程序目录的路径分析
- 类似AppStore详情页
- 多线程
- Algorithms 学习笔记01 Union Find
- 行の先頭(^)
- arm7入门经验