【Java】以数组为例简单理解引用类型变量

news2025/1/15 19:36:21

  我们首先要知道内存是一段连续的存储空间,主要用来存储程序运行时数据的,如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦,就像一个杂乱的房间,你如果想在这个房间里找一个东西的话,找起来就会非常麻烦。但如果是一个非常整洁的房间,里面东西的摆放都十分有序,那找一个东西就会容易很多。

所以JVM也对所使用的内存按照功能的不同进行了划分:比如栈,堆,方法区,程序计数器等等。现在我们只简单关心虚拟机栈这两块空间,后序JVM中还会更详细介绍。

虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量,也就是说,局部变量是存储在上的,当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如数组中new int[]{1, 2, 3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。比如下面这段代码:

number和arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配,但使用 new 创建的对象都是在堆上保存,array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。(假设地址为0x11)

 从上图可以看出来,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该 地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

(这里插一句题外话,我们在学习C语言的时候说指针初始化是Null,Java中null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操 作. 一旦尝试读写, 就会抛出 NullPointerException,在这里也类似:

在这里arr2和a都是局部变量, 可以看到报错了,所以在Java中局部变量必须赋初值。

      这段代码的意思是,arr2这个引用指向任何对象,这样就不会报错了。)

 但是这里还是要注意一个问题:

 当arr2为空的时候,我们是不能进行操作的,否则就会发生异常,上端代码就是错误的,就会发生异常:

 这个异常叫做空指针异常,所以空指针异常的原因是使用了一个值为null的引用。

接下来我们用几道代码题目来感受一下引用类型的变量;

1. 

public class newTest {
   public static void main(String[] args) {
       int[] arr1={1,2,3,4};
       arr1[0]=99;

       int[] arr2=arr1;
       arr2[0]=100;

       System.out.println(Arrays.toString(arr1));
       System.out.println(Arrays.toString(arr2));


    }
}

求输出结果?

答案为:

 我们来看一下这道题目:

 这道题其实arr1和arr2都是一样的值,因为这两个引用都指向的同一个对象。

2.

public class newTest {
    public static void main(String[] args) {
        int[] arr1={1,2,3,4};    //第一步
        int[] arr2={11,22,33,44};   //第二步
        arr1=arr2;                  //第三步
        arr1[0]=1888;

        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));


    }
}

求输出结果?

结果为:

 ​​​​​​

 为什么要再做一道题呢,这一道题和上一道有点区别。这道题是两个引用同时指向了一个对象。

一开始是这样的:

 执行完第三步之后就变成了这样:

 0x11这个对象没人引用他了,这个地方的地址就被系统回收了

 在idea里这个地方变成了灰色,说明这个地方没人用了。

3.

数组作为函数的参数的一道题目:

public class newTest {
    public  static void func1(int[] array){
        array=new int[]{15,16,17};  //第一

    }
    public  static void func2(int[] array){
        array[0]=999;  //第二

    }
    public static void main(String[] args) {
        int[] arr1={1,2,3,4};
        func1(arr1);
        //func2(arr1); 
        System.out.println(Arrays.toString(arr1));
    }
}

这里我们定义了两个方法进行数组的某些操作,分别调用这两个方法后输出数组中的内容。

调用fun1时,输出:

 调用func2时,输出:

在fun1函数时候,刚进入函数时是这样的:

 执行完第一时是这样的:

 所以形参根本操作不了这个数组,只是改变了形参的指向,原数组还是原来的值。

在fun2函数的时候,刚进入函数是这样的:

执行完第二后,此时我们通过这个引用就修改了arr1[0]这个地方的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)

目录 BeanFactory怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)总结 BeanFactory 怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂) 重点:Spring容器,例如Beanfactory其实并没…

人生还需搏一搏,规划指南不可缺

前言 如题我的人生还需要再搏一搏,本篇文章,我将整理指定下个人目标计划,让这篇文章去指引自己去指导自己前进。敲下这一行字想起了高中时期的一段经历,在高一时我准备了一个小本子,按高一到高三每年每学期的期中&…

KeeperErrorCode = NoAuth for /hbase/tokenauth/keys

kerberos配置hbase出現問題 環境如下: 问题描述 想要在hadoop ha的場景上,基於kerberos配置hbase ha,出現了如下的bug org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode NoAuth for /hbase/runningat org.apache.…

C++ 第四弹动态内存管理

