我是一只小小鸟————简单的内存分析。

         无论是学习java还是c或者c++,内存分析都是必不可少的,那我们就简单的聊点内存的那些事儿吧。
        我们前边也提到过,内存执行的过程就在那四大块区域里面,比如我们在方法中定义的局部变量就被放在了栈内存中,当然形参也属于局部变量。说到这里就不得不提到“引用”了,这个是面向对象的基础重点,我们已经知道了“四类八种”的基本数据类型,那么引用数据类型就是除去这八种之外的其他所有数据类型,如我们定义的Person类型或者Car类型等等。于是我们就会想到,引用并不是直接去访问对象,而是像C里面的指针那样通过一个地址去访问它,这和基本类型就不一样了,在内存中我们定义一个整型的变量,如int  n;那在内存中就为n分配了一小块空间,4个字节,其他的基本类型也是一样的,就占一块内存区域;而引用数据类型则是有两块内存空间,一个装引用,一个装对象,这样是不是显得比较笼统,那我们就上图吧,有图有真相~~~
     

       

 

 

 

       

 

 

 

 

 

 

 

 

 

        

       如图所示,我们在main方法中定义了两个C类型的变量c1和c2,当然C属于引用类型了,于是在图右下角的栈内存中为我们的c1和c2分配了两块区域,我们再看赋值号右边的“new C()”,这个对于有一点java基础的热来说并不难理解,new关键字,创建对象用的,“C()”是C的无参构造方法,这个在后边会详解,通过这两条语句堆内存就会为其分配两块空间,用来装我们的这两个对象,因为我们知道new出来的东西都要放到堆内存中,动态分配嘛,然后大家也会看到,每一块空间里面又有两小块区域,这里面放的是对象的属性,每个新的对象都会拥有专属于自己的一套属性,这样才能做到“与众不同”。那有人会问了,你这一个栈内存一个堆内存,二者怎么联系起来啊,其实在图的右下角位置,c1和c2都封存了一套地址,通过这个地址c1和c2就可以指向堆内存中的两个对象,至于这个地址是什么,那不是我们所要了解的问题,就像C里面的指针一样,那是计算机为其自动分配的,我们没必要知道它具体是什么,当然这里的引用地址并非和指针完全一样,它并不是简简单单的物理地址。

       引用这一块也是博大精深的,有些东西需要我们记忆,但理解更为重要。大家要记住一看是引用类型的数据,我们脑子里就要浮现出一个场景,两块大内存,一个栈一个堆,引用放到栈里面,new出来的对象放到堆里面,然后栈里面的引用指向堆里面的对象就ok了,看来编程真的需要我们浮想联翩啊~~~ 

        最后来看一下构造方法,就如上图所示,“C()”就是C的一个构造方法,首先它要与类名一样,完全一样哈,一根头发都不能错,还不能有返回值,这个就是这么要求的。我们还是来看一段代码吧……

int id;
int age = 20;
Person(int _id, int _age) {
		id = _id;
		age = _age;
	}

         这个就是Person类的一个构造方法,方法名和类名一样,无返回值,id和age是我们为Person类定义的成员变量,也就是所谓的属性,_id和_age是定义的两个形参,用于为我们传递数值,Person jerry = new Person(123,23);这条语句可以通过调用Person的有参构造方法得到一个jerry对象,这个对象的id为123,年龄为23,这里的“123”和“23”就是我们实际传递的参数,称之为实参,当调用构造方法时,123传给了_id,23传给了_age,然后_id和_age再分别赋值给id和age,这样就得到了一套特有的属性,它也使得jerry变得独一无二。

         一开始学习这块时遇到了一个很无奈的事儿,构造方法里定义的形参与成员变量一样,于是便经常会遇到这样的语句——this.name=name;当时就很纳闷,这是一个什么东西,完全懵了,就这么一个不算问题的问题,弄得我们完全放弃了治疗。现在我们来看,赋值号左边的name是我们定义在类里面的成员变量,this是逻辑的对象,可以用“.”去调用它的成员变量,赋值号右边的name则是构造方法的形参,用这种方式可以将我们实际传递的值赋给成员变量,从而得到一套属于自己的属性。

         总之,构造方法就是“构造对象的方法”,它与new关键字配合使用就可以得到一个新对象,这里需要注意的就是得到的这个对象实际上是一个引用,因为Person本身就是一个引用类型,因此我们访问的是一个对象的引用,而不是直接去访问的对象。构造方法的扩展与内存分析关系紧密,以后还会再聊的。简单的内存分析之后,即将进入真正的内存世界!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章