大一下学期上完了c++课程,当时自我感觉很良好,认为对面向对象编程已经是身经百战了,但是上了院里HuangYu老师的Java课之后,才发现自己对于面向对象的编程风格的理解只在皮毛,着实惭愧不已。
假设A是一个类名,并且在程序中有定义。
则在c++语言中,“A a;”这一句代码会在方法栈中产生一个对象,并会为它分配内存。而“A a=new A();”这一句代码产生的对象会在堆中,那么对象的物理存储在堆中和在栈中有什么区别呢?
栈对象的优势是在适当的时候自动生成,又在适当的时候自动销毁,不需要程序员操心;堆对象,其产生时刻和销毁时刻都要程序员精确定义,也就是说,程序员对堆对象的生命具有完全的控制权。我们常常需要这样的对象,比如,我们需要创建一个对象,能够被多个函数所访问,但是又不想使其成为全局的,那么这个时候创建一个堆对象无疑是良好的选择,然后在各个函数之间传递这个堆对象的指针,便可以实现对该对象的共享。另外,相比于栈空间,堆的容量要大得多。实际上,当物理内存不够时,如果这时还需要生成新的堆对象,通常不会产生运行时错误,而是系统会使用虚拟内存来扩展实际的物理内存。
在Java语言中,如果只有“A a;”则系统只会在栈中产生一个类定义的声明,而不会给它赋予真正的内存空间,即假如A类有成员,则栈中并不会有成员的存在,那么其实a并不指向任何对象,如果要做到这一点,就必须使用语句“A a=new A();”在堆中产生对象,此时a是一个指向堆中的一个A对象的对象声明。同样的,如果只有“new A();”语句(该语句是合法的!),则只是没有引用指向它,它不能被操控,那么它很快就会被Java的回收机制回收掉内存
附:在Java中,内存分为三类:
1.堆:存放对象
2.栈区:存放基本数据变量以及对象引用
3.方法区:存放静态变量和常量池
tz
2017/2/25夜
于HZAU
原文:http://www.cnblogs.com/acm-icpcer/p/6442550.html