目录 1. C/C程序内存划分 2. C语言中内存管理的方式 3. new /delete 和 new[]/delete[] 4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的 5. 定义为new表达式 6. 常见的面试题 1. C/C程序内存划分 1. 栈 又叫堆栈 -- 非静态局部变量 / 函数…

PHP代码审计之环境配置

PHP代码审计之环境配置 前言一、PHP环境配置1.1 phpstudy和phpstorm下载配置1.2 Xdebug 配置1.3 phpstudy 基本使用1.4 phpstorm基本使用1.5 RIPR下载使用 二、代码审计配置文件2.5 PHP的核心配置(php.ini)1. safe_mode2. magic_quote_gpc3. magic_quote…

Maven学习1_将项目打包jar然后上传到GitHub、Nexus Sonatype仓库、搭建Sonatype私服

概述 主要学习记录Maven仓库相关知识,如何借助上传项目jar包到GitHub、Nexus Sonatype,,以及搭建自己的Nexus Sonatype私服,然后在Maven项目的pom文件引入使用,参考Maven官网文档:https://central.sonatype.org/publi…

【SQL应知应会】分析函数的点点滴滴(三)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

HDFS写流程源码分析(一)-客户端

HDFS 写流程源码分析 一、客户端(一)文件创建及Pipeline构建阶段(二)数据写入(三)输出流关闭 二、服务端 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 public void create() throws URISynt…

计网学习记录

ps:答案可能不正确噢。 1.什么是计算机网络体系结构?什么是网络协议?协议的三要素是什么?每个要素的含义是什么? 计算机网络体系结构: 我看书上也没说清啊。。。 (概念磨人啊) 什么是计算机的…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器(更新中)

文章目录 官方文档往期回顾零基础笔记项目实战(已完结) WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式 官方文档 往期回顾 零基础笔记 WPF 零基础入门笔记(0):WPF简介 项目实战(已…

github 代码实战pycharm

文章目录 下载代码配置环境进入环境下载数据集使用pycharm训练模型 下载代码 配置环境 conda env create -f environment.yml 进入环境 conda activate pytorch-CycleGAN-and-pix2pix 下载数据集 搜索download_pix2pix_dataset.sh然后用记事本打开,会发现有一个…

SpringBoot 疫苗接种管理系统 -计算机毕设 附源码83448

SpringBoot疫苗接种管理系统 摘 要 在目前的形势下,科技力量已成为我国的主要竞争力。而在科学技术领域,计算机的使用逐渐达到成熟,无论是从国家到企业再到家庭,计算机都发挥着其不可替代的作用,可以说计算机的可用领…

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)_bdview的博客-CSDN博客 按图索骥---软件的设计图纸 序: 我一直以为,在软件设计中,各种图要比文档重要的多。图可以更加直接的…

RocketMQ 常见面试题(二)

broker如何处理拉取请求的? Broker处理拉取请求的具体流程如下: 客户端向Broker发送拉取请求,请求指定要拉取的主题名称和消费者组信息。 Broker首先会检查该消费者组是否已经存在,如果不存在则会创建该消费者组,并为…

Dubbox是什么,如何整合SpringBoot,有什么优势?

目录 一、Dubbox 是什么 二、Dubbox 如何整合SpringBoot 三、Dubbox 有什么优势 一、Dubbox 是什么 Dubbox是一款基于Java语言的分布式服务框架,是阿里巴巴公司开源的一款服务化治理框架,其前身为Dubbo。Dubbox是针对Dubbo进行了改进和升级&#xff…

akima 插值拟合算法 Python/C++/C版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 C版 实验对比 前言 鉴于“长沙等你”网站上Akima算法文章大部分要VIP观看或者下载,即使是付费也有质量不佳,浪费Money也浪费时间。 笔者根据查到的资料分享给大家。…

第5章 链路层

1、局域网的协议结构一般不包括( ) A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法,正确的是( ) A. 可以检测和纠正双比特差错B…

NodeJS 了解和快速入门 - 实现 http 服务 操作 mysql

目录 1. 介绍 NodeJS 2. NodeJS 快速入门 3. NodeJS 实现 Httpserver 服务 4. NodeJS 操作 MySQL 数据库 1. 介绍 NodeJS 1. Node 是一个让 JavaScript 运行在服务端的开发平台, 它让 JavaScript成为与 PHP, Python, Perl, Ruby 等服务端语言平起平坐的脚本语言, 发布于 200…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

VUE L 表单数据过滤器 ⑨

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs收集表单数据过滤器 使用 C o o k i e Cookie Cookie 影响总结 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹…