00:00
好,那么接着的话呢,我们来看下边这个内容啊,叫做此类对象实例化的全过程,然后这个内容啊,其实看做是针对super关键字的,呃,内容的一个延续了。诶,前面呢,我们讲过这个修复啊,就是我们在调用这个,比如说以check account为例哈,我们在调用你这个此类的这个构造器去创建对象的时候呢,咱们会直接或间接的调用到负类的构造器。啊,然后呢,负类的构造器呢,其实也是同样的道理的,还会直接或间接的往负类的负类里边去掉,那整个这个过程啊,其实我们就可以理解成了是关于某一个类的对象,在创建这个对象的过程当中是一个什么样的场景了。哎,面对的问题呢,其实是这样子的,哎,咱们来举一组代码的例子啊。比如这块呢,我写一个呢,叫a creature。啊,这个叫生物是吧。诶生物类啊好,那么这个类里边呢,我们会声明它相关的啊,这个我就不去写具体了啊声明诶相关的这种叫属性啊方法呀,哎构造器呀,诶它里边都有。
01:02
然后呢,接着呢,我们去声明一个啊,Creature的一个子类叫做animal。让他呢,去继承于。Creature。好,这呢,叫动物类啊。哎,那么这里边呢,它还额外的啊,在复类的基础上啊,定义它自己的这个属性啊方法呀,构造器啊啊这块就点点点就不写了啊诶然后呢,我们再有一个类呢,叫做dog,哎这个dog呢,去继承于。对是吧。哎,这呢,我们这个叫哎狗啊这样的一个类。OK了啊好这呢,就我们有这样的几个层次的这个关系。然后下边的话呢,我们写一个do的一个测试。哎,在这里边啊,哎,Public。Static avoid,来一个main方法。哎,这么着啊好,那么在这个位置的话呢,我去创建一个dog的对象。
02:04
这样是吧,诶我去创建一个do对象行了,那么我们现在关心的点啊,就是这个do的对象在创建的过程当中,诶,涉及到了它的负类啊,负类的负类啊等等这样的一个加载的一个过程。啊,这呢就是我们涉及到的,因为这个dog呢,我们从这个层次关系上来看,它是个此类了啊,那就是此类对象。啊,在实例化的过程当中啊,它的一个整个的一个过程是什么样子的。呃,那么这个事儿的话呢,从这个结论上,或者要从这个结果上来看。实际上的话呢,我们说就是体现为类的继承性。哎,什么意思啊,哎,你看这个呢,我要是描述的话呢,其实我就是在说继承啊,什么意思,就是当我们。哎,创建。叫此类对象时是吧?或者叫当我们创建此类对象后啊,哎,我们就可以啊,或者这个此类对象啊。
03:02
这类对象就。诶,获取了啊,其父类。哎,父类中啊声明的。哎,这个哎,所有的这个呃,属性和方法,然后在权限允许的情况下。哎,可以呢,直接调用。啊,即使呢,不能直接调用啊,那我们这块也说了,我也获取到了。诶,所以这个事儿的话,其实就体现为我们说的这个继承性啊,讲完继承性,当然咱们讲的其实就是这个事儿。那就意味着我们在这个dog啊,哎,接下来你通过这个dog点我去调相关的属性也好,哎,方法也好的情况下啊,只要呢,你在animal里边或者是creature里边定义过的方法,乃至于说属性,只要权限允许,我都可以调。啊,这呢,我们是调的方法是吧,你可以通过呃这个do呢,我去调相关的属性是吧,诶做一个比如说相关的一个赋值是吧,哎,这样的一个场景啊行这呢我就列了,哎这个呢,体现为呢,就是继承性的这样一个特征。
04:02
好,那么呃,过程上来讲,实际上呢,我们就在解释说为什么会有这样的一个特点。哎,我们在创建了一个此类的对象啊,画一个内存图,这呢是占,这呢是堆,这个呢,占里边我们这有个叫do这样的变量,指向了堆空间里边咱们new的这个do这样的一个实体对象了,那么在这个对象里边呢,哎,我们说了啊,它包含的都是属性了,那么这个属性呢,你会发现呢,除了你这个do自己定义的属性之外。哎,副类的属性也会有。副类的,副类的属性也会有。哎,所以这块你看我这就获取了其父类声明的属性和方法,注意这个负类呢,就是它所有的负类啊。啊,你的直接父类animal,还有你负类的负类,间接负类啊,Creature,乃至于说object。哎,都有啊,这呢是我们放到,哎所有的这个属性就都在这儿了。哎,我们呢,能够去,呃说呢,通过继承以后呢,我们就有是因为呢,你这块看到了,它确实存在了,那么这个过程上来讲呢,就是说去解释一下,诶你为什么就存在呢。
05:01
你什么时候加载的呢?啊,因为只有你加载了这块不才有吗。呃,按照我们的理解,你这块呢,只是掉了你子类这个构造器,所以呢,你就把子类这个属性带载过来了,你凭啥父类这块有呢?哎,其实这块就是我们说从过程上来去解释这个结果了啊。好,那么这个过程是怎么回事呢?哎,这个呢,就是说哎,当我们啊,通过这个子类的构造器啊,这个创建。啊,对象时。是吧,哎,这个子类的构造器。啊,一定。啊会,你看这个我的语气哈,是一定会啊,直接或间接的。呃,调用到。啊,其副类的构道奇。而。哎,其负类的构造器。啊,同样。哎,同样啊。会直接或间接的。
06:01
来间接的啊调用到。啊,其。嗯,这咱们怎么讲呢,这个棋的话,如果你都看上这个子类的话呢,那就是棋,哎父类的父类是吧。哎的这个构造器。呃,然后呢,就点儿点儿点儿点儿点儿,那这话我说呢,直到。哎,调用了。对,第二呢,我们这个诶额债这个类中的构造器。哎,勾到起哎为止。哎,这就结束了啊,然后接着的哈,说正因为诶我们调用过啊这个子类啊,所有的啊父类的构造器。所以呢,哎,我们就会将。诶将诶父类中啊声明的这个属性或者是方法加载到内存中,然后呢,供子类的对象使用。啊,对象来使用。
07:00
诶相当于呢,我们讲这个事儿的目的是什么呢?就是给大家呢去解释一下,说这个继承性哈,他在这个内存这个层面呢,是怎么保证它是能够调用的,哎,就是因为呢,它加载过复力的构造器了啊,那么这个事儿的话呢,诶大家可能理解的还不是特别好是吧?诶这呢,我对应的这不也画了对应的这个图,回到我们下边这个啊此类对象啊,实例化的全过程这儿呢,我就把刚才说的这个事儿呢,用一个图表来描述了啊一看呢还挺复杂,这个大家呢,如果理解我刚才说的这个画的话呢,这个图就不用看了啊。好,这块呢,你看我们想说的就是这样的场景,我这块儿呢,用了一个dog啊,在堆空间当中,就是这个橙色的部分啊,是我创建的一个对象,这个对象里边呢,你发现它有一些属性呢,是来自于它自己这个类的,有些属性呢,是来自于它父类中的。哎,这样的场景我们呢,都调用过复类的这个构造器,哎,它就相应的呢,把这个结构呢,就都我们加载到这个堆空间里了。那么我们现在问题就是说,为什么说我们这个调用子类构造器的时候呢,一定会调用到它负类构造器呢,就咱们在上节课讲修时候呢,我也提过这个事儿了啊,咱们再稍微的说一下,比如说像我们这个呢,有三个构造期。
08:08
这三个过道器的话呢,哎,我们前面也已经明确过了。哎,各大企的首行。你要是不写,这次也不写秋窗。那就是super空。是吧,你说行,我不用super空,我自己写好自己写的话呢,你要不写的,这次要不写的super。只能二选一。哎,所以呢,咱们得到的结论呢,就是在一个构造器的首行哈,你不是这次就是super。啊,一定是其中一个。这个明确之后的话呢,这个三个构造器,呃,你这个构造器啊,你不调,你要调super,那就直接翻到负类了,你说我不调行,你调自己的其他的这个重载的好,那这个构造器呢,你要是调负类呢,那你就诶加载到负雷这你说我还不掉,那我行,我就调这个。这个的话呢,没得选了。对,你说我还掉,这次你往哪掉,这都是成个环了。所以他没有办法,他必须得掉这个负类了。所以说你这里边儿,你不管你挑哪个构造器哈,它一定直接或间接的一定会翻到负类这块。
09:05
那负类这块也同样的道理啊,也会呢,一定翻到它的负类,那它也一样道理啊,最终呢,就翻到我们object呢,有个空参的过道期,就叫object小括号。哎,所以这块呢,我们在呃,加载这个子类的时候呢,它其实一定会加载父类的这个结构了,所以呢,我们在内存当中你才会看到呢,有这样的一些属性的加载。啊,注意而且的话呢,还有一个点哈,呃,你说我们这时候呢去,呃,这个相当于掉了一个构造器了哈,加载的时候为什么我们非要强调呢,上来放到首行,不是这次就修呢。因为这里边儿有个要求。啊或者说呢,诶不考虑要求有我们当前这样一个呃现象,我们会发现呢,你上来的话呢,如果掉自己的话呢,自己这块呢,上来就掉这次了,是不是就掉它了。你自己的这个代码其实还没写呢。还没加载执行呢是吧,因为你一上来不就得了吗。哎,那就掉它了,他那一上来又这了就掉它了,它一上来自己还没掉呢,直接就super了,那么问你是他先加载我最终那个dog哈,它是它先加载还是先加载animal。
10:11
对,先加载的animal animal也同样的道理啊,它还没加载呢,是不是先把加载。可这呢,也是,你先别着急,是不是先得再往上翻。所以呢,我们最后看到的是啊,哎,咱们加载了负类的这个结构了,但是这块加载的最终的哎呈现出来呢,是先有负类的加载,它先加载,其次是它,其次是它,其次才是它。啊,所以呢,就是在整个呃,有了这个继承关系以后啊,我们这个加载关系上来讲呢,就是先加载父类,后加载子类。啊,这样的一个场景。这个事儿的话呢,我们到后边讲到这个代码块也好,讲到斯代也好,我们还会去说这个事儿了啊,这个暂且呢,这个事儿我就先不往这块去写了,呃,你现在知道呢,我们刚说的这个啊,说在创建子类对象的过程当中,一定会调用到负类的构造器吗?
11:00
对,这块呢,一定要斩钉截铁说yes。啊,这个呢要清楚啊好,那么接着有个问题说呢,我们创建这个子类的对象的时候,比如我们这块就用的这个dog啊说呢在内存中,呃,是一个对象吗。还是说呢,你看啊,咱们这个里边你掉了是不是算四个构造器啊。或者说至少四个哈,因为你这个animal呢,也可能是不是还调重载的呢,是吧。自己的构造器哈,哎,那能不能说呢,我调过animal的构造器,调过creature的,我调过object,能不能说我造了四个对象。不能对这个一定要注意哈,自始至终咱们内存中啊,就只有一个对象,因为。啊,你就扭过一次是吧。哎,你又这一次呢,其实就是你在创建对象的这个事儿。哎,够大气。其实呢,咱们呃,如果呢,细致的去讲啊,他其实嗯不算是就是真正我们要去细抠造这个对象呢,这一个咱们这一行代码就搞定了啊,其实呢,我们要讲GM的话呢,这一步呢,我们大概能拆成七八步。
12:03
就这一步又分成七八步,他怎么一点点的去分配空间的,先干什么后干什么是吧,这个其实又分的很细啊,那你要是细拆的话呢,呃,严格上来讲,造对象的事儿就是new说了算。构造器呢?主要是用来初始化的。你想它那个名字在我们这个资金码文件里边,是不是都叫做in呀。哎,它主要是用来初始化的啊,哎,造对象的事儿就是你。啊,当然呢,这个对象创建的话呢,你也得搭配上一个构造器,所以呢,我们在最初诶,我这块讲这个构造器的作用的时候呢,诶你看我当时想的是尽可能的把它写的,呃既好理解又呃严密一点啊,就是搭配上它来创建对象。其实找对象就是你的事儿。但你从格式上来讲,光有拗也不行是吧?哎,所以这样理解啊,所以说呢,因为你只有一个new,那进而的话呢,我们其实就造过一个对象,这一定要把握住啊,就。
13:01
啊,只有啊一个对象。啊即为啊你当前啊new就你后边的这个构造器对应的对象是吧。哎,对应的这个类的这个对象,哎就可以了啊。好,这呢,就是咱们说这个此类对象实例化的全过程,这个事儿的话呢,大家了解一下就行哈。啊,其实呢,大家这个听完以后的话呢,最终留下来的点,其实就是继承性。啊,你知道呢,只要权限允许,我们就能调。就行了啊。
我来说两句