00:00
好,那关于我们说方法在调用当中啊,这个方法呢,咱们是自解码文件的角度来看的啊,包括咱们普通说的这个Java中的这个方法,以及呢,咱们所谓的构造器,对吧?这个方法跟构造器在自金版文件当中呢,我们都称为叫method了,那么关于他们这些结构呢,在真正调用的时候呢,这个展现出来的一个指令,咱们提到了这四种,咱们都已经给大家演示过了,那以及呢,这四种哪些叫虚方法,哪些叫方,这个分析方法咱们也说明完了,然后咱们再看下一个动态调用的指令,这呢叫做VO dynamic啊,这个呢,是在每一次运行的时候呢,诶,都需要进行一个转化的,诶dynamic这样的一个方式,那么我们看一下这个呃指令怎么来理解啊,这个指令的话呢,呃,其实不是跟咱们上面这个指令在同一个时间出现的啊,这呢有一个背景,说GM的自解码指令集啊,一直呢是都比较稳定的,一直到JAVA7当中才增加了一。
01:00
叫invoke dynamic这样一个指令,这个指令呢,主要目的呢,是为了想体现咱们Java呢,叫动态类型语言。啊,那这呢,就涉及到一个问题,就是动态类型语言和静态类型语言的问题啊,这个等着咱们来说,然后再看,这正呢,在这个Java器中虽然引入了这样一个指令,但是呢,咱们在调用方法的时候呢,并不会直接的生成以Mo dynamic的这样指令,还需要借助借助于相关的一些API,我们去生成这样的指令啊这呢,咱们就呃不多说这个事情了啊,然后直到咱咱们JAVA8的出现,JAVA8呢,我们说有个新特性叫做拉姆达表达式啊,这是说咱们JAVA8里边呢,比较重要的一个结构,或者呢,也可以称为最重要的一个结构,也不为过,引入了叫函数式接口啊拉姆达表达式说这个。拉表达式这种方式呢,出现,使得我们这个VO dynamic难的这张指令呢,就可以直接在方法的执行过程当中去动态生成了,呃,会会去直接生成了,呃,有了直接的一个体现方式啊,是这样子的行,那刚才呢,咱们提到这种叫动态类型的语言和静态类型的语言,那什么叫动态类型语言和静态类型语言呢?
02:08
啊,这个大家想想你清楚吗?大家写Java代码可能写了这么久了,那这两个有什么区别呢?或者再问一句话呢,简单一点的说,Java语言是静态类型的语言还是动态类型的语言呢?Java语言是什么呢?啊,咱们说Java语言呢,其实应该讲呢,属于静态类型的语言,Java语言属于静态类型语言啊,但是有了这个VO dynamic以后呢,咱们就一定程度上具备了这种动态语言的一个特性。啊,说白了就是Java语言其实也在不断的去迭代更新啊,迭代更新像这个拉姆达表达式呢,一定程度上我们说也有点这种函数是编程的这种意思了,是吧,但是在呃,拉姆娜表达式里边呢,你一个结构其实仍然是一个对象了,咱们在Java语言层面呢,是叫万事万物皆对象,既然你这样最初就立下了这样的一个flag是吧,那这个呢,一直也没有变过啊,那这个使用这个指令呢,使我们Java呢,诶一定程度上啊,具备了这种动态语言的特性,但是本身Java语言我们说仍然是静态语言。
03:07
那到底这两个语言有什么区别呢?区别就在于对类型的检查是在编译期间进行的,还是在运行期间进行的。那如果是在编译期间进行的呢,就是静态类型语言,如果是在这个运行期间进行的呢,就叫做动态类型语言。说完以后呢,还是不形象,还是不形象,实际上呢,大家如果你清楚咱们相关的这个,呃,一些编程语言就知道了,像咱们说Java语言当中,咱要是定一个变量,比如说我们定义一个string啊,Infer,诶我字符串是吧,艾特硅谷这样来定义的,行,你这呢,每一个定义的变量呢,都有前面具体的一个类型,而且呢,你这块呢,你想想咱们如果要是直接给这个infer,要是赋值为,呃这样写的话呢,是不是直接就报错了呀。那就说明呢,我们在编译期间呢,对我们右边附的这这个值呢,就会进行一个类型的检查,那报错了就说明在编译期间呢,你不满足它要求的死string类型,所以呢,Java语言它就是一个静态类型的啊,就是更严格的一个语法规则,那像咱们说的这个呃,GS叫javascript啊,咱们定一个Y,我定一个叫name啊,我写一个叫呃呃这个是吧,呃这呢知道你是个字符串了,那如果说我要是诶Y我比如我我就还叫name了,但是我就写了个十,他是不是就认为我们又是一个数值类型的了。
04:27
对吧,那那前面呢,我们写这个Y表示这变量类型,但其实呢,这个是一个形式上的,它并不真正代表我们这个变量类型,因为所有的变量我们都叫war variableval嘛,对吧,都叫ver了,那再彻底一点,大家如果你写过Python的话呢,Python更更绝,这个ver都不用写了,上来呢,比如说我们写一个wait,那当然咱也不知道它,它到底写wait好像暴露出来,好像说你就知道它是double的,其实没关系啊,我就写个info吧,我写一个这个130.5。
05:00
这个呢,是我理想的一个体重。啊,当然是金啊,不是公斤了,离这还现在有点差距啊行,那这呢是我们这个写的一个变量,这个变量的话呢,你看编译期间我们是确定不了它是什么类型的,真正运行的时候呢,我们知道哦,你这是一个double类型的,它是这种啊这个这个就是比我们这个GS还彻底,那这个GS跟这个Python呢,其实他们就算是动态类型语言了,Java呢,其实是静态类型的语言。所以更直白一点说呢,你看这写了静态类型语言,它呢是判断变量自身的类型信息。而动态类型的语言呢,是判断变量值的类型信息,变量没有类型信息,变量值才有类型信息,那我们根据这个值,我们才能确定它到底是什么类型的,咱们GS当中说变量呢,在ES5 es6包括七当中也有不同的这个类型,都是针对咱们这个变量值来说的。啊说变量值的类型,我们在Java这呢,一说是变量的类型分成哪些种类是吧?诶这呢是有区别的。
06:02
哎,知道这一点啊,知道这一点行,那提到这个VO dynamic了,咱dynamic了,咱们简单的也举一个例子,诶,我在咱们这个JAVA2这个包下呢,我写了一个叫呃拉姆达这样一个情况啊,通过这个呢,咱们来去体会,诶这个叫invoke。Dynamic这样的一个指令体会一下,这呢我写了一个接口,中间有一个抽象方法,这呢其实就是我们说的一个函数接口了,你加上这个functional interface啊也OK啊,不加呢也没事,那下边这个呢,是我们这个主类,主类里边呢,我们一个拉姆达的方法当中呢,把这个函数式接口作为我们行参传进来啊,我这没有具体的这个函数体了啊,然后下面的话呢,我们就来me方法中去调用这个拉姆达这个方法,哎,造了个对象调这个方法一个呢是我显示的,把这个对象呢给他造出来了,当然这呢我用的仍然是一个哎拉姆达表达式的方式,大家这个扎巴呢是一四年发布的,到现在呢,大家应该都比较清楚这个拉姆达表达式了啊。
07:04
就是实际开发当中,大家都可以去用了,因为在公司中现在JAVA8呢用的也是最多的,可以用啊,或者你说我不想用,不想用也可以,但是至少呢你得懂,因为呢,咱们看很多的一些资料的时候,就是网上的一些帖子啊,包括说这个一些框架的源码啊,有一些框架呢,比较新的话呢,它的源码里边都用到了相关的拉姆达表达式的,你得能看得懂才行啊,包括像方法引用啊,构造器引用啊,这个大家不清楚的,你可以上商务的官网啊,看咱们现在的视频啊。好,接着说,嗯,这呢是我们用的拉姆表示呢,创建了一个诶funk这样一个接口的实例,把它传进来,这呢是直接呢以匿名的方式呢传过来的,那么我们把这个结构呢,先做一个呃编译。可以了,编译完以后呢,我们在这儿看一下这个结构,主要呢,看咱们这个拉姆达。嗯,点一下。啊,这个没出来没出来,我们刷新一下啊,刷新一下以后呢,我们再来做一个拉姆DA点击好可以了,拉姆达打开以后呢,以后呢,我们看这个方法,方法呢,主要咱们就看这个may方法,看这个code。
08:12
好,那这块呢,大家就能看到我们,诶在此时生成的这个词解码文件当中,就可以直接出现work克dynamic了,这呢诶在JAVA7当中是不行的啊,Java器呢,我们还需要借助于相应的一些工具了,JAVA8里边呢,我们如果使用拉文表达式的话呢,就会出现你看这一行代码是在我们自解码的第八行,点开看这个第八行呢是21 21呢是这儿,诶相当于呢是我们在生成。生成这个,呃,这个对象的时候啊,接口这个对象的时候用的拉姆达表达式,那这个拉姆达表达式的这种方式呢,我们就认为诶,它是一个dynamic的这样的一个情况啊,因为呢,我们你从这来看呢,感觉莫名其妙的啊,这个结构你说他到底是造了一个对象是吧,这个对象到底是实现谁的这个对象呀,是确定不了的,真正在执行的时候,我们才能够确定下来,它到底是什么类型的,是根据我们这个值来确定的吗?
09:10
对吧,诶你看等号右边是根据它来确定的,就类似于咱们GS跟Python中是根据这个变量值来确定的,呃,说白了就是这个拉姆达表达式的这个引入呢,使得咱们Java呢,具备了啊,一定程度上具备了这个动态语言的这个特点,但是呢,整体来说,Java还认为是一个静态语言啊,大部分时候呢,咱们用的都还都是还是他这个静态语言的这种特点。好,回过去哈,说这个诶,Java其中增加的这种动态语言类型的一个支持,本质上呢,是对Java虚拟机规范的一个修改啊,比如说咱们改了,像至少这个指令集都改了是吧,而不是对Java语语言规则的一个修改,Java语言规则呢,仍然是这个左边声明变量,右边呢造对象啊,只不过呢,我们现在这个呃。具体这个拉姆的表达式是吧,它充当了咱们这个对象了。啊,你也可以称为叫匿名函数,在Python里边呢,拉姆表示呢,它就叫匿名函数了,在我们这儿呢,诶,它还是我们这一个对象啊,像GS里边函数的都是对象,比咱们Java这个面向对象呢,更彻底啊。
10:12
嗯,这个这一块呢,相对来讲比较复杂,增加了虚拟机当中方法的一个调用,最直接的受益者呢,就是运行在Java平台上的动态语言的一个编译器啊,这个我们说Java虚拟机呢,之所以它能支持这样的这种方式,呃,也有利于咱们在Java这个平台上,Java虚拟机的平台上去运行像Python啊,GS啊这样的一些动态语言,那这个咱们在一开始讲第一章当中也说到了,Java虚尼呢,现在已经是跨语言的平台了。哎,在它上面呢,包括运行GS,像以前的这个叫reno引擎,后来呢,还有其他的这个一些引擎的引入,哎,使我们Java虚拟上呢,能够执行呃,GS的一些程序啊,包括呃Jason是吧?啊Jason呢,能够运行咱们的这个Tyson这个程序啊,主要呢,目的是为了支持Java平台上这个动态语言的一个支持,对于Java来讲呢,主要还是静态的这种语言特点啊行,那咱们呢,就关于这个VO dynamic这样的指令呢,就说到这儿啊,应该是都比较清楚了。
我来说两句