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编程语言只有值传递参数. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用 ...
随机推荐
- USACO Telephone Lines
洛谷 P1948 [USACO08JAN]电话线Telephone Lines https://www.luogu.org/problem/P1948 JDOJ 2556: USACO 2008 Ja ...
- pointnet++之classification/train.py
1.数据集加载 if FLAGS.normal: assert(NUM_POINT<=10000) DATA_PATH = os.path.join(ROOT_DIR, 'data/modeln ...
- JS判断是否是ioS或者Android
每个客户端都带有自身的UA标识,通过JavaScript,可以获取客户端标识,我们可以获取浏览器的userAgent,用正则来判断手机是ios(苹果)还是Android(安卓)客户端. 项目实例:ht ...
- 第01组 Beta冲刺(3/5)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/12008397.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- 应用层协议:HTTPS
1. HTTPS定义 Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Socket ...
- K8S 如何实现将git代码下拉到指定的容器路径中
gitRepo 是 kubernetes Volume类型中的一种,gitRepo volume可以实现将git代码下拉到指定的容器路径中. 备注:实现此功能,Pod运行的节点都必需要安装git.换句 ...
- 程序员需要了解的linux常用命令
网络 找出某程序(tomcat)的进程 ps -ef|grep tomcat 找出后如果要关闭 kill -9 pid统计某程序(tomcat)连接数 ps -ef|grep tomcat|w ...
- Python 遍历目录下的子目录和文件
import os A: 遍历目录下的子目录和文件 for root,dirs ,files in os.walk(path) root:要访问的路径名 dirs:遍历目录下的子目录 files:遍历 ...
- vm ------ 安装
虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件. 虚拟机最 ...
- springmvc和mybatis面试题(含答案)
Spring MVC Framework有这样一些特点: 1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成. ...