文档章节

Java 到底是值传递还是引用传递?

姜小北
 姜小北
发布于 2018/05/22 11:52
字数 774
阅读 105
收藏 0

java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

传值的方式传引用。 或者说传值的方式传地址
你这个问题其实很简单。要搞清楚这个问题,要明白:堆 和 栈。引用是保存在栈上,对象是保存在堆中。引用指向堆上的对象,也就是说引用的值为对象在栈上的内存地址。那么你修改引用时改的是引用的值,也就是让引用指向其它对象。那么应该怎么修改堆上的对象呢?首先你得访问到堆上的对象吧?如何访问到它呢?在C/C++中是通过指针运算符 *p 来访问到指针p指向的堆上的对象的,然后再修改它。那么Java中没有指针运算符,那么怎么办呢?Java中是通过点操作符,也就是 list.add中的那个点,表示先访问到list这个引用指向的对象,然后让该对象调用 add 方法,从而修改了list指向的堆上的对象。所以当你单独修改 list = xxx;时你修改的是引用,让list引用指向其它对象,而没有修改 list 引用指向的对象,因为你根本就没有访问到堆上的对象,你怎么修改它呢?
所以:要修改堆上的对象,你要先访问到它,不然你就不能修改它。访问堆上的对象的方法就是 . 点操作符。
没有访问到如何修改呢?

 

首先明确一下值传递和引用传递的概念:
值传递:表示方法接收的是调用者提供的值。
引用传递:表示方法接收的是调用者提供的变量地址。

· 一个方法不能修改一个基本数据类型的参数
· 一个方法可以修改一个对象参数的状态
· 一个方法不能实现让对象参数引用一个新对象

 

 

在Java中,变量分为以下两类:
①对于基本数据类型变量(int、long、double、float、byte、boolean、char),Java是传值的副本。
②对于一切对象型变量,Java都是传引用的副本。其实传引用副本的实质就是复制指向地址的指针,只不过Java不像C++中有显著的*和&符号。
需要注意的是:String类型也是对象型变量,所以它必然是传引用副本。String类是final类型的,因此不可以继承和修改这个类。
不管Java参数的类型是什么,一律传递参数的副本。



作者:JackyHwang
链接:https://www.zhihu.com/question/31203609/answer/51056048
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

本文转载自:

姜小北
粉丝 15
博文 36
码字总数 19712
作品 2
济南
程序员
私信 提问
Java值传递与引用传递

Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案基本上是:值传递 说明:得出这种结论的前...

长平狐
2013/01/06
150
0
JAVA方法参数到底是值传递还是引用传递,求大师来解答!

想请教一下各位大师,java到底是引用传递还是值传递 网上已经搜过了各种文章. 观点A是: 基本类型(8大基本类型)是值拷贝,对象类型是引用传递. 观点B是: java中只有值传递,没有引用传递. 看了各...

gm100861
2018/11/22
445
12
什么是值传递和引用传递?之间的区别

一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递。值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。引用传递一般是对于对象型变...

我叫小糖主
05/07
0
0
java十分钟速懂知识点——引用

一、由健忘症引起的问题 今天闲来没事在日志中瞟见了个OutOfMemoryError错误,不由得想到前一段时间看到一篇面经里问到Java中是否有内存泄露,这个很久以前是留意过的,大体记得内存溢出和内...

oO脾气不坏Oo
2015/10/28
0
0
Java的方法传递参数的本质---值传递

JAVA中只有值传递,没有引用传递 任何数据(不管是基本类型,还是引用类型)传到一个方法里时,都是拷贝了一份,所以无法在一个方法里修改他们的值,当然,如果传递的是对象的话,也就是引用...

Zhao-Qian
2012/10/18
0
2

没有更多内容

加载失败,请刷新页面

加载更多

访问LNMP虚拟主机出现报错:No input file specified.

之前一直是使用lnmp一键包,但是访问创建的虚拟主机,并没有出现过的错误:No input file specified. 网上的文章很多,但是都是转载,而且原因也很多,根本不适用 后面在lnmp一键包官网找到解...

wenzhizhong
24分钟前
1
0
OSChina 周三乱弹 —— 你还能管得住观众愿意看谁吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享李宗盛的单曲《凡人歌 (电视剧《碧海情天》主题曲)》:你我皆凡人,生在人世间#今日歌曲推荐# 《凡人歌 (电视剧《碧海情天》主...

小小编辑
48分钟前
309
11
Inf2Cat, signability test failed vc2019 wdk驱动sys build签名

解决问题的方法非常简单,只要让Inf2Cat验证的时候使用local时间就可以了。打开package工程的属性,在inf2cat工具的属性中进行设置。

simpower
今天
3
0
LinkedHashMap 是如何保证有序的?

//map的遍历方法如下 for (Map.Entry<String,Integer> entry : map.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } HashMap#entry......

暗中观察
今天
3
0
Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部