深刻理解Java知识中的堆和栈

在Java语言的学习过程当中最重要的就是理解好堆和栈,由于java的面向对象特性跟堆和栈的分离密切相关,因此细致深刻地理解。
1.我不知道有没有人会疑惑,为何java要把堆和栈分开呢?堆能存储东西,难道栈就不能了吗?在运行的时候不就是把数据放在栈中吗?
(1)是的,确实是这样的,正如以前所说的栈是负责运行时的,而堆是负责存储信息的。不知道你们有没有了解设计模式里面的一些原则,其中有一条的为对象之间的松耦合而努力,在用在这里一样适用,把栈和堆分离开来,可使处理逻辑的条理更加清晰,这种原则我以为在设计软件的时候要注重,套用一个词就是分而治之,后面讲到的垃圾回收是否是就变得可行了呢?
(2)从线程共享的方面来看,堆和栈的分离,可使堆的信息是线程共享(或者说是栈共享的)的,这样就为多线程同时访问一个对象提供了可能。而这样方式对于数据交互是有效的(经过共享内存),并且堆中的共享常量和缓存能够给多个栈访问,节约了空间。
(3)套用某个大神的话来讲,面向对象就是栈和堆的完美结合。这个怎么理解会比较好呢?认真的想想,咱们平时通常建立一个对象是否是就是把事物的特征抽象出来,可是调用方法呢?是否是就是至关于处理一个个的逻辑,既然是逻辑是否是就是跟栈密切相关?因此说面向对象的实现跟堆和栈的结合是分不开的。java


2.咱们还须要重点记住的就是,在java中程序的入口必定是Main函数, 也就是栈的起点,由于咱们都是在栈中处理逻辑的。
3.接下来,咱们就要想想了,到底堆中存的是什么?栈中存的是什么?
对于堆中要存的数据,我以为你们闭着眼都会,不就是一个个的对象吗?那么栈中存的是什么呢?其实就是基本数据类型,以及对堆中对象的引用,这样来讲是否是就清晰了一点。
4.Java中的参数传递时传值呢?仍是传引用?
(1)若是要理解这个,我以为须要明白的一点是,在java中是没有指针这个概念的,可是不要认为java中就没有使用到指针。
(2)java的程序是在栈中运行的,在传递参数的时候,栈中只存在传基本类型和对对象的引用的问题,并无传对象的自己。
明白了上面的两个原则,我以为上面的问题就不难解答了,可是咱们还须要注意的一点就是,传递的参数若是是基本类型的话,就不可以更改他的值,若是传的是对象的引用,咱们能够改变对象里面的属性,成员变量等。换而成一句话就是一个基本类型不能改变,可是有不少个基本类型组成的对象确实能够修改。
 设计模式

相关文章
相关标签/搜索