首页 > 系统相关 >Day18:值传递和引用传递的内存分析

Day18:值传递和引用传递的内存分析

时间:2022-11-21 10:23:03浏览次数:37  
标签:10 Day18 传递 内存 方法 public change

值传递和引用传递

首先我们先回忆一下数据类型:

Java中数据类型分为基本类型和引用类型,其中引用类型涉及到对象的建立。

从内存角度分析的话,基本类型存放在栈内存中,而对象则是存放在堆内存中。

  • 值传递

public class Demo{
    public static void main(String[] args){
        int a=1;
        System.out.println("调用方法前的值:"+a);
        change(b);
        System.out.println("调用方法后的值:"+a)
    }
    public static void change(int b){
        b=10;
    }
}
//运行结果
调用方法前的值:1
调用方法后的值:1

我们发现在方法执行后运行结果都是一致的。

但按常理来说,我们的数据在经过方法的改变后,值会发生变化。

这里涉及到Java在方法执行时根据参数类型不同而产生的不同的传递方式。

让我们从内存的角度出发来进行分析

  • 引用传递

public class Demo{
    public static void main(String[] args){
        Dog A=new Dog();//类实例化
        System.out.println("改变前A的名字:"A.name);
        change(A);//调用方法
        System.out.println("改变后A的名字:"A.name);
    }
    public static void change(Dog a){
        a.name="工地佬"
    }
}
class Dog{//我们创建一个狗类
    String name;//加上一个名字属性,但不予以赋值
}
//输出结果
改变之后前的名字:null
改变之后的名字:工地佬

我们发现经过change方法的执行,Dog的名字从null变化为了工地佬,为什么这一次的方法改变了我原有的值呢?

对比上面的值传递的数据类型,我们发现,我们这次传参的数据类型为引用类型,我们是将一个对象作为了参数;

从内存的角度分析:

对象是存放在堆内存中,方法和变量名是存放在栈中。

当我们创建一个对象A时,在栈内存里面就存放了一个变量名A,在堆内存中即开辟了一个新内存来存放对象的属性,每个内存在堆中都有自己的地址,而A则含有属于它的对象的地址;当我们把对象A作为参数在方法运行时,A把地址给了方法,方法则根据地址来到堆内存对对象执行方法,如果对象被改变,则A也发生变化。

再举一个不恰当的例子:

值传递:甲有10元钱,乙知道后,把自己的10元钱换了两张5元的;乙换完之后并不会对甲的钱有什么影响;两者完全互不相干

引用传递:甲有10元钱,乙知道甲存钱的地址之后,把钱换成了两张5元的;乙换完之后甲的钱从10元变成了2张五元的;甲被影响到了,他的钱变了

标签:10,Day18,传递,内存,方法,public,change
From: https://www.cnblogs.com/CQliuwei/p/16910532.html

相关文章

  • 使用nm分析eCos应用的内存使用情况
    eCos是开源免版税的抢占式实时操作系统。其最大亮点是可配置,与其配套的图形化配置工具提供组件管理、选项配置、自动化单元测试等。嵌入式系统的内存资源是非常有限的,如果配......
  • 操作系统--内存管理--上
    用户希望的程序:分段放入;操作系统希望的程序:分页存储;单级分页存储会导致分页表的开销大,引出了多级分页和快表的概念:(类似于目录当中的--章--节--和--书签(记录最近访问)--);一......
  • 操作系统--内存管理--下
    内存换入 从缺页中断开始,找到一个物理内存的空页,将目标换进;内存换出(局部性规律--程序局部性原理--数据局部性)内存<-->门店磁盘<-->仓库当门店没有用户想要的货......
  • linux释放buff/cache缓存内存
    echo3>/proc/sys/vm/drop_caches------释放buff/cache缓存内存echo0是不释放缓存echo1是释放页缓存ehco2是释放dentries和inodes缓存echo3是释放1和2中说......
  • Redis系列11:内存淘汰策略
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集......
  • 2.6.3 变量内存单元地址
    变量存储在哪里变量内存单元地址代码实现#include<iostream>usingnamespacestd;intmain(){ intn; floatf; doubled=1.23;//0.0 charc='*'; cout......
  • C# WPF 测试直接绑定依赖属性双向传递是没有问题的
    续这篇测试:https://www.cnblogs.com/huvjie/p/16909290.html测试页面:<Windowx:Class="MyWPFSimple3.MainWindow"xmlns="http://schemas.microsoft.com/winfx/......
  • 使用GDB检测内存泄漏
    使用GDB在malloc和free函数设置断点,并打印分配和释放时的内存地址以及调用栈,然后通过脚本分析分配和释放是否配对来检测是否存在内存泄露以及发生内存泄漏的位置。mingdu.zh......
  • Linux设置虚拟内存
    一、虚拟内存介绍背景介绍Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的......
  • Final Cut Pro渲染文件占用内存太大,一招解决释放更大空间!
    使用FinalCutPro剪辑视频,默认后台渲染,长时间的积累,会有很多无用文件占用宝贵内存,今天来分享解决方法,一起看看吧!方法如下:选中资源库,点击「文件」-「删除生成的资源库文......