Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图说Java值传递原理

图说Java值传递原理

作者头像
程序猿杜小头
发布于 2022-12-01 13:39:23
发布于 2022-12-01 13:39:23
48900
代码可运行
举报
文章被收录于专栏:程序猿杜小头程序猿杜小头
运行总次数:0
代码可运行

Java是一门面向对象的程序设计语言,类是其基本抽象单元,而方法是类中可复用的执行单元;当一个Java方法被调用,方法参数的传递方式究竟是基于值传递还是引用传递呢?答案是:值传递

1. 基础知识回顾

1.1 形参(formal parameter)与实参(actual parameter)

1.2 值传递(pass by value)与引用传递(pass by reference)

通常,在编程语言中关于方法参数的传递主要有两种方式:

  • 值传递中,Callee方法内访问的是Caller方法中的实参的拷贝副本,故而对Caller中的实参没有影响;
  • 引用传递中,Caller方法中实参所持有的内存地址会直接传递给Callee方法,故而在Callee方法中可以影响Caller中的实参。

值传递与引用传递的根本区别在于操作的是同一块内存还是新开辟了一块内存;直白点说,值传递涉及新开辟一块内存区域。

1.3 虚拟机栈(jvm stack)

Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是线程上下文中方法执行的内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈出栈的过程。特别地,Java方法内的局部变量即存放于引用变量表中,对于基本类型 (primitive type),直接存储值;对于引用类型 (reference type),存储的是对象在堆内存中的内存地址值,比如0x604950490,内存地址值并不等同于对象本身。

2. 回归正题

既然Java中只有两种数据类型,那下面就以这两种数据类型为维度来剖析Java中方法参数的值传递原理。

2.1 基本数据类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PassByValueMain1 {
    public static void main(String[] args) {
        int i = 10086;
        System.out.println(i);
        method(i);
        System.out.println(i);
    }

    private static void method(int j) {
        j = 10000;
    }
}

运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10086
10086

运行原理

2.2 引用数据类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PassByValueMain2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("hello");
        System.out.println(sb);
        method(sb);
        System.out.println(sb);
    }

    private static void method(StringBuilder _sb) {
        _sb.append(", world");
    }
}

运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hello
hello, world

运行原理

3 总结

  1. Java中方法参数的传递方式是基于值传递的;
  2. 如果参数是基本类型,传递的是基本类型的字面量值的拷贝;
  3. 如果参数是引用类型,传递的是该参数所引用的对象在堆内存中地址值的拷贝;
  4. 值传递始终会新开辟一块内存区域。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿杜小头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java-值传递和值引用
