`
jiopi
  • 浏览: 32167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

也谈Java值传递-到底传递了什么?

    博客分类:
  • 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中,没有 引用传递,只有值传递

分享到:
评论
2 楼 sdh5724 2010-04-22  
真无聊, 传值/引用, 那么重要?这个口水话题怎么还死不完啊。
1 楼 zhxing 2010-04-22  
说白了,基本类型在JVM 里是直接保存的,在栈内可以直接保存,而引用类型是保存一个可以被理解为是内存地址(但实际上应该不是内存地址值)的引用值,指向了堆。
还有Java 的引用只有一层传递。
就是说
Object a=new Object();
Object b=a;
Object c=b;

实际上是b->a;c->a

相关推荐

    java中只有值传递

    Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。

    Java:按值传递还是按引用传递详细解说

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    谷歌java格式-重新格式化 Java 源代码以符合 Google Java 风格

    谷歌java格式 google-java-format是一个重新格式化 Java 源代码以符合 Google Java Style的程序。 使用格式化程序 从命令行 下载格式化程序 并运行它: java -jar /path/to/google-java-format-${GJF_VERSION?}-all...

    Java零基础-参数传递-2.md

    作为一门广泛使用的编程语言,Java提供了多种参数传递的方式,这其中包括了基本类型的值传递以及引用类型的地址传递。同时,文章还涵盖了可变参数列表(varargs)的使用方法以及如何在方法中正确地定义和使用返回值...

    Java零基础-参数传递-1.md

    1. **误解基本类型参数传递**:新手程序员有时会误以为基本类型的参数传递也可以像引用类型那样修改外部变量的值。 2. **忽略引用类型参数传递的特点**:未能充分利用引用类型参数传递的优势,如在方法内部直接修改...

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    java参数传递时到底是值传递还是引用传递分享.pdf

    总的来说,Java的参数传递既可以说是值传递,也可以说是引用传递,取决于你如何定义“值”。重要的是理解,无论哪种理解,Java都保证了对象引用的不可变性,而对象的内容可以在方法内部被修改。在面试或讨论中,理解...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    java参数传递-1_20201207151148.jpg

    java

    值传递与引用传递-内存解析

    首先,我们要理解什么是值传递。在值传递中,当一个变量作为参数传递给函数时,函数接收到的是该变量当前值的一个副本。这意味着在函数内部对参数的任何修改都不会影响到函数外部的原始变量。例如,在C++或Java中,...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    这也是为什么有人会说Java是值传递,因为传递的是对象引用的副本,而不是实际的对象;同时,也有人会说Java是引用传递,因为通过这个引用可以改变对象的内容。 引用传递和值传递的区别在于,如果语言支持真正的引用...

    Java 值传递Visio资源

    在Java中,参数传递有两种方式:值传递和引用传递。这个“Java 值传递Visio资源”包含了几个Visio图形文件,帮助我们直观地理解这两种传递方式。 1. **值传递**: 当方法调用时,对于基本类型(如int, double, char...

    重新格式化 Java 源代码以符合 Google Java 风格google-java-format v1.18.1.zip

    google-java-format是一个重新格式化Java源代码以符合Google Java风格的程序。格式化程序可以作用于整个文件、有限的行、特定的偏移,传递到标准输出(默认)或就地更改。格式化程序的格式化算法没有可配置性。这是...

    深入了解为什么Java中只有值传递?

    这也解释了为什么在 Java 中,我们可以改变对象的状态,但不能改变对象引用的值。这是因为方法得到的是对象引用的拷贝,而不是原始对象本身。 在 Java 中,对对象的参数传递是按值传递的,而不是按引用传递的。这...

    javabase64-1.3.1

    在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。 javabase64-1.3.1....

Global site tag (gtag.js) - Google Analytics