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

在Java语言的学习过程中最重要的就是理解好堆和栈,因为java的面向对象特性跟堆和栈的分离密切相关,所以细致深入地理解。

1.我不知道有没有人会疑惑,为什么java要把堆和栈分开呢?堆能存储东西,难道栈就不能了吗?在运行的时候不就是把数据放在栈中吗?

(1)是的,确实是这样的,正如之前所说的栈是负责运行时的,而堆是负责存储信息的。不知道大家有没有了解设计模式里面的一些原则,其中有一条的为对象之间的松耦合而努力,在用在这里同样适用,把栈和堆分离开来,可以使处理逻辑的条理更加清晰,这种原则我觉得在设计软件的时候要注重,套用一个词就是分而治之,后面讲到的垃圾回收是不是就变得可行了呢?

(2)从线程共享的方面来看,堆和栈的分离,可以使堆的信息是线程共享(或者说是栈共享的)的,这样就为多线程同时访问一个对象提供了可能。而这样方式对于数据交互是有效的(通过共享内存),而且堆中的共享常量和缓存可以给多个栈访问,节约了空间。

(3)套用某个大神的话来说,面向对象就是栈和堆的完美结合。这个怎么理解会比较好呢?认真的想一想,我们平时一般创建一个对象是不是就是把事物的特征抽象出来,但是调用方法呢?是不是就是相当于处理一个个的逻辑,既然是逻辑是不是就是跟栈密切相关?所以说面向对象的实现跟堆和栈的结合是分不开的。


2.我们还需要重点记住的就是,在java中程序的入口一定是Main函数, 也就是栈的起点,因为我们都是在栈中处理逻辑的。

3.接下来,我们就要想一想了,到底堆中存的是什么?栈中存的是什么?

对于堆中要存的数据,我觉得大家闭着眼都会,不就是一个个的对象吗?那么栈中存的是什么呢?其实就是基本数据类型,以及对堆中对象的引用,这样来说是不是就清晰了一点。

4.Java中的参数传递时传值呢?还是传引用?

(1)如果要理解这个,我觉得需要明白的一点是,在java中是没有指针这个概念的,但是不要认为java中就没有使用到指针。

(2)java的程序是在栈中运行的,在传递参数的时候,栈中只存在传基本类型和对对象的引用的问题,并没有传对象的本身。

明白了上面的两个原则,我觉得上面的问题就不难解答了,但是我们还需要注意的一点就是,传递的参数如果是基本类型的话,就不能够更改他的值,如果传的是对象的引用,我们可以改变对象里面的属性,成员变量等。换而成一句话就是一个基本类型不能改变,但是有很多个基本类型组成的对象确实可以修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,445评论 11 349
  • 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就...
    木有鱼丸啦阅读 3,576评论 0 0
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 7,532评论 2 26
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,582评论 0 11
  • 廖雪峰python 3教程 太好了。。。。 数据类型和变量 转义字符\可以转义很多字符,比如\n表示换行,\t表示...
    喵在野阅读 2,784评论 0 1