`
咖啡猪猪
  • 浏览: 16454 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于java中参数传递的总结

阅读更多

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) ,可以通过显示vv1hashCode ,可以发现相同。

 

   Test 方法也是接收Value 对象的引用,如下图

   

 

   虽然在test 方法中把Value 对象的引用v 指向null ,但是原来的引用v2 还是指到堆中的new Value(10)

 

 

3. 总结

   所有的参数传递不过是在程序运行栈上新分配一个值的复制品。

分享到:
评论
1 楼 Heart.X.Raid 2009-11-25  
赞一个

我也写了篇关于Java参数调用方面的文章《引用调用还是值调用? ——Java陷阱》http://hxraid.iteye.com/blog/428856。欢迎大家去扔砖头

相关推荐

    GUI数据传递总结

    在matlab中设计GUI时的几种数据传递方式

    JAVA +jni c# 参数传递.rar

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    java中方法参数的一些总结

    Java程序设计语言使用值调用。也是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何基本数据类 ...  总结Java程序设计语言中,方法参数的使用情况:  1、一个方法不能修改一个基

    Java重点知识总结

    方法参数传递(传值、传递引用的区别) , 方法重载(同名、参数形式不同) 字符串(常量、与字符常量的区别、连接运算、例2.18) 。。。。。。。 。。。。 第9章 流的概念 字节流的类的作用、类层次 字符流的类的...

    Java编程中影响性能的细节

    开发中我们经常忽略了一些影响性能的细节,这里特总结出来供大家参考。

    java教学资料

    高校java初级入门教学资源。熟悉并设置JDK path 路径 熟悉eclipse开发环境。 要求同学们在开发环境中,创建一个以姓名和学号命名的工程名称,如zhangsan04010325; 在工程下的src目录下创建15个类包,如ex1,ex2…ex15...

    java 面试题 总结

    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 15、error和exception有什么区别? error 表示恢复不是...

    数组总结(概念、定义、默认值、可变长参数、值传递与引用传递等)

    数组总结(概念、定义、默认值、可变长参数、值传递与引用传递等)。1.冒泡排序: ​ 两两相比(两个相邻的数进行比较) 条件成立 互换位置 ​ 外层循环控制比较的轮数 **轮数永远是 长度 -1 (n - 1)** ​ 内层循环...

    JAVA代码审计常用漏洞总结

    主要代码审计方法是跟踪...敏感函数参数回溯,根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用 的方法。大多数漏洞的产生是因为函数的使用不当导致的,只要找到这些函数,就能够快速挖掘想要的漏洞。

    Java编码规范总结

    修复建议:String的split方法传递的参数是正则表达式,正则表达式本身用到的字符需要转义,如:句点符号“.”,美元符号“$”,乘方符号“^”,大括号“{}”,方括号“[]”,圆括号“()” ,竖线“|”,星号“*”,...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java语言程序设计 java编程笔记 由浅入深的笔记 共32份 全套资源.rar

    参数传递.docx 第二周所学总结.docx 反射机制.docx 泛型.docx 封装和继承以及多态部分.docx 接口和抽象类以及实现类.docx 枚举enum.docx 设计模式.docx 数组.docx 网络编程.docx 线程和内部类.docx 循环和类对象....

    F:\02soft\download\JAVA基础.rar

    1.非常实用的JAVA基础学习文档。是首个以题目来对JAVA基础进行总结的文档,非常适合JAVA初学者进行学习。整本书共10个章节,每个章节约10个考点(知识点)。...4.关于参数传递、垃圾回收器、继承、线程等讲的非常的好

    Java入门教程(微学苑)-part1

    3.16 作为参数传递 51 3.17 Java方法重载 52 3.18 Java类的基本运行顺序 53 3.19 Java包装类、拆箱和装箱详解 54 3.20 包装类的应用 54 3.20.1.1 1) 实现 int 和 Integer 的相互转换 54 3.20.1.2 2) 将字符串转换为...

    java8集合源码分析-java-learnning:Java总结

    1.post请求传递的参数,接口必须要接收,否则报错; Unrecognized field , not marked as ignorable https://blog.csdn.net/bigtree_3721/article/details/70738337 (1)原因:项目中用了MappingJackson2...

    JSP向后台传递参数的四种方式总结

    通过在表单中加入一个隐藏域来提交到服务器端,这种方式的好处是可以在客户端加入一些自己想要加入的参数,以便得到相应的值。 客户端代码: Java代码 <input type=”hidden” name=”id” value=””/> ...

    21天学通Java-由浅入深

    101 6.3.2 成员变量的初始化 102 6.4 局部变量 105 6.4.1 局部变量的创建和初始化 105 6.4.2 局部变量和成员变量的区别 106 6.5 方法 106 6.5.1 方法的创建和参数 106 6.5.2 方法参数的传递 108 6.6 对象引用的使用 ...

    深入理解javascript函数参数与闭包

    最近在学习javascript的函数,函数是... 1.4:参数传递方式  1.5:同名参数  1.6:arguments对象 2.闭包  2.1:闭包定义  2.2:立即调用的函数表达式(IIFE, Immediately invoked function expression) 1.函数参

Global site tag (gtag.js) - Google Analytics