00:00
接着啊,再给大家举个例子,这个例子的话呢,相较于前面这两个呢,就难一些了。来我们看一下啊,这里边的话,我定义了一个负类叫做father,里边定义一个变量啊X10,然后构造器当中,我调了当前这个呃方法啊,叫做print方法,然后呢,将X呢重新复制为20。然后这是一个负类对吧,嗯,这样我把负类呢,这样。哎,稍微的我帮你这个截一下啊。哎,定义一下我们放在这儿,然后现在呢,我们又定义了一个类啊,这个类呢叫做丧,就是father类的一个子类。这个子类当中我又定义了一个还是X啊,名字跟负类中的这个变量名是一样的啊,这个是允许的啊,然后在子类的构造器当中又掉了这点print,这个print方法被呃把负类这个方法呢做了一个重写,哎里边呢,X复制为40,哎这呢是我们这个子类啊这个操作。那么现在问题来了啊,我把这个放到这儿,把这个放到这儿,嗯,往上一点哈。
01:00
然后大家的话呢,你可以现在把这个屏幕呢,你暂停一下。我现在呢,这个main方法当中是通过一个多肽的方式用了一个萨,然后把它付给了father,输出f.X。那么大家呢,你自己分析一下,你说这个执行的过程当中。如果有哪些语句执行呢?结果又分别是多少呢?是这个结果啊,你看你能不能理解,大家可以暂停一下。分析分析。那这块呢,我们就来给大家解释一下啊,把这个就删掉了,要想解释清楚这个事儿啊,大家你单纯的看这个代码呀。是不行的。啊或者说哎呀,我这个Java功底不行,我去学习学习啊,学习什么呢?这个你翻出来Java这个编程思想,或者这个,呃,Java这个课本,哎,你去看是吧,哎这个相应的一些帖子啊,有的时候呢,也很难你会看到呢,讲解这么细致的这个。这个这个相关的一些说明啊,因为每个代码都不一样,这道题呢,你不一定能找到这个原题是吧,那怎么能够清晰的理解这个过程呢,还是得看自己码文件。
02:06
哎,还是得看最金码文件啊,那要想大家能够清楚这个过程,哎,我这样子先把它变得稍微简单一点,我们此时先这样来做,大家先把这个事儿先理解了啊,跟我们这个萨呢现在没有关系,我new了个father,付给个father,然后调f.X先看这个事。啊,怎么来理解好。只跟我们这个类有关系。我现在啊,用一个father。我拟一个它的时候呢,咱们知道在构造器调用之前啊,会有我们这个变量啊,这个成员变量的一个默认初始化啊,是个零显示初始化啊十,然后呢,构造器当中进行一个初始化,这个把它复制为20了。对吧,哎,这样的一系列的一个过程啊,那么此时当我们去啊逆完这个对象的时候,咱们此时比如说先不关注这个事儿,对吧,我们逆完这个对象的时候呢,很显然呢,会执行这句话。执行这句话的时候呢,它需要输出这个发点X这个值是几,那么问一下大家,这个X是零呢,是十呢,还是二二二十肯定不可能了啊,你要说是20的话呢,这有点。
03:09
有点太过分了是吧,你这个先调这个怎么可能是20呢,关键的就是这个结果是零还是十呢。嗯,想一想。哎,跑一下来。好,我们看到这个结果呢,是十对吧,哎这个呢,其实要解释的话呢,就是涉及到这样一个点啊,哎,我们在这稍微写一下,就关于叫哎成员哎变量的一个初始化哎过程,或者叫这个复制过程。这个复试过程的话呢,我们提到有这样几个点,第一个呢,叫做哎,默认初始化。哎,然后第二个呢,叫做哎,显示在初始化。然后接着。啊,这个呢,其实嗯,按照我们先写着吧,哎,构造器中啊初始化。然后再接着呢,来一个四,这个四的话呢,就是有了这个对象之后啊,因为你构造器中初始化相当于叫构造器就造对象了嘛,那有了这个对象之后啊。
04:07
啊可以啊,这个一方面呢叫做哎,对象点属性,前提呢是你这个权限允许啊。嗯,错啊,对象点方法。哎,对象点属性,或者是对象点方法的这个方式。哎,这个对,哎这个成员变量。啊,这个进行。哎,这里边呢,咱们说的这个成员变量啊,哎,这块主要呢,咱们针对的是这个非静态的啊。啊,来说的那静态的那个同样道理呢,就是通过类来叫了啊这个我们就哎不说那个类的事儿了啊啊因为类里边呢,这个构造器之前它就来初始化了是吧。嗯,这呢是我们说这个非静态的啊呃,刚才呢,还想说的这个事是什么呢?这个显输入化呢,跟我们另外的一个,还有一个呢,叫代码块中初始化对吧。
05:02
哎,他俩呢,其实是一个并列关系啊,就看谁先写谁后写了,好,那大家呢去想这个事儿,就我们现在这个解释呢,就通过这个就能说明咱们在构造器当中,既然你调方法了,那调方法之前。哎,就是你调这个方法之,调这个方法其实就意味着你在使用这个构造器初始化了,那在这个初始化的时候呢,是不是我们已经显示初始化了,也就是我们这个X是十已经被负上值了。对吧,哎,那既然你已经被附上值了,那显然呢,我们这个在打印的时候呢,它就是十嘛。没问题对吧,然后接下来呢,我们把这个呢再打开,那由于你已经有了对象了,那构造器初始化肯定已经做完了,相当于你把这个X呢已经改成20了,那这是我们再去执行。那那毫无疑问的这个输出结果,那就是20。啊,应该是比较清楚的,对吧,那这个事儿的话呢,我们没有看这个字节码指令呢,也分析出来了,但如果你要看自节码指令这个事儿呢,会更清晰啊,那这时候我们选中你当前这个他的类啊,我们做一个受。
06:01
哎,查看一下对吧,啊,此时咱们关注的其实就是构造期了吧。对吧,来看这个构造器啊,构造器呢,这块我们对应的叫in这样的一个构造器方法,然后看一下这个code。啊,看下这code啊,首先这里边呢,它加载了一个啊lo啊,就是一个引类型的是吧?哎,加载了一个零啊,就是把这个零这个索引位置上的一个数据呢加载过来,零是谁呢?零看局部变量表零哦是这个这次啊当前的对象啊。那加载过来之后呢,我们调二一下啊,这主要原因我们现在看的是这个in尼的这个方法啊,哎,我们称为呢叫构造器方法,嗯,当然了,里边执行的操作不光是局限在我们这个构造器代码里边啊,还有这个显示赋值也是在这里边操作的。呃,我们说调用一个构造器的时候,首先是不是会有一个修复操作对吧,来调用它的这个负类的这个相关的初始化方法啊,这就调负类的初始化方法的这样一个事儿啊,这个咱们就过了,因为在object当中呢,没有做什么特别的这个事儿啊。
07:01
那接着往下走的话呢,再接着把这个this调过来,我们呢,哎,BI push啊,相当于是一个int类型的啊,因为它这个范围呢不是特别大,用个bad型来表示就行,嗯,把这个十呢换过来。那原来的时候我们这个X呢,其实默认值呢,就是个零嘛,那这里边你把这个十翻过来之后呢,呃,Put field啊,就把我们这个属性X呢,取到做了一个十的赋值,相当于这个时候呢,我们是先附上这个十的,附上十之后呢,我们接下来你看掉了这个print方法。这时候你调普的方法的时候呢,呃,那结果是不是自然而然的就是十了,因为先做的这个操作对吧,然后再往后的话呢,再取出来,然后我们调这个二,呃,再去push一个20给我们这个X,再附上值,就是你这个操作。那这个呢,就比较清楚了。啊比较清楚好,那接下来的话呢,我把这个发字呢,改成是这个丧是吧,改成那个丧的这个之后啊,特点在哪呢?就是我们去拗一个丧的时候,你就好比是现在我们看到假设你看这时候我们这个类呢,是这个father类是吧?啊那时候我们现在要看这个丧这个类。
08:08
然后放到这儿啊,来再做一个。啊,这时候我们看到这个类呢,说的就是这个萨。哎,当前this class这不就是sun嘛,是吧?好,那我们看它啊,这个sun的话呢,我们仍然是看它的这个in的这个方法,这个in尼方法里边,它跟刚才看发的类似啊,他们都会去掉人家的这个各自的负类啊,那只不过这时候这个son的负类呢,是不是就掉到father那了。哎,发这个init不就我们刚才看的那个in吗。OK吧,好来分析一下啊,首先的话呢,我们想去初始化这个散来,那初始化它之前呢,先要执行,就是你要调这个,呃,散构造器为代表的啊,我们是封装在这个引力的方法里了啊,调它的时候呢,先要去把这个来做一个初始化。哎,那做这个初始化的时候呢,刚才做的这个事儿,咱们也都看得到了。
09:02
就是刚才这不在这里边吗。这个不就是吗?哎,做的这个事儿呢,我们也都看得到啊,那关键就是我们现在在一执行它的时候呢,一上来它就执行到这儿了,那这块呢,又调了这个z.print是吧,那这个z.print呢,按说该是这个方法。但是呢,咱们new的是一个子类对象,子类对象呢,把父类这个方法是不是进行了一个重写,那就意味着我们现在啊,你在通过我们这个father去调这个print的时候。哎,这个print方法是不是就开始掉的是这个方法。对吧,哎,那就调这个方法哈,那这个方法里边呢,这个3.x是多少呢?我们看一下。啊,我们这个3.x呢,这个30的这个值,你看是不是在下边才附上了。那就意味着我们在调发的时候,那个30还没有负,那意味着我们这个3.x是不是一上来打印的就应该是一个零吧,那我们跑出这个结果看一下。
10:00
好,大家看到是不是这时候就是零啊,没问题啊,那这个3.x是零,主要呢,就是调这个方法,这个时候我们30呢,还没有参与进来啊,那接下来的话呢,你负类中的这个X复值为20了啊,值为20 OK,那在后边我们就要调这个了,调这个的时候呢,这点printc.print呢是自己的这个构造器,调之前是不是显示的这个复值就执行了,哎,复制咱们刚才说发的时候不也说过这个类似的事儿是吗?这个执行完之后呢,再调这个print的时候呢,打印你自己的这个是不就已经是30了吗?啊,然后接下来呢,又改成40,然后再通过这个F去调,这个呢,我们说属性不存在多态性啊,F去调的话呢,哎,就调的是我们负类中的这个X这个啊这个值,但这个值呢,这不是在这改成20了嘛,哎,所以这个值是20。有点绕是吧,哎,说的稍微有点快啊,大家下来呢再去理解理解,就是要想这个过程大家能够比较清晰的理解它的执行的先后顺序。啊,你不是去百度上找答案了,而是呢,看我们的自解码文件啊,这个自解码文件里边相关的这个呢,叫做操作码,这个咱们下一章讲的是一个重点,那这一章咱们的重点是什么呢?是整个。
11:08
整个这一块的这个结构啊,这里边我们看到有很多的这个信息,尤其是这个常量池这块呢,是我们重点要讲解这个信息,在讲上面的时候呢,很多同学不理解什么叫做符号引用啊,什么叫做直接引用啊,哎,当我们讲的这个常量池之后呢,哎,这个事大家就会比较清晰,好,那通过我们刚才这三个例子。包括呢,我们提到这个自建法文件,它的非常重要的点啊,它是我们,呃,实现编程语言跨平台性的一个本质,对吧?哎,那基于这两个重要的原因,哎,我们要讲解这个自减法文件。好,这呢,就是我们要说的这个事儿啊,关于这三道题呢,大家也可以自己呢,先操作一下,哎,看一看是吧,是不是理解这个过程啊。
我来说两句