参考:https://mp.weixin.qq.com/s/Qp6Cc0mlRLnrToNy5-3zeg java的值传递和值引用是一个普通但重要的内容,今天我们依次来了解一下。
android_薛之涛
2019/01/03
1.7K0
这一次,让你彻底理解Java的值传递和引用传递!
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍、对论坛博客的说法,做一次考证,以得出信得过的答案。
Java团长
2019/06/26
9050
这一次,让你彻底理解Java的值传递和引用传递!
Java的JVM介绍以及java的值传递和引用传递
面试的时候碰到的了一个java基础问题,竟然给问蒙了,回来之后感觉针对这个问题总结一下
包子388321
2020/06/16
1K0
String是值传递还是引用传递
今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。
小忽悠
2018/09/04
1K0
解惑4:java是值传递还是引用传递
曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的。
全栈程序员站长
2022/09/23
6630
解惑4:java是值传递还是引用传递
Java中真的只有值传递么?
关于这个问题应该是存在争议的。根据测试出来的结果和我们自己的经验,以及口口相传或是上学时老师讲的,我们认为是第一种。但第二种说法的呼声也很高,渐渐地我们也认为第2中才是对的。那么下面我们就来分析一下这个问题。
编程大道
2020/02/11
1.2K0
你们不要再吵了! Java只有值传递..
对于引用类型 str,赋值运算符只会改变引用中所保存的地址,虽然原来的地址被覆盖掉了,str指向了一个新的对象,但是原来的那个老对象没有发生变化,他还是老老实实待在原来的地方!!!
玖柒的小窝
2021/11/05
4080
你们不要再吵了! Java只有值传递..
java是值传递还是引用传递 知乎_按值调用和按引用调用
最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 Java 中这个题目是有问题的(在下面我会解释)。并且,有很多结论是 Java 中只有 值传递。我认为这样说不够严谨。当然如果针对 Java 语言本身来讲,Java 中只有 值传递,没有引用传递,是正确的。但是如果针对 值传递,引用传递的定义来说,Java 中还是有引用传递的。下面来分析:
全栈程序员站长
2022/11/03
9860
java——值传递和引用传递
我们可以看到valueCross方法执行后,实参age和weight的值并没有发生变化,这是什么原因?
说故事的五公子
2019/09/11
1.3K0
java——值传递和引用传递
Java 引用传递和值传递
这个问题的关键在于 a,b,x,y 的地址指向; y = x 与 b = a 是不等价的!! 发生改变的是 y 指向的值变成了和 x 指向的相同, 此时 y = AB(因为append方法改变的x原有的值) 而此时 b 的指向并没有发生改变。
星尘的一个朋友
2020/11/25
1.2K0
Java到底是引用传递还是值传递?
首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。 按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式。
黑洞代码
2021/01/14
8210
Java到底是引用传递还是值传递?
值传递与引用传递
“哥,说说 Java 到底是值传递还是引用传递吧?”三妹一脸的困惑,看得出来她被这个问题折磨得不轻。
沉默王二
2021/06/16
1.3K0
值传递与引用传递
从一道没人能答对的面试题聊聊Java的值传递
这是一道我们公司的面试题,从招第二个Java以来就一直存在了。但是面试了这么长的时间还没有一个人可以全部答对,让我们一度以为是这题出的不对。首先请看面试题。
我的小熊不见了丶
2019/08/20
3980
从一道没人能答对的面试题聊聊Java的值传递
图解Java 中的参数传递是传值还是传引用?
值传递:传递的是实参的副本(更准确的说是实参引用的副本,因为形参接受的是对象的引用)
九转成圣
2024/04/10
2440
图解Java 中的参数传递是传值还是传引用?
说说Java到底是值传递还是引用传递
首先,我们必须要搞清楚,到底什么是值传递,什么是引用传递,否则,讨论 Java 到底是值传递还是引用传递就显得毫无意义。
沉默王二
2020/04/23
4630
说说Java到底是值传递还是引用传递
为什么Java只有值传递
值传递: 调用函数时,将实参复制一份传给函数,函数中修改参数时不会影响实参 引用传递:调用函数时,将实参的地址传给函数,函数中修改参数会影响实参。 判断是值传递还是引用传递的标准,和传递参数的类型是没有关系的。
Qwe7
2022/04/01
4830
java栈与堆的区别,队列,数组,链表集合的介绍,java 参数传递是值传递,数组和String作为参数传递的区别,string赋值方式的区别
由java基本类型byte,int,short,long float,double,boolean,char 这八种定义的变量,在java为了追求速度是直接在栈中为期分配内存空间的,不是类的引用.在栈中有个”数据共享”的特性,比如,定义一个int a=3,栈会定义一个变量为a的引用,如果栈中一开始没有3,则栈会开辟一个存放字面值为3的地址.当再定义一个int b=3,栈会创建变量为b的引用,但是栈中已经有了一个字面值为3的地址,所以会出现a和b同时指向3的情况.
全栈程序员站长
2022/06/30
1.6K0
java栈与堆的区别,队列,数组,链表集合的介绍,java 参数传递是值传递,数组和String作为参数传递的区别,string赋值方式的区别
Java中的值传递与引用传递详解
方法调用是编程语言中非常重要的一个特性,在方法调用时,通常需要传递一些参数来完成特定的功能。Java语言提供了两种参数传递的方式:值传递和引用传递。
良月柒
2019/03/20
2.2K0
Java中的值传递与引用传递详解
详解Java中的值传递
如果大家学过c++,那这块肯定是明白的,但是Java中没有引用传递,在编程语言中,将实参传递给方法的方式有俩种就是我们即将要说的,
秋名山码神
2022/12/13
7170
详解Java中的值传递
为什么大家都说Java中只有值传递?
最近跟Java中的值传递和引用传递杠上了,一度怀疑人生。查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递。也搞明白了,为什么大家都说Java只有值传递,没有引用传递。原来,我一直以来的认知都是错误的。。。
烟雨星空
2020/06/16
1.6K0
相关推荐
Java-值传递和值引用
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验