Java内存分配及值、引用的传递

2023-05-16

关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文:

一、内存区域类型 

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);
3. 堆:存放所有new出来的对象;
4. 静态域:存放静态成员(static定义的);
5. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;
6. 非RAM存储:硬盘等永久存储空间 (摘抄地址:http://blog.csdn.net/clam_clam/article/details/6829960)

二、栈中放的东西,图示:

  int  i  =2;//基本类型变量的数据
  
  String s="abc";//s为引用
String s1=new String("a");//s1也是引用

  

三、堆存放示意图:

对于String类的对象特别说明一下:

 


String a="abc";//代码在执行后在常量池中创建了一个值为abc的String对象;
String b="abc";//执行时,因为常量池中存在abc,所以就不再创建新的String对象了
String c=new String("xyz");
String d=new String("xyz");
/**
*class被加载时,"xyz"被作为常量读入,在常量池中创建了一个共享的值
*为"xyz"的String对象;然后调用到new String("xyz")的时候,会在堆里创建这个String("xyz")对象。
*/
String s1=new String("xyz");//创建了两个对象(一个在常量池中,一个在堆中),一个引用(栈中)
String s2=new String("xyz");//创建一个对象(堆中),一个引用(栈中)
String s3="xyz";//创建一个对象放在常量池中,一个引用(栈中)
String s4="xyz";//创建一个引用,指向"xyz"  

 

四、按值传入还是引用传入

理解了堆栈数据存储,再来理解一下值传递和引用传递的概念;

1、基本类型:


public class ChangeGender{    
public static void change(String gender) {
        gender="女";
        System.out.println("手术期间: gender= " + gender);
    }
            public static void main(String[] args) {
            
            String gender="男";
System.out.println("变性前"+gender);
change(gender); System.out.println(
"变性后:"+gender); }
输出结果:
变性前:男
手术期间:女
变性后:男

经过了痛苦的手术后,发现自己还是个男的,这是为啥?换个写法你就懂了:


public class ChangeGender{    
public static void change(String girl) {
        girl="女";
        System.out.println("手术期间: gender= " + girl);
    }
            public static void main(String[] args) {
            
            String boy="男";
            System.out.println("变性前"+boy);
            change(boy);
            System.out.println("变性后:"+boy);
}
输出结果:
变性前:男
手术期间:女
变性后:男  

懂了吧,传给change()方法的参数值由boy传递,传完就由girl这个变量来处理了,手术期间的那个值是girl这个变量的值,手术前后的那个值是boy的。这个过程可以用一个故事总结一下:一个男人不想做男人了,准备做手术换个性别,于是打电话给快递小哥(变量boy)把他送到医院手术台上,快递小哥见到医生后,把那个男的交给了会变性的医生(方法change()),快递小哥就走了(快递小哥还是快递小哥),医生开始工作,把他的性别变成女的(girl="女"),那个男的确实手术成功了,只是我们打印的变性后的属性是快递小哥的。故事结束,完美!

2、引用传值

引用要这样来理解:它是一根绳子,它系着一个球(对象),但它不是球(对象),我们想找到球(对象),就得先找对应的绳子。

看栗子:


public class User {
    private String age;

    public void getGirlAge(User user) {
        user.setAge("18");
    }

    // getter、setter方法
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public static void main(String[] args) {
        User user = new User();//创建一个新的User对象
        user.setAge("20");//设置年龄 
        user.getGirlAge(user);//调用User的save()方法
        System.out.println(user.getAge());//输出年龄 

    }
}  

输出的结果是什么?

18

为啥是这个结果,还是来说个故事,你同学给你介绍对象,说这姑娘白白嫩嫩,漂亮地一塌糊涂,你说好呀好呀,那她多大呀?你同学是马大哈,记不得年龄,就跟你说20岁(user.setAge("20")),然后你说确定吗?我才19岁,年龄大的一概不考虑,于是你同学就去找她的年龄(public void getGirlAge(User user)),得到了年龄并把这个年龄保存在大脑中(user.setAge("18")),然后打电话跟你说的时候,把年龄的信息从大脑里拿出来(user.getAge()),18岁是你可以接受的年龄,于是你们就安排见面了...再一次,完美。

那再加个东西,你们看看:


public class User {
    private String age;

    public void getGirlAge(User user) {
        user=new User();//创建新的user对象
        user.setAge("18");
    }

    // getter、setter方法
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public static void main(String[] args) {
        User user = new User();//创建一个新的User对象
        user.setAge("20");//设置年龄
        user.getGirlAge(user);//调用User的save()方法
        System.out.println(user.getAge());//输出年龄

    }
}  

这里输出的值是20,看来对象是谈不成了,这过程中到底发生了什么呢?原来是你的同学找那个姑娘的年龄的时候,发现那个姑娘把你同学拉黑了,你同学好面子,还是得给你介绍,于是又找了一个新的姑娘(user=new User();),还把年龄设成了18岁,你等啊等,等了半年也没等到,于是你开始着急了,想知道这个姑娘的年龄到底是多少,于是打印输出姑娘年龄,可是这个姑娘还是第一个姑娘(你也根本就不知道还有第二个姑娘),得到的就是20,年龄虽然比你大一点,可是半年时间,你也想清楚了,年龄大一点体贴也挺好。于是。。。好了,依然完美!

就扯这么多,堆栈中放的东西都是固定的,大家记忆一下就好,很简单的。

 

转载于:https://www.cnblogs.com/bossen/p/5830264.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java内存分配及值、引用的传递 的相关文章

  • Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activa...

    Unable to resolve service for type 39 Microsoft Extensions Logging ILogger 39 while attempting to activate 39 xxxxx Cont
  • python的两种运行方式

    python有两种运行方式 xff0c 第一种是交互式 xff0c 另一种是脚本式 xff0c 这里可能郁闷了 xff0c 啥叫脚本 xff1f xff1f 脚本可能会想到不重要的 xff0c 边角料啥的 xff0c 我们可以认为是一个大型
  • 机器人ROS系统学习随笔->2 RPLIDAR激光雷达使用

    一 驱动的安装 SLAMTEC官网下载激光雷达资料 xff1a http www slamtec com 本人用的是RPLIDAR A1的激光雷达 在下载界面下载相应的资料 xff0c sdk与固件及其他 二 安装 1 建立工作空间并编译
  • 蓝牙飞控数传套装(适合APM/Pixhaw/Pixhack/Pixhawk2飞控)

    SSC FK BL900是迅瞻电子初创的一款蓝牙 43 射频模块一体的飞控数传套装电台 xff0c 它内嵌入Digi的900HP模块和蓝牙模块 xff0c 对外提供XT60的电池供电接口 xff0c 支持5 28V的宽电压工作 xff0c
  • VC++ 编译过程

    一 前言 一开始编译C 43 43 代码的时候可能会对编译的错误觉得很难理解 xff0c 搞不清楚究竟是哪里错了 了解编译过程 xff0c 能够更好的处理编译错误 二 名词解释 编译单元 xff1a 当一个c或cpp文件在编译时 xff0c
  • PLC的ST编程方式--文本编程,简洁啊

    一 ST语言介绍 发现网上PLC的ST编程资料极少 不过 xff0c 道理也很简单 xff0c 因为做PLC的基本都是电气出身 xff0c 梯形图类似于继电器逻辑 xff0c 比较接近他们的习惯 ST属于文本编程 xff0c 符合程序员的习
  • stm32气压传感器 带探头的_基于STM32的真空度的测量装置的设计

    阮敬华 43 张忠伟 43 徐沛 43 李雪莲 43 阚茹男 摘 要 xff1a 采用USART串口通信 SPI通信作为核心技术 xff0c 通过气压和温湿度传感器对环境的真空值 温湿度参数进行数据采集 xff0c 将采集到的数据通过SD卡
  • Python 迭代器

    一 迭代器 迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 xff0c 直到所有的元素被访问完结束 迭代器只能往前不会后退 1 1 判断一个对象是否可迭代 可以使用 isinstan
  • EasyPlayerPro Windows播放器进行本地对讲喊话音频采集功能实现

    需求 在安防行业应用中 xff0c 除了在本地看到摄像机的视频和进行音频监听外 xff0c 还有一个重要的功能 xff0c 那就是对讲 EasyPlayerPro win为了减轻二次开发者的工作量 xff0c 将本地音频采集也进行了集成 x
  • 大端法、小端法、网络字节序

    关于字节序 大端法 小端法 的定义 UNXI网络编程 定义 xff1a 术语 小端 和 大端 表示多字节值的哪一端 小端或大端 存储在该值的起始地址 小端存在起始地址 xff0c 即是小端字节序 xff1b 大端存在起始地址 xff0c 即
  • 阿里云安全肖力:云原生安全构筑下一代企业安全架构

    34 数字经济的发展驱动越来越多的企业上云 xff0c 每个企业都会基于云原生安全能力构筑下一代企业安全架构 xff0c 完成从扁平到立体式架构的进化 xff0c 届时云原生安全技术红利也将加速释放 xff01 9月27日 xff0c 阿里
  • Vue 自定义按键修饰符

    如点击F2 触发某个事件 lt input type 61 34 button 34 name 61 34 34 id 61 34 34 value 61 34 添加 34 64 keyup f2 61 34 add 34 gt 自定义全局
  • android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    android Studio keytool 39 不是内部或外部命令 xff0c 也不是可运行的程序 或批处理文件 遇到这个问题好久了 xff0c 一直没解决今天搜集了大量的资料 xff0c 有的说什么Java没配置好 xff0c 不是扯
  • java -jar 运行springboot项目时内存设置

    java Xms64m JVM启动时的初始堆大小 Xmx128m 最大堆大小 Xmn64m 年轻代的大小 xff0c 其余的空间是老年代 XX MaxMetaspaceSize 61 128m XX CompressedClassSpace
  • Jupyter notebook 读取文件的问题

    Jupyter notebook只能打开当前目录下的数据集 xff08 txt CSV等 xff09 xff0c 所以需要把数据集倒导入到当前目录下 xff0c 导入的方法是 1 文件不大时 直接上传文件 pd read csv读取 2 文
  • MIUI目前为止最简单安装谷歌服务框架教程

    安装谷歌服务框架方法有很多 xff0c 比如用第三方 rec卡刷gapps包 用第三方工具安装 然而这些对于新手来说还是比较难的 xff01 我今天说的方法可以说是最简单的 xff1a 1 不需要修改文件 xff1b 2 不需要借助第三方软
  • 用docker安装emby的详细步骤

    搭建个人存储服务器NAS xff0c 媒体播放器少不了 群晖自带的Video Station据说没有Emby Plex好用 Plex是收费的 xff0c Emby是开源的 本文看似很长 实际上有一半篇幅是关于设置 亲测 xff0c 那些设置
  • ubuntu 下通过ftp命令下载文件

    连接 ftp 192 168 180 2 Connected to 192 168 180 2 Name 192 168 180 2 rivsidn admin Password 获取远端文件 ftp gt get test pdf loc
  • pycharm安装到32位操作系统

    在32位操作系统中安装pycharm过程中发现的一些问题 首先是下载了最新版本的pycharm安装后打开 xff0c 弹出未发现可执行的文件 xff0c 然后想到了其他的办法 1 下载最新版本的pycharm不能直接运行 xff0c 因此可
  • 遗忘的初境

    农历八月深夜的黎明朦胧昏黄 xff0c 林立在山雾中的坟地貌似并不太平 xff0c 白露轻风清不走香纸白烛烟气 这层孽障将要带着旧尘怨气破土而出 筹谋着一场突击 这支躲藏在大山幽月中的乡村透着光亮 一双双眼睛凝视着挂在横梁上昏暗的煤灯 泛白

随机推荐

  • 2019-2020-1 20175313 《信息安全系统设计基础》第二周学习总结

    目录 一 教材学习内容总结二 教材学习中的问题和解决过程三 心得体会四 学习进度条五 参考资料 一 教材学习内容总结 第二章内容 基本知识 重点和难点 二 教材学习中的问题和解决过程 问题1 xff1a 对教材49页上的代码进行验证时 xf
  • centos下通过conda安装pytorch

    一 安装anaconda anaconda安装简单 xff0c 只要确定自己的系统即可 xff0c 具体安装请参考这里 二 确定自己的系统版本 我的是centos cat etc redhat release 查看linux系统方法 xff
  • 论文中表格跨页处理

    https www jianshu com p 96a370384459 上面是跨页表格中带有表头的 我希望的样子是跨页不带表头并且第一张表有下横线 xff0c 第二张表有上横线 xff0c 第二张表头有 表XX XX xff08 续表 x
  • Aria2在Windows上如何安装配置使用

    一 下载所需的软件二 安装与使用三 Aria2的额外内容四 Aria2的使用五 Aria2与其它插件配合使用 一 下载所需的软件 可以从一下地址获取最新版本 GitHub xff1a https github com aria2 aria2
  • 银河麒麟操作系统常用问题及解决方法

    银河麒麟操作系统作为国内安全等级较高的国产操作系统 xff0c 很多用户都想自行安装体验 xff0c 自行安装很有可能遇到一些问题 xff0c 现在奉上可能遇到的问题及解决方案 xff0c 用户可自行查阅处理 xff01 xff01 常用问
  • 几种方式加速网页视频播放速度

    现在有不少视频网站 自带了播放加速功能 例如油管 bilibili 慕课等等 节省了很多看视频的时间 特别是看一些技术教程类的视频 不管是念ppt还是手把手演示 在自己付费的一些网站中 一些是自带播放器不支持视频加速的 因为已经被加速惯坏
  • dataframe指定位置插入行

    1 loc 函数可以定位行后 xff0c 并直接赋值插入 如下可见loc函数对直接改变原来行的值 df 61 pd DataFrame 39 动物 39 39 狗 39 39 猫 39 39 兔 39 39 数量 39 3 4 6 prin
  • Linux系统备份与还原

    Linux系统备份与还原 1 整盘备份与还原 1 1 记住几个这里要经常用到操作1 2 整盘克隆的方法 2 推荐 非整盘克隆的方法 2 1 备份系统2 2 还原系统 1 整盘备份与还原 1 1 记住几个这里要经常用到操作 查看存储设备 xf
  • VS2013如何添加LIb库及头文件的步骤

    在VS工程中 xff0c 添加c c 43 43 工程中外部头文件及库的基本步骤 xff1a 1 添加工程的头文件目录 xff1a 工程 属性 配置属性 c c 43 43 常规 附加包含目录 xff1a 加上头文件存放目录 2 添加文件引
  • composer.json和composer.lock到底是什么以及区别?

    composer方文档 xff1a https docs phpcomposer com 04 schema html 我们在做项目的时候 xff0c 总是要安装一些依赖 composer给我们提供了很多方便 直接运行composer in
  • VUE npm run build的项目出现跨域请求的问题npm run dev没有这个问题

    报错信息 Access to XMLHttpRequest at 39 http platformapi test lih elearning cn api v1 login 39 from origin 39 http www vue c
  • PHP message:filesize(): stat failed for 错误

    PHP message filesize stat failed for 错误 message filesize stat failed for F s2017 SinaImgUpload SinaImgUpload bin Debug T
  • PHP 开发者如何做好密码保护 & Laravel 底层密码存储和验证实现

    随着在线攻击的增多 xff0c 密码安全越来越重要 作为开发者我们要担负起安全管理 计算哈希和存储用户密码的责任 xff0c 不管应用是简单的游戏还是绝密商业文件的仓库 xff0c 都要做到这一点 PHP内置了一些工具 xff0c 让保护密
  • python 列表中的数字转为字符串

    1 list1 61 1 2 3 4 5 list1 61 str x for x in list1 2 list1 61 1 2 3 4 5 list1 61 list map str list1 转载于 https www cnblog
  • 恩尼格码的发明和破解

    恩尼格码是二战德军所采用的电子加密机械 其基本组成可以分为三部分 xff1a 键盘 xff0c 转子和显示器 键盘一共具有26个键 xff0c 类似于今天的计算机键盘 xff08 显示起见 xff0c 省略为6个 xff09 转子实际上有3
  • 得力D991CN Plus计算器评测(全程对比卡西欧fx-991CN X)

    得力在2018年出了一款高仿卡西欧fx 991CN X中文版的计算器 xff0c 型号为D991CN Plus xff0c 在实现同样功能的前提下 xff0c 网销价格是卡西欧的三分之一左右 但是这款计算器与卡西欧正版计算器差距是大是小 x
  • 网络机顶盒固件提取、编辑和打包

    提取的话 xff0c 这边有一篇文章可能有用https www znds com tv 649509 1 1 html 首先下载下载来的固件一般是img格式的 xff0c 可以到hdpfans com这个连接下载一个androidTool的
  • 从微软官网下载VisualStudio离线包

    首先要下载VS安装器 xff0c 有社区版 专业版 企业版 xff0c 此处以社区版为例 不同版本的VS xff0c 只需要将cmd命令中exe名称换掉就行了 仅C VisualStudioSetup exe layout D Layout
  • 基于STM32之UART串口通信协议(一)详解

    一 前言 1 简介 写的这篇博客 xff0c 是为了简单讲解一下UART通信协议 xff0c 以及UART能够实现的一些功能 xff0c 还有有关使用STM32CubeMX来配置芯片的一些操作 xff0c 在后面我会以我使用的STM32F4
  • Java内存分配及值、引用的传递

    关于堆栈的内容网上已经有很多资料了 xff0c 这是我找的加上自己理解的一篇说明文 xff1a 一 内存区域类型 1 寄存器 xff1a 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 xff1b 2 栈 xff1a 存放基本