00:00
接着啊,咱们来看下一组,下一组呢,叫做对象的创建与访问指令啊,这呢就提到了一个对象的概念,嗯,这呢涉及到这个指令呢,相对来说多一些,那首先我们看一下说Java呢,是面向对象的程序设计语言,所以呢,Java虚拟平台呢,从磁激码层面呢,对面向对象呢,就做了诶深层次的一个支持,所以呢,这里边会有一系列的关于对象的操作。注意,这里边我们提到这个对象啊,是基于我们说类创建的实例,叫做对象,那同样的我们基于数组创建的实例呢,也称为对象,那面向对象的话呢,这里边儿是包括我们说的类类型和这个数组类型,对吧?当然我们说这个接口也属于引用类型的一种,那这个接口的实例的话呢,那肯定也是对象了,毫无疑问,那这里边儿呢,我们会涉及到呢,关于这个对象创建的指令,还有呢,创建好以后,我们通过对象呢,去访问相关的一些field,叫做字段,当然这里边这个字段呢,又分成静态和非静态之说。所以呢,相应的这个指令的话呢,我们有静态和非静态的两个两个类别下边呢,叫做数组操作的指令,因为数组的话呢,属于一类特殊的这个结构了,对吧,特殊的类型,那我们关于数组这块呢,看看有哪些特殊的这个指令可以去操作的,以及呢,最后我们在提到这个类型检查,比如说我们在用障碍中的关键字像in essential这样的这个操作的时候,包括呢,我们说在Java这个对象这块呢,也存在着是不是向下转型,对吧?那线上转型的话呢,也属于类型检查,包括呢,检查之后呢,一个强制类型转化,这个基本数据类型呢,我们称为呢叫简窄化类型转化,在我们这个营数据类型这块呢,我们。
01:35
这个还要强制类型转换,然后相应的指令呢,就在这里边。好,那下边的话呢,我们就具体的来看一看,首先呢,是第一组叫做创建指令,那创建指令那这呢就涉及到了我们创建是类的一个实例,还有数组的实例,那都算是我们这个创键指令,那相应的使用的这个指令呢,也各不相同,那创建类实例的指令呢,就是一个关键,呃,关键这个咱不叫关键字了,这个new的话呢,就我们叫字节码指令,或者叫个诸级符都行,就是这个。
02:05
就是这个new,它呢接收一个操作数,那我们把它呢,也可以称作叫操作码,对吧,后边呢,它要跟一个操作数,这个操作数呢,通常是指向常量池的一个索引,指明呢,我们要创建就是你用的这个对象对应的那个类型是什么。比如我们要new object,那后边呢,跟的是常量池那个索引,索引指向呢,是一个类型的一个一个描述,那类型那个描述的话呢,就是一个object,那就是这样个情况,然后执行完成以后呢,将对象的引用呢压入操作数站。压入操作时,这这呢,就我们说这个new的操作。这个咱们先把这个整个介绍完以后呢,咱们再举这个例子,下一个的话呢,叫创建数组的指令,那数组这块呢,又分成了三种情况,那为什么三种呢?首先呢,我们说new的,如果是基本数据类型的数组,我们就是用的这个newra,如果它是引用数据类型呢,我们在new前面呢,加一个A,表示的是引用数据类型。
03:03
那如果说呢,你是一个二维的二维及以上的数组的话呢,我们叫multi体和瑞。这个纽瑞呢,就是你是一个这个,因为我们说二维数组可以看成是数组构成的一个数组,对吧,那也算是数组构成数组里边这一层呢,也算引用类型了,这个超过一维的呢,我们叫multi和newway OK这样的一个形式,那上述指令呢,用于创建对象和数独,在我们Java中呢,广泛使用,使用的频率非常高,因为呢,在咱们Java层面呢,咱们去创建对象,创建数组的频率呢,本身就比较高,对吧?好,那接下来呢,咱们来给大家举这个具体的例子。那例子的话呢,咱们这块呢,就定位到咱们这个new这一块,那我们来看一下这个创建相关的这个指令,这呢,我写了两个方法里边呢来进行测试,首先的话呢,我们来看一下关于这个对象的创建。对象这块呢,我举了两个例子,一个呢是我们最普通的一个object,一个呢我new了一个file行,那把这个呢,我们相应的首先做一个reel。
04:04
那接下来的话呢,我们在这块呢,进行一个这个展示,好刷新一下,我们现在想看的是new instance。打开行,那这个呢,我们说这个操作是不是就在这儿啊,那这时候呢,方便起见,咱们把它呢,CTRLC这个,因为咱们刚开始讲这个new,咱们把它呢,在咱们这里边儿呢,体现一下。好把它粘过来,稍微的放大一点。来看一下我们这个该怎么去理解,首先的话呢,我们一上来,呃,当然对应这个代码呢,咱们也给他粘一份。其实就是这两行操作。行过来了,那首先的话呢,我们一调了一个方法呢,就进入第一行,第一行的话呢,我们是new了一个object对象上来呢,就有一个new,这个new的话呢,我们说后边呢,会跟一个操作数,刚才说过了,就是你创建的这个实例呢,是哪一个类型的,我们看到是一个object类型的,对吧?所以呢,我们在这儿呢,就相当于是会创建一个实例,把你创建的这个实例呢,分配到我们这个操作数站当中,这呢就是一个入站的操作。
05:12
那这呢,就相当于我们生成的对应的这个对象了,嗯,这个对象的话呢,其实这块记录的主要是这个对象的一个地址值,注意这是这个地址值什么意思啊,就这里边呢,就涉及到咱们这个new,它到底都做了什么事,这个咱们现在呢,是不是这个操作数占对吧。操作是占和我们说局部变量表,实际上呢,都属于咱们所谓的就是以前咱们这个大家呢,如果学Java基础的时候呢,咱们画这个内存图的时候呢,画的比较简洁,不知道你还记不记得以前呢,我们画的时候呢,把这呢称为叫占是吧。这个呢是虚拟基站啊,注意不是操作的站,然后这个呢,咱们看成了叫堆。好,那我们去扭一个object的时候呢,咱们通常都说啊,在这个占空间呢,这有一个引用叫obj,然后呢,在最空间中我们扭了一个实例,然后把这个实例的地址值呢,就付给我们这个obj了,就这样值过来,对吧,咱们以前呢,都是这样子说的,那具体的来讲,我们这个变量该怎么去看待,当然我们这里边的OB主要指的还是这个在局变量表里边保存的啊,那现在呢,我们是在这个过程当中,嗯,过程当中呢,我们说怎么看待这个逆操作呢,它其实做了好几个事儿。
06:19
首先的话呢,我们想用一个实例对吧,那么我们要在对空间当中给你开辟一块空间。我要给你开辟化空间,行,这是这个空间的一个开辟,其次的话呢,开辟好空间以后呢,我们要给你创建一个实例。那就相应占用这个空间,把这个对象的实例呢,我们要创建出来。对吧,要创建出来,这时候呢,也涉及到了一些相关,比如说静态的结构的一些加载等等的啊,那当然静态这个结构的话呢,涉及到我们这个类的初始化的问题,这个咱们后话呢,再专门讲,这时候呢,主要我们想强调是类实例相关的一些情况啊呃,这呢就我们创建的对象了,然后接下来呢,我们把这个对象的这个地值呢,相当于还会付给咱们占空间里边这个变量,那通过这个地址值呢,咱们就引用到了你对空间的这个对象实体。
07:03
对吧,那这呢,我们说本质上来讲呢,是局部变量表里边的,那局部变量表呢,也说是咱们这个拉,这个叫性能条的一个关键,因为它里边存储的我们都称为呢叫jc root是吧。对吧,咱们前面说过这个概念啊。那凡是关联的这个呃指针的话呢,这些数据呢,都不能作为垃圾呢被回收掉,行,那现在呢,咱们主要强调是这个过程当中啊,那我们应用的时候呢,创建了在对空间中开辟一个空间,创建那个实例,把那个地址呢,要附到这儿,那主要就是这个意思,行这块我就别别写这个点点点了,它其实是具具体有地址的,比如我我这就给一个0X这个1234,比如说行,那这呢,我们就呃搞定它了。那这是我们说入站的有个它的一个操作,然后在下边呢,大家会发现看到有个叫dop,这个dop呢叫wlicate,就是复制的意思,这个咱们下边呢,讲这个站管理的时候操作是站管理的时候呢,咱们会提到这个关键字的一个使用。
08:03
不能叫关键字了,应该叫我们这个叫自解码指令是吧,或者你叫这个操作码也行啊,那现在呢,咱们先临时的用一下这个大部分呢,就表示复制的意思,就是将我们操作数占占顶的这个0X。我这应该是个零,写成了O了。把这个0X1234呢,咱们再复制一份。复制一份,复制的目的是什么呢?这个咱们得往下看。在下边的话呢,我们调一个叫o special,这个是咱们方法调用的一个方法,方法调用方面的一个具体的指令,这个咱们先不去详细的纠,主要你知道呢,就是它后边跟的这个操作码呢,又是一个常量池当中的一个结构,其实呢,是一个具体的方法引用,就是in这个方法,那相当于呢,就我们成为object这个构造器方法,其实对应的呢,就是咱们。这个以构造器为代表的一个构造器方法。对吧,哎,我要叫他现在这个new跟object呢,它准确来讲呢,实际是两个事儿,一个是他,一个是他。
09:01
注意一下行,当我们调用这个special的时候呢,这个时候我们占顶的这个这个0X1234呢,它其实就就出去了。注意这时候呢,它就出去了,这个我把它呢调个颜色吧。对,这时候它就出去了,嗯,出去以后呢,然后再接下来,这主要呢,就是我们涉及到一些初始化的问题,包括呢,你这个构造器如果有参数的话呢,这个参数也需要呢,付给我们对空间你这个实力的那些,呃。字段对吧,实例的那些字段了,行这就出去了,然后接下来呢,叫a store_一,那这时候呢,把这个0X1234呢,相当于给我们就保存在这儿了,那就存到这儿,那就0X这个1234行这时候大家知道为什么我们这时候要wate了。你就为什么要复制了对吧,那因为一方面呢,我们用完之后呢,另外你调这个方法的时候呢,我们要消耗一个引用,然后你要存储的话呢,还要消耗一个,你要一开始不复制的话呢,就这一个调完evoke special这个地址时是不是就消失了,所以我们这时候呢,必须要复制一份,这个要注意。
10:04
行,那在咱们这个局部变量表里边呢,第一个位置,这还是咱们那个Z,就是当前这个方法所属的那个呃,对象它的一个引用地址啊,这个我就不具体写那个了啊,这个我就写个this,注意这个this呢是咱们这个方法new方法所属类的那个当前对象,这个呢是咱们new的这个object这个实例对象啊,那么这呢,就是我们相当于说的这一组了,这一组清楚之后呢,下边这个跟上边这个其实类似。我们再接着去拗,那这块我们又得放这一个,咱们拗的呢,是这个景三常量池里边对应的这个,这个应该不用多去看了啊,这个大家应该都蛮熟悉了,这个景一是我们object,这个景三呢,对应的是我们这个结构。它是吧,就是一个类的一个音符,是我们L包下的一个file这样一个类啊,这不用多讲了,咱们都呃比较清楚啊。好再回过来,那这时候呢,我们就要创建一个file的一个具体的实例,比如叫0X这个2233,好,那这呢就跟我们刚才说这个new的作用一样,开辟对空间创建实例,然后附一个地址值,这呢就指向你这个,当然现在呢这个。
11:12
重点的指向还不在这儿啊,我们重点要把它呢,是不是还得存到这儿啊,那接下来的话呢,又是一个大,就是一个复制。0X2233行,然后呢,下边一个LTC,这呢就是我们把一个字符串叫I的硅谷点avi。商务的一个视频对吧,哎,这个我们就存过来了,这个以一个字符串的方式呢,加载到咱们这个操作入站当中,就是艾特硅谷点AV。注意是ay,还有个I呢是吧,然后呢,这时候我们就放到这儿,接下来的话呢,我们又调用个special,是我们的个file的一个构造器方法,这个构造器方法的话呢,除了我们要用一下你这个0223之外呢,你这不是还有一个参数嘛,这个参数呢,就是咱们刚才放的这个字串,所以当我们去调用这个special的时候呢,这两个都会出战。
12:00
他两个就出去了,出去之后呢,我们就把这个构造器当中,你该去给人家当前对象实例字段初始化呢,你就初始化了完事,再接下来呢,把我们这个0X233,它现在是占点的,存储在呢这个a store下线二这个位置,所以这呢就0X2233。2233放到这儿,然后他这块呢,呃,刚才这个是不是也也应该咱们把它就是这个呢,当你二到一的时候呢,他是不是也就出站了,对吧,然后现在这个也是执行完了以后,他也就出站了。没问题啊行,那此时的话呢,整个咱们这个操作呢,就算是结束了,这里边呢,就保存了这样两个变量,那咱们之前说的说这是站,这是对,然后呢,我们站里边的有一个变量啊叫obj指向你对空间中用的这个实例,那此时这个OB阶呢,地址就是0X1234,咱们这时候说的1234,其实主要指的是这个局变量表里边这个,不是这里边临时的这个。那这个大家稍微注意一下行,那这呢是咱们说的这个new,主要指的是这个对象。
13:02
然后下边呢,咱们来看一下这个关于这个数组的一个情况。数组这块呢,我们就看这个new arra把这打开行,那数组呢,刚才我们提到有三组,一组呢是针对于基本数据类型的,你看这里边我们是一个int类型的基本数据类型,所以呢,你看这里边我们去new一个RA,当然上面你先把这个数组的长度作为一个这个基本的一个数值给我们这个推入到操作站当中,对吧?这个都不用多说了,基本数据类型int类型我们就new了。当然你要是BAT呀,Char啊,Long啊,Float啊,全是它都是基本数据类型嘛,行,然后相应的把它呢,保存在我们这个局部变量表当中,下边呢,是一个object类型的数组,也用数据类型了,所以此时呢,咱们是不是叫a new啊?A前面加个A,那这个呢,就是我们说的引用数据类型这块。行再往下看,然后再往下的话呢,大家发现我此时是不是一个二维数组类呀。
14:01
那么二位数组的话,你看你这个是个十,这还是个十,所以这块你看有两个十。这注意有两个是行,那这个时候呢,我们再创建的话呢,叫multi ay。这就我们说这个多维的数度,那这块也指明了是个二维的对吧,那有两个这个这个中括号,然后一个I就是二维的int型的这种速度。啊,指明的非常的清晰,那对应的这个后边的这个操作数的话呢,叫常量池里边这个第六项,其实就是指明你当前这个类型嘛。OK的是吧,行。那这呢,就是我们在剖析过前面这样一些指令之后呢,再看这块应该是都比较清晰的,行,这块大家说就完事了哈,但是这块我看我就多写了一个,我这呢是一个死顿类型的一个二维数组。此值类积的二维数看似就是目前看到我们说的二维数组,但是这块你注意我这块只填了一个,前面这个是十,后边这个呢没有填,这种情况下呢,大家你看一下。他这块呢叫A。
15:01
注意啊,这个时候呢,并没有提示我们此时用的这个指令呢,是一个二维的啊,是不是现在用的指令属于还是像这个一维的情况呀。大家能理解吗?诶,应该是能清楚的,就是咱们这时候呢,如果画内存结构呢,这叫占,这叫堆,你在堆里边呢,是不是只开辟的一个长度为十的一个数组吧,然后至于说这里边的每一个元素类型,咱们说呢,是呃,Str这个呃,Array是吧,呃,一个数组类型的是一个一维的,但是这时候呢,你并没有去做初始化。它其实这时候呢,这些值呢,全是nor嘛,所以呢,整体来看呢,相当于你创建就还是个一维的情况,所以我们用的这块呢,叫A。那如果说你把这个呢,给它附上一个值,我们做一个重新编译。行,那这时候大家你注意这个位置,我现在要刷新了。好,看到了我们这块呢,又引入了一个这个常量数值是五,然后呢,是不是mount和瑞了,这就相当于个二维情况对吧?行理解这个意思,这呢就是我们关于这个创建的这个指令创建类的实例,创建数组实例,行这呢我们就说到这。
我来说两句