java的传值

简介:

参考文献:http://www.360doc.com/content/07/1122/09/9426_838237.shtml

java程序只有传值,没有传引用,传地址的说法。但是传递的值可以是具体的数值,也可以是一个对象的引用。可以用这样一句话来描述“java函数是传值的,java函数传递的参数是对象的引用”。 

我看到过几个解释这个问题的例子,不过个人感觉看过例子之后还是只知道是什么不知道为什么,停留在照猫画虎的水平上还是挺容易出问题的。所以举例子之前,先从jvm的实现原理上有个了解应当是不无裨益的。jvm的结构图可以从《深入java虚拟机》这本巨牛的书上找到,绝对有权威性。从jvm的结构图上可以看出来,jvm在实现的时候将属于它的内存分为五部分,其中程序代码(严格的说应当是字节码)是放在java栈的栈帧中,而对象是从堆中分配的,堆这个东西我看可以理解成“对象池”。程序和程序中需要用到的对象放在两个相对独立的区域中,那么程序怎么使用对象呢?答案是程序中真正使用对象的地方其实只是声明了一个对象的引用,也就是把堆中分配了的相应对象的地址放到引用中,栈和堆之间就是通过一个一个的引用来联系的。引用嘛,我理解就是一个指针常量,指针常量又是个什么东西呢?说白了,就是一个无符号整数,这个整数所表达的是引用对象的地址。好了,这下清楚了,不管是基本类型变量(int,float,double什么的)还是对象,相应的内存地址中存放的都是一个数(无符号整数,整数,浮点数等)。传递参数的时候传递的就是相应内存地址中的数,所以说“ava函数是传值的”。当然,这个数对于基本类型和对象类型来说意义是不一样的,对于基本类型这个数就是其值本身,传递值的结果就是,改变新的变量的值不影响旧的变量的值;而对于对象来说这个数是它的地址,传递这个值就相当于传递了真实对象的引用,传递了引用或者说是地址的结果就是变化会全局可见,所以又可以说“java函数传递的参数是对象的引用”。 

经过上面这一小堆讨论,不难理解为什么java在传递参数时对于基本类型和对象表现不同。下面以具体实例来说明,看看是不是比原来没有上面的解释的时候好理解一点?

View Code

java中对象的每个实例(就是对象)内存地址是唯一的,它一旦被创建,能够对这个地址进行操作的就是其本身,如果ValueObject类中没有public void setName之类的方法对这个类的实例中的数据进行修改的话,程序是没有任何别的方法可以修改ValueObject类的实例中的数据,这个就是java的封装特性。对于不提供修改内部数据的方法的类,我们称为不可变(immutable)的类。在函数中对传入的参数变量进行赋值操作,只能在函数范围内改变局部变量指向的引用地址,但是不会改变原始地址的内容。因此,在changeValue2(...)函数内部的vo1和函数外的vo1虽然名字相同,但是实际上是不同的实例变量,只不过指向了和函数外的vo1同样的地址,所以当我们用vo1=... 对其进行赋值的时候,只不过是把函数内的临时变量指向了新的地址(就是从原来vo1的地址变到了另外一个地址),并没有改变原始vo1内存地址中的内容。这就是在运行changeValue2(...)之后,vo1的值在main范围内仍然没有被修改的原因。而changeValue1里面是调用的ValueObject本身的function来更改其内容,因此是原始内存地址中的数据被更改了,所以是全局有效的. 
总结:对于引用类型的传参也是传值的,传的是引用类型的值,其实就是对象的地址。

1. java参数传递值的。

2. java所有对像变量都是对像的引用。

不知道解释清楚没,要是还是不能理解java参数传递的原理,强烈推荐看看《深入java虚拟机》一书的第五章,中文翻译的不是特别出色,可以看看英文原版,应该比中文版好懂。


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/04/01/2427872.html,如需转载请自行联系原作者


目录
相关文章
|
1月前
|
存储 Java
Java-参数传值
Java-参数传值
25 4
|
7月前
|
Java 测试技术 数据处理
Java多线程父线程向子线程传值解决方案 2
Java多线程父线程向子线程传值解决方案
87 0
|
7月前
|
Java
Java多线程父线程向子线程传值解决方案 1
Java多线程父线程向子线程传值解决方案
228 0
|
7月前
|
Java
JAVA参数传值机制中值传递和引用传递
JAVA参数传值机制中值传递和引用传递
62 0
|
Java
08 java中方法传参的传值与传址问题
java的值传递与址传递 问题:在java中方法传参到底是值传递还是址传递?
80 0
08 java中方法传参的传值与传址问题
|
存储 Java C++
基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别
基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别
|
Java
Java - 参数传递(传值、传址/引用)
Java - 参数传递(传值、传址/引用)
301 0
Java - 参数传递(传值、传址/引用)
|
Java C语言
【JavaSE基础】深入了解Java的传值和传引用
【JavaSE基础】深入了解Java的传值和传引用
113 0
【JavaSE基础】深入了解Java的传值和传引用
|
Java Windows
Java是传值还是传引用?
Java是传值还是传引用?
|
Java
Java 传参传值
Java 传参传值 案例代码 public class PassParamExplain { public static void main(String[] args) { //example A System.
10397 0