00:00
行了各位,那咱们接下来就把这个内存图画一下吧,啊,内存图画一下,我们来看一下这个构造方法在执行的时候和这个构造方法在执行的时候,它的内存图是怎样的。啊。昨天好像还有同学问了我一下这个多肽的内存是吧?就是昨天啊,有同学问了一下多肽的内存图啊,多肽内存图这个到时候我我我我给大家画一下啊,就是多肽它的一个内存图是怎样的,其实也很简单啊,很简单,正常画就行啊嗯。行,那咱们接下来把这个程序的内存图画一下啊来。嗯,我把这个画板打开。呃,来把这个保存一份,先保存到这儿吧,Super的原理。啊,Super的原理。那其实super是什么呢,各位?Super啊。代表的是。当前对象的负类型特征啊,这句话你这样去理解啊,是对的。
01:07
字体小一点行吧,别加粗了啊,Super代表的是当前对象的。副类型特征当前对象是啥呀?This是不是?哎当前代表当前对象的什么呢?叫做副类型特征。啊行特征。好了。嗯。在这啊,咱们先把这个GM画出来,假如说这就是那个JVM,哎呀,这个这个图可能有点小,就这么着吧,怎么着吧啊,咱们把线线条画细一点啊,然后这个呢,叫做JVM,接下来JVM3块的空间我肯定得画出来啊,这是一个叫所谓的一个。方法区,然后这个八我再让大点啊。来,然后这个呢,我让它小一点啊小一点。不知道够不够啊,就这么画吧,先来把这块咱们先给它抹掉,来这边呢,咱们叫做什么呀,叫做堆。
02:08
然后呢,这个呢,我们叫做方法区。然后这个呢,我们叫做站各位啊叫做站。叫做占啊,然后呢,这个方法区这块呢,首先第一个它会进行类加载,它会把这个类还有这个类对吧?哎,还有谁呀,还有这个system这个类对吧?啊还有这个类,还有嗯,还有别的,还有object,实际上还有object这个类啊,都给它加载进来了。都加载进来各位啊,注意了啊,你看见的你看不见的,它都加载进来了,来它加载谁呀,它加载这个。叫做super。零几呀,这是。零三是不是点class.class system.class对吧?account.class。然后呢,Credit account.class object点实际上它会把它全部装载进来啊,载装载进来啊,因为有关系啊,因为有关系,所以需要的实际上。
03:13
不只是这几个个位,我只是在图上填多了去了,上百上千个啊,执行一个程序夸你只就你就执行个hello word,它也会上百上千个,这样直接把文件全部装载到我们一个,哎,方法区当中啊,得先把代码拿过来放到这儿啊,当然在这个类加载过程当中,如果有态变量和静态代码块的话,就会执行啊这里啊,我再提醒一下各位啊,就是如果。还记得吧,哎,别学着这块让忘了前面啊,就是如果啊,类加载过程中,这个类有什么静态代码框,有静态变量,一律都会执行分配空间啊,所以这个过程咱们就不再说了,那么再往下呢,这个程序啊,它就开始执行我们的问方法了,那么开始执行问方法,它其实呢,会在这里压站喽。
04:07
对吧?哎,那假如说就压一下吧,你看这就是那个焖方法啊啊画的可能是稍微有点抽象了,各位啊,这个其实就是焖方法战针,叫做焖方法战针好了,那么接下来呢,我们执行第一行代码等号,右边先执行各位执行完之后把这个对象创建出来,付给前面的CAE这个变量啊,付给这个CAE变量,CAE变量实际上是一个什么呀,局部变量对不对,那这个时候一发不可收拾,注意啊,其实只要方法调用啊,他一定会干啥呀,一定会在这压战的。我呢在这里调构造方法压站啊,我就不再给大家演示了啊,就是此图不展示构造方法压站的过程啊,此图不展示来写上啊,此图不展示什么呢?构造方法调用。啊。压站的过程啊,压站的过程啊,直接呢,我就往下画了,各位啊,要能理解,实际上你只要调这个构造方法,那么我们这个无参构造是在这儿。
05:11
对吧,无参构造会去接着往上往上调是不是?哎,那么调谁呀?调我们这个负类的无参数构造方法,负类的无参数构造方法怎么着啊,会继续往上掉,调object战无参构造方法,实际上这是会压站的啊,会压站的会压站我就在这不画了啊,我直接画那个构造方法执行结束之后的结果就是在内存当中,它这个内存堆,内存里边这个对象的这个内存是怎样的啊,我主要画这个东西好吧,主要画这个东西啊,所以此图不展示勾造方法调用压站的过程啊啊注意这个事儿啊,那但是呢,不画不代表没有啊,实际上是有的,因为你构造方法也是方法,你调用方法就一定会压站啊,我只画结果,不画过程啊,不画过程来,你有一个credit count,这个时候呢,Credit count这个构造方法在哪就找找,就这个子类啊,啊,这里其实是有一个什么无的是吧,第一行如果啥也没有的话,它有个默默认的super括号,这个大家还记得吧,哎,默认的super括号啊,来我问大家,这个地方有个默认的super括号,另外这个地方是不是有一个默认的叫。
06:11
this.credit这个无参构造是不是会给credit负一个值叫什么呀?叫0.0吧,是会负一个值啊,会不会啊,这个代码是不是都默认都有啊,各位就你不写他有没有我们之前讲购的方法是不是讲过无参构造,如果大块里边啥也没有的话,会给属性附默认值,大家还记得吗?还记得吗?如果构造方法里边有代码,第一行啥也没写,会有默认的super括号,而这个super括号掉的是负类的构造方法,这些代码你虽然不写,它都有的啊,都有的,好,那么我们就来调一下这个构造方法。那实际上调购的方法,它其实就会创建对象的各位啊,它其实就会创建对象的啊,他在这new的时候,他就把对对象就就创建对象了,实际上是是是这样的啊来new credit count,那么new credit count它会去。
07:01
调用我们的这个super括号,而我们的super括号是谁呢?哎,指的是我们负类的account这个构造方法,那这个构造方法这一块实际上它也有一个什么呀,Super括号你是看不见的,对不对?然后接下来呢,我们在这怎么着啊,哎,This点怎么着啊,哎,它的act number呢,会给默认值一个now是不是,哎,因为呢,这块是无餐构造,Balance这块呢,会有一个0.0。这个代码你看不见,你看不见,你看不见啊,但是它有,它有它真的有啊,这里是有这些代码的,那么紧接着这个super呢,又去调了个类叫什么呀,叫object类当中无参数的方法,所以这个时候它首先在我们内存当中啊,先构建出,构建出什么呀,就是object。呃,我看一下这个图怎么画啊,嗯,这么画可能不太合适用,用什么呢。用这个吧。用这个吧,啊用这个。好,这个其实就是那个初始化出来的object类型的特征。
08:13
啊,初始化出来的object这个类型的特征啊,这个方框是怎么出来的。是你account他继承父类吗?你调这个构造方法的时候,它修括号吗?是不是,哎,他就会把什么呀,把这个object空间给他开出来。明白吗?哎,开出来啊好了妥了,那这个开出来之后呢,接下来啊,它会继续往下走。走到这个位置上。明白吧,This account number this balance,看见了吧?哎,那么这个时候啊,他呢,就会把这个对象的空间开出来。然后呢,给这个对象呢,这个属性怎么着啊,附上值对吧?哎,给这个属性呢,也给它怎么着啊附上值,所以呢,我们内存图上的一个变化啊来我先再给他画一下啊是这样的。
09:07
来,我。往上一点吧,往上一点啊,嗯,这个呢。这样一下。好吧。来。那么接下来呢,这个呢,其实就是谁呀,就是这个叫做。Account啊,这里是初始化出来谁呀?Account。类型的特征。啥意思呢?这里会有一个什么呀,叫act。等于什么呀,哎,那啊。我就简单这样画了,各位啊,然后这块有一个什么呢?哎,有一个。Balance等于0.0。啊,0.0。
10:01
其实我这么画可能不太合适啊。我稍微画的稍微大点,各位啊,这样。稍微大大一截吧,大一截啊。来这个是一种包含关系啊。Account。初始化出来的count类型的特征。等于now,然后在这呢,还有一个balance等于0.0。啊,0.0。注意啊。里边这个。就是object的特征。谁呀?就这个。嗯。这样画吧。
11:01
来。啊,然后呢,接下来呢。实例方法实例方法,实例方法在方法区,这怎么突然问这样一个问题啊,实例方法肯定在方法区,它代码在方法区啊,但你执行过程当中是在站里边压站吗?是不是?那我说一下啊,里边这个方块是怎么开出来的,我再次再次强调一下,是因为啊,你最初不是调的这构造方法,是这个构造方法吗?这个构造方法指的就是它是不是它是不是super括号,而super括号是不是掉的是负类的构造方法,负类的无餐构造第一行又掉object它的构造方法,所以首先第一步它会把object内存空间开出来。这就是那个object类型空间,然后你object开出来之后,就相当于什么呢?我这个super执行结束了,Super执行结束之后呢,我紧接着给我的account number一个none,给我的balance付一个0.0。那这个方法执行结束之后,就相当于把这块空间就开出来了。
12:03
但你这块空间和这块空间是一种包含关系,各位啊,是一种包含关系。是一种包含关系啊,这个是object特征,然后呢,这个是account的特征。注意啊,特征。谁是account的特征啊?来,我画条线啊,就这个。这个是account特征啊,然后接下来这个程序呢。会继续往下走。他这个结束之后。就把这块空间初始化出来,紧接着再往下怎么着呢?哎,它又执行什么呀,哎,我们的。这个代码。对不对,因为你这个super括号呢,是执行了你负类的无参构造嘛,所以这个时候呢,我们就去执行完之后呢,就去执行这个credit count。这个credit account负值是0.0啊,所以这个时候啊,它在这里又初始化出来一个。
13:06
是个包含关系各位。啊来,这是什么呢?这是我们初始化出来的,谁呀叫credit啊,Count类型的特征,这个特征这里呢,就是这个credit叫credit负这个值叫0.0。负了个0.0个位啊,那么。到此为止,这个对象就构建完了。刚才给大家说的这是一个对象的构建过程,那么大家注意,这里它会有一个this。听见了吗?This保存内存地址指向自身是什么意思?就相当于说来这是一个this是吧?来它指向谁呢?它指向他自己。这样画一下啊,它指向他自己,这里边有个this各位啊,那哎呀跑了。
14:05
各位啊,来,紧接着来。哎呀。这图不好画好,那同时这里还有一个super,各位。啊,这里还有一个东西叫。明白吧,实际上谁是super呢?Super其实代表的就是类型特征,当前对象的类型特征。你看。是不是其实你这块寓意当中有没有一个东西叫super啊?也有,而这个super是指向谁呀,实际上是指向这块空间的。这块空间的。哎,要注意注意啊,你看。是吧?那这样的一个过程。
15:00
那我们的对象创建完之后,这个对象整个其实就是一个各位啊,他把这个对象的内存地址给了CAE,而CA是credit count,这个时候呢,我们在这个位置上。是一个CAE变量啊,这个变量里边保存了一个内存地址啊,这个内存地址就是0X什么呀,1234啊,0X1234。看见了吧。那这个0X123的指向谁呢?哎,指向了他。是这样的一个结构,各位啊,结构。看见了吧。好,那我问大家一个问题。呃,这个是不是this的一部分。Super代表是当前对象this的类型特征。
16:00
对吧,所以我问大家。This,它不能出现在静态方法里边,你能吗?Super能不能?也不行,对吧。是不是也不行啊。你不行,你super怎么能行呢?是不是你思考一下啊。好,这个内存图我就先画到这儿,各位啊,就是无参构造这个。
我来说两句