内存解析--JAVA

前言

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


Demo入手

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

//Memory
class 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的一个属性改变了。

待续。。。

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值