锁定老帖子 主题:关于java中参数传递的总结
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-23
最后修改:2009-11-23
1. 引用和对象的区分 在java 中,一切皆对象,而我们就是通过引用来操作对象。换句话说,java 的存储中,new 出来的对象存储在堆中,创建的引用则一般存储在栈中,像C 中的指针一样指到某一对象(或者null )。
我认为这里有个误解,大多数的教材都在这个地方对引用长篇大论,搞得这里貌似很神秘,其实,如果看过计算机体系方面的书,就会对关于引用有个正确的理解。 一般来说,参数的传递实际就是将实际参数复制栈中的。参数为基本类型传递的是具体的数值,参数为对象传递的是对象引用(指向该对象的“指针”)。这是因为在栈中,基本类型存储的是数值,对象存储的是对象的引用。 先看一个程序
package test; public class Test { public static void main(String args[]) { Value v = new Value(10); Reference.referenceValue(v.value); System.out.println(v.value); System.out.println(); Value v1 = new Value(10); Reference.referenceObject(v1); System.out.println(v1.value); System.out.println(); Value v2 = new Value(10); Reference.test(v2); System.out.println(v2); } } class Value { int value; Value(int value) { this.value = value; } } class Reference { static void referenceValue(int i) { System.out.println("基本类型"); i++; System.out.println(i); } static void referenceObject(Value v) { System.out.println("对象"); v.value++; System.out.println(v.value); } static void test(Value v) { System.out.println("测试"); v = null; System.out.println(v); } } 执行结果如下:
基本类型 11 10 对象 11 11 测试 null test.Value@1fb8ee3
Reference 类中的referenceValue 方法接受的参数为int 型,传递的是数值,如下图
referenceValue 方法中所操作的i ,实际上已经是内存中的另一部分,原来的Value 对象中的value 值根本没有变。
referenceValue 方法接受的参数为Value 对象,实际传递过来的是Value 对象的引用,如下图
referenceValue 方法接收的参数对象Value, 实际是对象的引用,及把v1 复制给v ,使两个引用都指向堆中的同一个对象内存new Value(10) ,可以通过显示v 和v1 的hashCode ,可以发现相同。
Test 方法也是接收Value 对象的引用,如下图
虽然在test 方法中把Value 对象的引用v 指向null ,但是原来的引用v2 还是指到堆中的new Value(10) 。
3. 总结 所有的参数传递不过是在程序运行栈上新分配一个值的复制品。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-25
赞一个
我也写了篇关于Java参数调用方面的文章《引用调用还是值调用? ——Java陷阱》http://hxraid.iteye.com/blog/428856。欢迎大家去扔砖头 |
|
返回顶楼 | |
浏览 1483 次