前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图说Java值传递原理

图说Java值传递原理

作者头像
程序猿杜小头
发布2022-12-01 21:39:23
4330
发布2022-12-01 21:39:23
举报
文章被收录于专栏:程序猿杜小头程序猿杜小头

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
复制
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
复制
10086
10086

运行原理

2.2 引用数据类型

代码语言:javascript
复制
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
复制
hello
hello, world

运行原理

3 总结

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基础知识回顾
    • 1.1 形参(formal parameter)与实参(actual parameter)
      • 1.2 值传递(pass by value)与引用传递(pass by reference)
        • 1.3 虚拟机栈(jvm stack)
        • 2. 回归正题
          • 2.1 基本数据类型
            • 2.2 引用数据类型
            • 3 总结
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档