也谈Java值传递-到底传递了什么?
2010-04-23 10:14
316 查看
java里面只有值传递,这是不变的真理,不过由于对象类型的特殊性,有些人还是会疑惑 值传递?还是 引用传递?
可能主要是这句话造成的: 在Java中方法参数的传递,对象是传递引用,基本数据类型是传递值。
如果java里面只有值传递,为何又要说对象是 引用传递?
对于 基本数据类型 是值传递,相信没有人会有疑惑。那对象到底传递了什么?
其实这源于JAVA在解释其变量类型时的一个混淆:JAVA里面只有8种基本数据类型和对象类型
于是便有了 基本数据类型是传递值,对象是传递引用
其实如果把对象类型也解释成一种 基本数据类型 ,那就不会出现 对象是传递引用 这句话让人疑惑的话了
下文将 对象类型 看成一种新的 基本类型, 姑且称之为 olong (object long),即 所有对象变量 都是 olong,虽然在java书写时可以写成具体的对象类型,如 Long a; 但其传递实质是 olong a;
让我们来重新认识 olong 吧:
赋值:
long a = 1234;
olong oa = new Long(1234); //Long oa = new Long(1234);
传递:
long b = a;
olong ob =oa; //Long ob = oa;
改变:
b = 4321;
ob = new Long(4321); //ob = new Long(4321);
改变了什么?:
System.out.println(a); //输出 1234
System.out.println(b); //输出 4321
System.out.println(oa.longValue()); //输出 1234
System.out.println(ob.longValue()); //输出 4321
到底传递了什么:
long:
long a = 1234; //a的值1234
long b = a;//值传递 b的值1234;a的值1234
b = 4321;//b的值被改变为4321;但a不受影响,依然是1234
olong:
long类型的变量保存和传递的是其指代的基本类型的值,那么olong呢?
可以认为olong类型的变量保存和传递的是一个指向具体对象的内存地址,
olong oa = new Long(1234);//假设new Long生成的对象的地址为0001,则oa的值为0001
olong ob =oa; //值传递,ob的值0001;oa的值0001
ob = new Long(4321);//ob的值被赋予一个新的对象的地址,假设为0002,但oa的值不受影响,依然为0001
因此olong类型的赋值结果与long类型的表现一致,也是值传递
为什么对象是传递引用?
其实这句话也不错,因为olong变量本身就是一个引用,引用了一个对象(的内存地址)
但其实质是 值传递!只不过因为 olong 的值 还有一个 别名 叫做 引用,所以就被叫做了一个让人迷惑的新词:引用传递!
总结:
olong的引入只是为了方便解释Java对象的值传递,说明在参数传递过程中,对象变量的传递和基本变量的传递是没有本质区别的,所以,在 Java中,没有 引用传递,只有值传递!
可能主要是这句话造成的: 在Java中方法参数的传递,对象是传递引用,基本数据类型是传递值。
如果java里面只有值传递,为何又要说对象是 引用传递?
对于 基本数据类型 是值传递,相信没有人会有疑惑。那对象到底传递了什么?
其实这源于JAVA在解释其变量类型时的一个混淆:JAVA里面只有8种基本数据类型和对象类型
于是便有了 基本数据类型是传递值,对象是传递引用
其实如果把对象类型也解释成一种 基本数据类型 ,那就不会出现 对象是传递引用 这句话让人疑惑的话了
下文将 对象类型 看成一种新的 基本类型, 姑且称之为 olong (object long),即 所有对象变量 都是 olong,虽然在java书写时可以写成具体的对象类型,如 Long a; 但其传递实质是 olong a;
让我们来重新认识 olong 吧:
赋值:
long a = 1234;
olong oa = new Long(1234); //Long oa = new Long(1234);
传递:
long b = a;
olong ob =oa; //Long ob = oa;
改变:
b = 4321;
ob = new Long(4321); //ob = new Long(4321);
改变了什么?:
System.out.println(a); //输出 1234
System.out.println(b); //输出 4321
System.out.println(oa.longValue()); //输出 1234
System.out.println(ob.longValue()); //输出 4321
到底传递了什么:
long:
long a = 1234; //a的值1234
long b = a;//值传递 b的值1234;a的值1234
b = 4321;//b的值被改变为4321;但a不受影响,依然是1234
olong:
long类型的变量保存和传递的是其指代的基本类型的值,那么olong呢?
可以认为olong类型的变量保存和传递的是一个指向具体对象的内存地址,
olong oa = new Long(1234);//假设new Long生成的对象的地址为0001,则oa的值为0001
olong ob =oa; //值传递,ob的值0001;oa的值0001
ob = new Long(4321);//ob的值被赋予一个新的对象的地址,假设为0002,但oa的值不受影响,依然为0001
因此olong类型的赋值结果与long类型的表现一致,也是值传递
为什么对象是传递引用?
其实这句话也不错,因为olong变量本身就是一个引用,引用了一个对象(的内存地址)
但其实质是 值传递!只不过因为 olong 的值 还有一个 别名 叫做 引用,所以就被叫做了一个让人迷惑的新词:引用传递!
总结:
olong的引入只是为了方便解释Java对象的值传递,说明在参数传递过程中,对象变量的传递和基本变量的传递是没有本质区别的,所以,在 Java中,没有 引用传递,只有值传递!
相关文章推荐
- 值传递和引用传递,java到底按什么传递的
- java中的值传递和引用传递到底有什么区别
- java中的值传递和引用传递到底有什么区别
- java到底是值传递还是引用传递?
- Java进阶(二)当我们说线程安全时,到底在说什么
- Java到底是值传递还是引用传递?
- 在JAVA中线程到底起到什么作用!
- java 的接口到底起什么作用
- Java的Generics和c++的Template到底有什么不同?
- C# java中调用参数到底有什么实用的地方
- 深入理解Java虚拟机到底是什么
- java到底是值传递还是引用传递?
- Java语言中到底是值传递还是引用传递
- java中 static变量和方法到底是存在内存什么区域呢?
- java到底是值传递还是引用传递?
- Java进阶(二)当我们说线程安全时,到底在说什么
- java中|与||,&与&&到底有什么区别呢?
- Java到底有没有引用传递?
- java中的Serializable接口到底是做什么用的?
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?