本文共 2080 字,大约阅读时间需要 6 分钟。
最近了解到了内存这块内容,之前学习C#的时候对他的认识只是一点点,当时还在想实例化话的时候,在栈中分配了还是在堆中分配了,这是之前自己对他们的认识:认识不足大家多多建议。今天再次认识到发现自己对这块的内容很感兴趣,以至于按耐不住心情想要写下来~
下面是两个类: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的一个属性改变了。
这篇博客的来源纯属自己的兴趣所然,自己觉得挺有意思的,就像总结下来,希望路过的朋友可以多多指点,同时这也是自己内存学习的一个崭新开始。