Java只有值传递(Java值传递还是引用传递?)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html
一:区分Java数据类型、变量类型
Java数据类型分两种:基本数据类型、引用类型。
8种基本数据类型(4整,2浮,1符,1布):byte(最小的数据类型)、short(短整型)、int(整型)、long(长整型);float(浮点型)、double(双精度浮点型);char(字符型);boolean(布尔型)。
引用类型类型:引用数据类型非常多,如:类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型。“简单来说,所有的非基本数据类型都是引用数据类型。”
变量类型:相应地,根据变量要存放的数据类型,也区分为:基本类型变量、引用类型变量。
基本类型和引用类型的区分,体现在其对应变量所存储的内容不同:
基本类型变量:变量存放的就是一个单纯的值。
引用类型变量:变量存放的是一个内存地址(引用),该地址指向内存中另一片地址,那片地址才是真正存放对象值的地方。
二:Java传参时的操作
我们在调用函数时,会将某些变量作为函数参数传递进去,调用方法时发生了什么?
这里涉及到形参和实参的概念:
1、在函数定义时所使用的参数,就是形参
定义函数时,函数参数只是作为一个变量、符号,体现在代码逻辑中,它没有具体的值。
2、在调用函数时,将值传给参数后,就是实参
在调用函数时,参数有了具体的值,变得有实际意义,此时称之为实参。
因此,参数传递的实质:就是 为函数形参赋值,使之变成实参数 的过程,也就是说:函数逻辑中所操作的并不是我们传进去的变量本身,而是copy了变量值的实参。
根据传递的数据类型以及函数中对参数的使用操作不同,大致可以分为4种场景:
1、基本数据类型传递
由于基本类型变量中存放的就是基本类型值,因此传递基本类型变量作为参数时,就是将变量的值,copy给了函数的实参。
因此,在函数中改变实参的值,不会影响函数外部的变量值。
2、immutable的引用类型变量传递
对于String,以及Integer、Double等几个基本类型包装类,它们的值是不可变的,也就是说:存放包装类类型的变量值,指向了一个对象地址,而这个变量不能再指向其他地址或存放别的值。
在immutable类型变量的传递过程中:会将变量值(引用地址)所指向的内容copy一份,并将复制后的空间的地址传递给函数作为实参。也就是说:传递给函数的变量所指向的空间,与函数实参所指向的空间是不同的,只不过各自指向的空间中的内容一样而已。
因此,函数中操作实参,不会影响到函数外部的变量值。
3、变量值可变的引用类型变量传递,并在函数中使用该引用去改变内容
对于class、array等普通引用类型,其变量值是一个地址,指向了这些对象真正存放的空间。“可变”的意思是:存放这些数据类型的变量,它可以所存储的地址,指向别的存储空间。
在这种类型的变量传递给参数的时候:会将变量值(引用地址)copy一份,传递给函数作为实参。也就是说:传递给函数的变量所指向的空间,与函数实参所指向的空间是相同的。
因此,在函数中通过实参去改变对象的内容,会影响到函数外部变量所指向的对象的内容,因为它们都指向同一个对象。
4、变量值可变的引用类型变量传递,但函数中为实参赋新值
与第3点不同,这种场景下,实参在函数中被更改了值,指向了新的地址。
因此,在后续操作中通过实参去改变对象的内容时,不会影响到函数外部变量所指向的内容,因为它们指向了不同对象。
三:结论——Java只有值传递
通过上文中关于“参数传递的实质”论述可以得知:函数调用时,无论值类型变量还是引用类型变量,都是将变量所存储的值copy给了函数的实参,区别在于基本类型变量的值就是类型值本身,而引用类型变量的值是一个地址。
也就是说:Java函数调用时,都是值传递。
Java只有值传递(Java值传递还是引用传递?)的更多相关文章
- JAVA基础学习之路(十一)引用传递
引用传递: 不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改 范例一: class Message { private int num = 10; public Message(in ...
- C++ 值传递、址传递、引用传递
一.值传递 int func(int p) 值传递会在栈中开辟一块空间 p,使得p和实参的a 同值. 此时你在函数func里面对p进行任何操作都不会对原值a产生任何影响.因为a 和p本就就是两个变 ...
- C++中值传递(pass-by-value)和引用传递(pass-by-reference)
1.pass-by-value的情况: 缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数.函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件, ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- (转载)理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...
- java面试3-对于java中值传递的理解(Hollis)
这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递.Java编程语言只有值传递参数. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用 ...
随机推荐
- Oracle EBS 11i下载的软件如何制作成linux使用的iso文件
1.cd \soft\ebs11i 2.unzip Bxxxxx.zip Disk1 3.mkisofs -o zj.iso -R -v Disk1 mkisofs -o zj.iso -R -v D ...
- Ultimate Chicken Horse GameProject第二次迭代成果文档
基于上一次的迭代中的数据结构我们补充了UML图.用例图及状态图. 用例图: 选择游戏地图:玩家可以在本地游戏界面将角色移动到地图门口并按下E进入地图. 进行游戏用例: 选择并摆放道 ...
- Linux性能优化实战学习笔记:第六讲
一.环境准备 1.安装软件包 终端1 机器配置:2 CPU,8GB 内存 预先安装 docker.sysstat.perf等工具 [root@luoahong ~]# docker -v Docker ...
- [LeetCode] 350. Intersection of Two Arrays II 两个数组相交之二
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...
- java十题
这是我收集的10个最棘手的Java面试问题列表.这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题.你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Jav ...
- linux 修改oracle的字符集
select userenv('language') from dual; 命令可以查看服务端的使用的字符集. ssh登录,切换到oracle用户 切换用户命令:su -oracle 之后 ...
- centos7上配置mysql8的双主互写
注意:1.主库1:10.1.131.75,主库2:10.1.131.762.server-id必须是纯数字,并且主从两个server-id在局域网内要唯一. [主节点1]vi /etc/my.cnf[ ...
- 奥展项目笔记02--一个bat文件运行多个java jar包
奥展项目中后端微服务有很多jar包,一个一个启动又费时间效率又低,怎么才能一下让所有的jar包一块运行呢?我们可以编写.bat文件来一键启动. 1.我们将.bat文件放到jar包的同一级目录文件夹中: ...
- C# 直接清空缓存方法
注意要使用 HttpContext.Current.Cache.Remove(cacheKey); 不能使用 HttpRuntime.Cache[cacheKey]=null;
- Pandas操作excel
读取excel:Pandas库read_excel()参数详解 pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_co ...