前言
最近了解到了内存这块内容,之前学习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的一个属性改变了。
待续。。。
这篇博客的来源纯属自己的兴趣所然,自己觉得挺有意思的,就像总结下来,希望路过的朋友可以多多指点,同时这也是自己内存学习的一个崭新开始。