博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存解析--JAVA
阅读量:4167 次
发布时间:2019-05-26

本文共 2080 字,大约阅读时间需要 6 分钟。

前言

        最近了解到了内存这块内容,之前学习C#的时候对他的认识只是一点点,当时还在想实例化话的时候,在栈中分配了还是在堆中分配了,这是之前自己对他们的认识:认识不足大家多多建议。今天再次认识到发现自己对这块的内容很感兴趣,以至于按耐不住心情想要写下来~


Demo入手

        下面是两个类:BirthDate,Memory,不过说这个之前,假设你知道这些,局部变量是放在栈中的,系统自动分配空间,读取也很快速;实例化的东西是放在堆中的,需要申请空间,系统不知道最后要用多大的地方,我认为也就不能自动分配了;方法中用到的局部变量也是放在栈中的,方法调用完之后,局部变量也就自动回收了。代码如下:

//Memoryclass BirthDate{    private int day;    private int month;    private int year;    //构造函数    public BirthDate(int d, int m, int y){        day=d;        month=m;        year=y;    }    //修改日期的方法    public void setday(int d){        day =d;    }    //返回日期    public int getday(){        return day;    }    public void display(){        System.out.println(day+"-"+month+"-"+year);    }}public class Memory{    public static void main(String [] args){        Memory memory =new Memory();        int date =9;        BirthDate d1=new BirthDate(7,7,1970);        BirthDate d2=new BirthDate(1,1,2000);        memory.change1(date);        memory.change2(d1);        memory.change3(d2);        System.out.println("date:" +date);        //System.out.println(d1.getday());        //System.out.println(d2.getday());        d1.display();        d2.display();    }    public void change1(int i){        i=1234;    }    public void change2(BirthDate b){        b=new BirthDate(22,2,2017);    }    public void change3(BirthDate b){        b.setday(12);    }}

        我们main方法入手,逐句分析一下:

① Memory memory =new Memory();

        因为Memory没有构造函数,实例化出来里面是空的,这里可以正好说一下空和null的区别,空是申请了一个空间,里面什么也没有放,null是连这个空间都没有,内存分配如下:

这里写图片描述

② int date =9;

        局部变量,放在栈中:

这里写图片描述

③ BirthDate d1=new BirthDate(7,7,1970);

        这里声明一个d1,放在栈中,实例化出来的会放在堆中:如下

这里写图片描述

        同时实例化的过程中调用了构造函数:

这里写图片描述

        构造函数调用完后,局部变量自动消失:

这里写图片描述

④ BirthDate d2=new BirthDate(1,1,2000);

        这句和d1是一样的,过程就自动省略了,如下:

这里写图片描述

⑤ memory.change1(date);

        调用memory对象的方法,局部变量i,传入是9,执行前:

这里写图片描述

        设置值的属性,为1234;如下图:

这里写图片描述

        方法调用完后,清除栈空间,这个方法相当于没有起作用:

这里写图片描述

⑥ memory.change2(d1);

        调用对象的change2方法,声明一个BirthDate类型的d1,所以,最初的b指向d1所指的对象,之后重新new了一个对象,b指向了新new的对象,

这里写图片描述
这里写图片描述

         该方法执行完成级之后局部变量b就消失了,跟着指针也会消失,最后没有指针的对象就被回收了。而这个方法也相当于没有什么作用。

这里写图片描述

⑦ memory.change3(d2);

         将d2传进去,如图所示:

这里写图片描述

         调用d2的方法:

这里写图片描述

         方法调用完之后:

这里写图片描述

         这里我们看到对象d2的一个属性改变了。

待续。。。

        这篇博客的来源纯属自己的兴趣所然,自己觉得挺有意思的,就像总结下来,希望路过的朋友可以多多指点,同时这也是自己内存学习的一个崭新开始。

你可能感兴趣的文章
Android开发学习笔记(二)——编译和运行原理(1)
查看>>
初识openstack
查看>>
一位夜深人静后码农的心里独白
查看>>
<转>java jsp JXL调用模版导出Excel
查看>>
MySQL-5.6.13免安装版配置方法
查看>>
Python3.6单例模式报错TypeError: object() takes no parameters的解决方法
查看>>
【Python】从字符串中提取字母字符串的几种方法
查看>>
Eclipse+pydev配置
查看>>
一看就明白的爬虫入门讲解:基础理论篇
查看>>
用图说什么是爬虫
查看>>
AIOPS 自然语义处理之TF-IDF算法详解
查看>>
AIOPS 自然语义处理之TF-IDF代码实现(Python)
查看>>
十个Chatbot框架介绍
查看>>
AIOPS最全讲解TF-IDF算法博文汇总
查看>>
bobo老师机器学习笔记--机器学习基础思维导图
查看>>
AIOPS最全讲解TextRank算法博文汇总
查看>>
机器学习归一化(附Python实现源码)
查看>>
bobo老师机器学习笔记-第三课:机器学习的基本工具
查看>>
AIOPS案例学习-AIOps在业务运维的 最佳应用实践
查看>>
机器学习入门-加载sklearn中数据并用matplotlib进行可视化
查看>>