从JVM角度对java中引用的理解

学java这么久了,对java引用越来越深刻,好好梳理一下下面三个问题,带着问题进行理解。

什么是引用?引用存放在jvm哪个区域?

引用是一种变量类型。引用类型占四个字节。

变量类型分为基本类型和引用类型。

我们知道java中有8种基本数据类型+Sring引用类型:byte,short,int,long,float,double,char,boolean。

引用类型一般为实例对象的引用。可以理解为该对象存放的地址。注意引用和对象时不一样的。

举例:

java 复制代码
public class Test {
    private Object instanceVariable = new Object();
    private int instanceVariableInt;

    public void method() {
        Object localVariable = this.instanceVariable;  // 假设程序刚执行完这一行
        
    }
}

上面的new Object()为实例对象,存放在堆中。instanceVariable 为引用类型,作为实例的一部分也存放在堆内存中。

上图的localVariable 也是引用类型,他是局部变量的引用类型,存放在虚拟机栈的栈帧中。

参考:java 成员变量中的引用类型变量如何保存?

引用和地址区别?

java地址:java规范中没有地址的概念。如果不讨论jvm的实现,就没有这种概念。

深入理解:如果深入研究。地址和引用的差异是由GC造成的。特别是引用具有重新定位对象的能力。而地址是基本不会变的。

举例:

假设内存中有一个实例对象object,地址为10050。在GC之后,指向object的引用仍将指向object。但是object并不在原来的位置了。

参考:https://stackoverflow.com/questions/68814098

java函数是值传递还是引用传递?

java中参数列表中有两种数据类型,一种是基本数据类型一种是引用数据类型。在java函数中实参和形参之间的传递是值传递!(引用对象传递的是引用值,并不是说传递的是引用就是引用传递)

基本数据类型

基本数据类型在实参传递给形参的过程中,实参将值复制给形参,形参是存放在栈帧中的局部变量表中的,无论如何修改只会修改形参的值,不会影响到传入的实参。

引用数据类型

引用数据类型传参的过程中,实参传递给形参的是引用数据类型的值。对形参引用数据类型本身操作是不会影响到实参的。但是对形参引用指向的内存数据进行操作。会影响到实参。因为实参和形参引用指向的是同一块内存(存放的是对象)。

java 复制代码
public class Test {
    public static void adds(Integer i){
        int val = i.intValue();
        val += 3;
        i = new Integer(val);
    }
    public static void main(String[] args){
        Integer j = new Integer(0);
        adds(j);
        System.out.println("输出值为:" + j.intValue());
    }
}

答案:0

分析:形参 i是引用数据类型,函数中对形参i进行了变换,引用类型i发生了变化,但是该引用指向的数据没有发生变化。因此主函数中的实参j指向的内存不变,值也不变。见下图:

相关推荐
IT二叔12 分钟前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
yongche_shi24 分钟前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he28 分钟前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
超级数据查看器1 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
AI行业学习2 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
折哥的程序人生 · 物流技术专研2 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai2 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
大圣编程3 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
硕风和炜3 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
upgrador3 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++