00:00
好,下边啊,咱们来看一下,这个叫对象创建的一个步骤,那我这呢,一共写了是有六步啊,这六步呢,主要是从我们这个执行的一个角度来进行一个说明的,那这个这是一个角度啊,另外一个角度呢,就是咱们从这个自解码的一个角度,也可以来进行一个查看来咱们呢,先来说一下这个简单的叫自金码的一个角度,那这儿呢,我写了一个非常简单一个程序啊,这句话呢,这个一而再再而三的出现啊,就整个GM当中,我们这里边测试用的这个代码其实都不复杂,主要呢,就还是我们看这个里边蕴含的这些逻辑对吧,那我这呢,一个main方法就用了一个object,对象没有了,那我们就来看一下,当咱们创建这个对象的时候呢,从自解码的角度呢,它都做了哪些事情?哎,就是这个意思,行,那非常简单,我们只需要呢,把当前这个程序呢,做一个编译。那编译之后呢,我们就得到对应的这个自解码文件,那么接下来呢,咱们就来对这个自解码文件呢,是不是进行一个叫反编译是吧。哎,或者我们叫反解析啊,也可以行,找到我们当前这个自己码文件,我们这呢叫open in啊terminal OK,这呢,咱们前面已经讲过这个指令啊,然后杠P,那我这里边也没有这个私有的结构,所以呢,不加这个杠P呢也没有关系。
01:06
在后边呢,是object的一个test.class好,我们就直接在这看吧,就直接呢回车一下就行,那我这呢是用了一个对象啊,就是这样的一行简简单的这个代码。在这个main方法当中,我们这呢能看到这是关于当前当前咱们这个main方法的一些描述,下边呢,是提到它内部的这个代码呢,关于操作数站呢,它这个深度呢是二,然后本地变量表呢是有两个,呃,因为有一个涉及到我们这个行参的是吧?啊这个参数的话呢,这是一个行,那么主要呢,我们来看它这个逻辑的话呢,就是这样的几行操作。是吧,诶主要就是这样几行操作,或者准确的说呢,应该是我们这里边儿提到的这样几行操作。哎,在这是吧,那首先的话呢,是我们涉及到这个new啊,叫搓作符啊,或者我们叫注级符也行啊,对应的底层呢,是我们一个叫自解码指令,那么这个new的话呢,诶它在做什么事呢?诶你看这里边首先涉及到我们这个景二,景二呢这块你往上找自串常量池就找到了,我们这实际上是一个class object,也就是说呢,我们调用这个new这个操作符指令的时候呢,首先的话,它需要去判断一下我们对应的这个运行时常量值当中,呃,就是我们对应的这个方法区当中,是不是已经把我们这个object这个类啊进行一个加载了,那如果要是没加载的话呢,需要使用这个类的加载器,你把这个Java LA包下的这个object这个类呢,你给它加载一下。
02:25
那这就涉及到我们这个类型的一个加载啊,行,那么加载完成以后的话呢,我们现在要创建一个对象,那这个new还需要呢,咱们此时在这个,哎,这个其实咱们刚才涉及到这是叫堆吧,这叫方法区是吧,那你先把我们这个object类呢,你给它加载过来,然后呢,这个new啊操作符的话呢,还是还会呢,要求我们在这个堆空间当中,你把我对应的这个对象的空间啊开辟好。说这时候能确定下来吗?诶可以确定下来,比如你这里边的一些属性啊等等的是吧,都能确定下来,这里边属性呢,如果像咱们讲的这个,像int呀,Short呀,Bet呀,波尔啊等等,它那都是占四个字节,你要如果这里边还有这个引用类型的啊,比如说有引用了其他的一个,呃,这个引用类型的变量了,那也是占四个字节,像double啊,Long啊,就是八个字节,所以说我们这个堆空间这块,这个对象呢,是空间所占用的大小呢,是完全可以确定下来的。
03:18
那这个不光是做这个事,还要做什么事呢?此时的话呢,你涉及到这些变量的话呢,我们还要进行一个叫零值初始化,比如像波尔类型的那个默认值是false。In呢默认是零,Double呢默认是0.0对吧?诶等等这样的情况,那OK,这呢就是我们说这个new要做的一个事情,然后下边一个叫damp啊这damp呢,其实就是一个呃复制,那wlicate进行一个复制,那就是相当于是把我们这个占空间里边是不是涉及到有这个叫操作数站是吧?操作数站呢,我们一方面呢,是你当前的生成的这个变量的一个引用,然后呢,你把这个引用呢,又复制了一份。那就有两个这个引用指向我们对空间的这个试体啊,为什么要有俩呢?那这个主要目的是因为我们这个一个呢,这个压在这个占底的这个是吧,那它主要是用于这个赋值操作,然后上边这呢,它涉及到我们作为一个句柄啊,去调用相关的一些方法啊,这个大家了解一下,这是我们涉及到这个虚拟指令的时候呢,它的一些具体的设计原则了啊,这个咱们先了解一下就可以了,然后再接下来呢,我们叫invo,呃,Special,这个呢,是我们涉及到方法调用相关的这个指令中的一个。
04:23
啊,这呢又掉了一个景一,你上面看景一实际上呢,就涉及到我们最终目的哈,是要调用咱们object债当中这个叫in内的这个方法,这个方法呢,咱们前面讲这个,呃,虚拟站的时候呢,应该大家也清楚,这呢实际上就是调用咱们object这个构造器是吧?呃,构造器呢,这不是空参的嘛,还是一个wide啊行,那我们调这个构造器的目的是什么呀?因为有可能我们说调的构造器这个咱们当前是空参呢,有可能咱们调其他的一些构造器,是不是有些个型参啊,那所谓这个型参呢,也需要呢及时的啊,把它放到我们对应的这个操作师站当中。哎,操作出站当中你得放进来,因为有可能我们拿这个具体的这个构造器的参数呢,对我们的这些属性呢,是不是要进行一个初始化呀?哎,对,有这样的一个问题啊,行,那我们要把这个如果你要有参数的话呢,也要放在这个操作站当中,然后呢,在构造器当中,当然构造器之前呢,有可能我们还涉及到是有这个代码块啊等等,你会对我们这些属性呢,再进行一个赋值啊,这就是一个初始化的一个过程,上边这个new这块呢,有一个叫零值初始化啊,下边呢,有一个具体的一个呃,再赋值的一个过程啊,有时候我们经常在Java中,我讲Java语言课的时候呢,称为呢叫显示初始化是吧?啊就是我们后续的这个过程啊,在这呢出现的。
05:34
行,哎,最终呢,把我们这个当前这个变量呢,哎,从这个操作数大当中呢,给大家取出来,放到我们对应的这个局部变量表这边啊,局部变量表呢,你看本身的这个长度是二啊,长度是二是吧,然后这里边呢,我们是把它放到这个角标唯一的位置啊,相当于就是把我们的OBD呢,给它放过去就行了,行这呢是咱们从这个叫自解码的这个角度啊,来给大家做了一个解析。那实际上呢,非常简单,就这么几行代码是吧,然后接下来呢,咱们从这个具体的一个执行的过程啊,从执行的这个过程来看,我们把刚才呢,我说的这几步呢,其实又进行了一个细化,哎,我们呢,来理解一下,理解一下这个事情。
我来说两句