kakaisgood
堆栈 jvm 太难懂?买房子总能理解了吧

java零基础入门-面向对象篇(一) 基础类型和引用类型

友情提示:本章开始可能会有部分较深入的内容,不说又不行,说了又很难解释清楚,因为里面的技术细节实在太多太复杂,所以我会屏蔽部分技术细节,只展示当前需要了解的基础知识,避免出现讲了半天还是没人懂的情况。随着我们的知识增长,后面会逐步的将细节补充完整。

学习编程,一定要把思路放开,不能太局限,多多进行思维能力的锻炼才能提高自己的内功。比如我们很常见的买房啊,哪里修商场啊,其实跟我们的内存结构是很类似的。他们都涉及到一个资源规划的问题,来吧,一起来锻炼下思维能力吧。

最近全国除了最火的抢人大战,其实前段时间还有一个东西很火,那就是城市规划。比如我们的首都北京,选择了雄安进行首都功能疏解,其实很多城市都有类似的规划,比如天津滨海新区,深圳前海新区等等。*设立了一个即将开发的新区后,会干嘛?招商引资,首先是大的企业进来修路盖高楼大厦,然后修住宅,再卖给老百姓。我们来看看具体过程。

首先,*画了一个圈,“走过路过不要错过哈,新鲜出炉的地块,各种优惠政策,减税减税再减税,快来看看啊~”,然后一堆大企业蜂拥而上,“给我留一块~”,“我也要~”。然后各种大企业开始修办公楼啊,房地产开发商开始修海景房啊,然后轮到地产开发商要喝了,“走过路过不要错过啊,海景房值得拥有,机不可失,抢到了幸福生活,没抢到继续干活~”。然后轮到抢房大军蜂拥而上了。

 

给我房!!!

 

再来看看电脑内存,其实我们的电脑就是*部门,每一次一开机,就开始要喝,“内存开始大派送啦,需要的快来领啊”,然后各种开机启动的应用程序开始抢内存,什么聊天的啊,杀毒的啊,浏览器啊,当然还有系统自带的功能,统统需要内存。当然,内存不是一开机就分完了的,还有很多是我们启动了新的应用程序才会划分内存给你,比如我们的java。

 

应用程序和系统程序占用内存

 

电脑开机进行的内存免费大派送跟我们的*规划很像,在座的各位都是大佬,内存要多少有多少。然后我们打开java的时候,java也成功的分到了一块内存空间。java这个房地产商跟别的有点区别,他很牛,拿的地很大,他要自己规划自己的地,也就是说它不仅仅要做房地产,他还要修商场,建公园,这个就厉害了~

 

java虚拟机

 

看见没有,系统给了一块内存java ,然后他在自己的一亩三分地上,开始干自己的规划了,这是个很高级的房产开发商。java有个名词叫java虚拟机(JVM),你就可以理解为他是一个虚拟的系统,他干了很多和系统类似的活,系统把内存交给java以后,就由 jvm 来负责规划内存。就像我们上面说的,*部门划了地给开发商,java自己也划地分给他下面的小弟。那么java里面的小弟又是啥?继续往下看

首先我们看看普通人眼里的内存,他就是一块绿色的板子,上面有很多电路,下面有一条金光闪闪的东西,好了,理解完了。

 

普通人看内存

 

再来看看硬件工程师眼里的内存,他就是各种电路啊,电容啊,门啊之类的东西,其实我也不是很懂,大概是这样。

 

硬件工程师看内存

 

接下来看软件工程师眼里的内存,这个图是指分给java的内存,也就是jvm管理的内存。我们只看java这个开发商,自己已经分到的内存,其他软件,系统占用的内存我们不去管他。我们看到 jvm 划分的内存大概有以下这么几个区域:本地方法栈,虚拟机栈,程序计数器,堆,方法区,这些就是 java 自己的小弟了。

 

jvm内存

 

我们看看这些颜色是咋回事,和上面的规划图颜色说明差不多,红色的是 堆,可以理解成商业用地,绿色的是方法区,可以理解成公园,这两个区域的特点是,他们是公共用地,不管哪个小区的居民,都可以来压压马路,看看风景。再看上面的,本地方法栈和程序计数器是灰色,你可以理解为市政设施,每个片区都有警察局,有困难找警察叔叔,我们姑且不去管他,知道就行了。主要看看 虚拟机栈,这个下面简称为栈,这个很重要。我们可以理解成居民小区,每个人只能出入自己的小区,去别人小区可不行,保安不让进。

所以总结一下,堆和方法区是公共的,每个小区的居民都可以去玩,而栈是私有的,不能随便串门的。这个理解到这里就行了。接下来我们讲讲最重要的 栈 和 堆,方法区就是个大草地,暂时不用管他。

基础类型 和 引用类型

我们首先明确一个观念,我们的数据都是存在内存里的,但是不同的数据,在内存中存放的区域是不同的。有的数据存放在栈,有的数据存放在堆。具体谁放在哪,我们首先要明确数据的类型。

基础类型(又叫值类型):我前面讲的都是基础类型,byte,short,int,long,float,double,boolean,char,基础类型全部存在栈里面。

引用类型:数组,类,接口,引用类型变量存在栈,对象存在堆,通过引用确定关系。

基础类型比较好理解,创建的时候往栈里面一丢,搞定,打完收工。而引用类型就比较复杂了,引用类型的变量就是引用,啥叫引用?来吧,话不多,懵的时候就上图

 

内存地址

 

好吧,肯定有同学又要问,内存地址又是个啥?

 

内存地址

 

地址就是找人找东西时候用的,内存地址就是让内存划分的空间有个标记,我通过这个标记可以找到内存。所以引用类型里面存的不是你定义给他的值,而是存的内存地址。那我定义的数组啊,数组跑哪去了?它在堆里面,而这个栈里面存的地址就是堆里面放的那个数组的地址。又懵了?图图图~

 

地址

 

我们将红色箭头干的事,叫做:引用变量指向内存。堆里面的数据,只有当有引用变量指向它的时候,才能存在,如果没人指向堆里面的数据了,就会有一位亲切的清洁工阿姨把他当垃圾处理掉。所以栈里面的变量,红色箭头,堆里面的数据这三个东西是一体的,他们不能分开。他们在一起,才是定义了一个完整的引用类型。

其实这一段对于初学者来说是有难度的,概念比较多,步骤繁琐,图也都是平面图,有没有更加通俗易懂的方式来解释这个问题呢,来吧,本教程独家三维图双手奉上。

栈是一种数据结构,他的特点就是先进后出,后进先出。只有栈顶可以操作,栈底是固定的,插入操作又叫入栈,删除叫出栈。理解这么多就可以了。

 

栈结构

 

入栈

 

出栈

 

相对于栈的有序,堆是无序的,可以理解成随机划分一块空间来储存对象。

 

堆是无序的

 

我们用三维图再来看看刚才的例子

首先是基础类型

定义变量入栈

再来看引用类型

定义变量开辟空间,建立引用

 

本篇文章为接下来的数组,类打基础,堆和栈的理解对我们更好的学面向对象很有帮助,请好好理解,多多参悟。

分类:

技术点:

相关文章: