00:00
咱们的前一节课呢,是讲到这个拉姆达表达式了,对吧?拉姆表达式的话呢,是属于我们GDK8的一个新特性,或者说呢,是最重要的两大特性之一啊好,那么这个内容呢,我们就先告一段落了啊,就不过多的先去复习这个事儿了,然后基于这个拉姆的表达式,我们再进一步的看另外的这个内容,这儿呢,我们提到两个,一个呢叫方法引用,一个呢叫构造器引用。啊,那数组营的话,咱们也归到这个构造器营这块也可以啊,因为呢,我们通过构造器new是造一个对象,然后也可以通过new呢,我们去造一个数组,所以这块呢,可以看成是一个结构啊好,所以这块呢,我们来讲下边的方法引用和构造器引用的问题。诶,首先的话呢,咱们来看一看,叫方法引用啊,听着名字呢,感觉也是摸不着头脑,不知道是怎么回事儿是吧?诶,咱们直接来说这个例子啊,这个方法引用的话呢,咱们在一开始讲这个拉麦表达式给大家引入的时候呢,其实举过一个例子啊,大家不知道还有没有这个印象啊,我们现在需要提供一个函数接口,叫做competitor。就是以前咱们接触的这叫比较期了,哎,我呢需要提供一个他的这个实例,然后呢,我们最初的方式是不是提供一个匿名实现类的对象嘛。
01:09
对吧,这是最早的这个方式了,然后呢,发现呢是一个函数接口,所以我们可以使用拉姆达表达式,然后又因为呢,诶它满足某种特殊的情况,所以呢我们就可以使用方法引用,所以呢,诶我们这里边儿举一个例子的话呢,就是我刚才写的这样一个例子。前面呢叫in冒号,冒号,后边呢叫compare,属于内部的一个方法,诶中间呢这个呢,就属于方法引用这块我们能看到的一个符号。那么关于这个事儿,咱们该如何去理解呢?哎,这块呢,我们先说一说这个方法引用啊,诶,我这儿呢,写几个事儿啊,首先第一个事儿,我们把这个方法引用啊,可以看作是拉姆达表达式的进一步的刻画。哎,我这块写一下啊,可以看作是,诶基于啊拉姆达表达式的。来表达式吧。来进一步刻画。
02:02
什么意思啊,也就是说呢,咱们方法引用要想能够使用啊,首先你得能够使用拉姆达表达式。啊,这个大家注意,在能够使用拉曼达表式的前提下,我们还可以进一步的把这个拉曼表达式替换为咱们说的叫方法引用啊,那什么时候能够去替换呢?这是我们现在比较关心的点,对吧?好,那这块我们接着往下这块去写啊。那么首先呢,大家回忆一下,咱们什么时候能够去使用拉姆达表达式呢?啊,这块我们说的有这样一个场景是吧,诶当。说需要提供啊,一个叫函数式接口的。哎,实力时是在我们可以使用是不是拉姆表达式进行提供啊。哎,我们就可以使用拉姆表达式,表达式呢,提供此实例是吧,这个呢,就是指出咱们什么时候能够使用啊,这个拉姆达表达式的这样一个场景,那什么时候我们能够去使用这个方法引用或者叫构造器用呢?诶我们下边再提一个啊,诶这个我能写到这儿说呢,当满足一定的啊条件的这个情况下。
03:14
啊,条件的这个情况下说呢,我们。诶,还可以。啊,使用叫方法引用,或叫构造其引用。哎,去替换这个拉姆达表达式。哎,这呢,应该说的非常的明确啊,那如果说咱们画一个图的话,这个图的话呢,咱们可以这样来画啊,大家你看能不能理解这个框呢,我们理解成呢,是提供一个接口的实现类的对象。对吧,这个接口我没有说它是一个函数式接口,也就是说这个接口里边它有可能包含多个抽象方法。在这呢,是提供一般的啊,咱们说叫接口的实现类的对象,你可以使用这个匿匿名的这种方式哈,然后呢,在这个当中呢,有一类这个接口比较特别,它叫做函数式接口,也就是说呢,只有一个抽象方法,那我们说呢,这种场景咱们就一定可以使用拉姆达表达式啊,这种情况呢,显然是包含在我们刚才说这个大的情况的里边的,对吧?好,那么在能够使用拉姆达表达式的情况下呢,我们再画一个小框,又是在里边的。
04:19
在满足某种条件的情况下,我们可以把这个拉姆表示替换为方法应用或者叫构造启用。所以大家首先明确这样一个层次关系啊,那言外之意呢,就是说,如果你说我不会用方法引用,不会用构造器引用,那你是不是可以把它改造成是用拉曼表示是吧?那你说我这个拉曼表示我也不会用,那你大不了是不是还可以使用我们最原始的方式,那就类似于在JDK8之前,那你就是自己呢,去一个接口起个名,然后右边这块通过new的方式,是不是可以提供一个接口的匿名实现类的一个对象呀。对吧,诶这个就我们说的最原始的方式了,可以这样用啊,但是现在呢,我们说呢,G82014年发布的,到现在呢,将近十年的那个时间了哈,现在呢,拉姆表是包括我们后边要讲的这个stringpi,在企业呢,现在应用的是极其频繁的了。
05:07
啊,或者换句话说呢,你只要会用的话呢,让别人感觉总觉得很高大上是吧,所以大家这块呢,一定要用起来啊,你就是能够使用拉板式要用,能够用方法用要用。就这样情况。那下边的话呢,我们提一提叫方法赢的个本质是什么啊,同我们这块没开始写呢,没开始写不着急哈,咱们先把这个事儿呢说清楚,但是你看这个例子哈,方法赢的本质啥呢?你看我们左边仍然是需要提供一个接口的啊,还是叫函数接口是吧,它的一个实现类的对象,而我们是不是拿这个方法引用充当的这样的一个实例啊。所以说这个本质是什么呢?哎,由这个例子出发,哎,大家呢,应该看得非常的清楚,也就是说咱们的方法引用是不是作为了我们函数式接口的一个实例啊。我写一下啊。作为了韩术士。A接口的实例。所以说啊,咱们Java的讲是不是叫万事万物皆对象是吧,是不是我们又扣到这句话上了。
06:08
啊,万事万物皆对象啊,你看在咱们Java里边啊,说都是对象,咱们最开始学的时候呢,提到了Java是纯粹的面向对象语言,那现在来看呢,其实这个万事万物皆对象呢,也算是Java的一个。咱说谈不上说这叫累赘吧,至少说呢,你必须要考虑都得是对象这样一个场景,所以说明明我们现在啊,像咱们前面讲拉姆表式,这是一个匿名函数,但是呢,在我们Java里边,你得是个对象,对吧?诶我们现在这个结构的话呢,你一看感觉很特别啊,我们把它称为呢叫方法引用,但是本质上来讲呢,它也是一个对象。诶这块呢,大家去体会一下啊,万事万物皆对象这儿呢,你积攒了应该很多的这个素材了。好,那么具体这个格式该怎么去写呢?我们刚才看到了这个冒号,冒号呢属于方法引用或者构造引用中的一个特殊的符号了啊,你只要看到它的话呢,你就往这块去想就行啊,然后呢,前面这呢,你看是一个类是吧,然后后边这块呢,显然是一个方法名,所以这个格式的话呢,有这样的三种情况啊,这个情况一呢是我们拿这个,呃,或者我先这样来说吧,整体上来讲的话呢,相当于是拿这个类。
07:12
诶或者说呢,是我们这个叫对象,然后后边就是冒号,冒号然后呢,是我们这个叫方法名,这呢是整体的一个格式,那么具体来讲的话呢,分成了这样的三种情况啊第一种情况呢,比较简单,哎,我们是拿这个对象。哎,冒号冒号我们去调这个方法名,那很自然而然的这个方法名,这个方法对应的就是我们说的叫实例方法,所以我这块呢,我可以呢,就诶这块简单就写成叫做诶实例方法。实力方法是什么意思?还记得吧,就是我们所谓的非静态的方法对吧?好,那么这个情况二呢,哎,咱们对应的就属于拿类呢,去冒号,冒号点的那泪能够直接发起调呢,我们称为呢,是不是叫静态方法呀?哎,静态。
08:00
方法或者呢,你也可以称为叫类方法都可以啊行,这个呢是我们说的第二种情况,然后还有一种情况叫情况三,这种情况呢,相对来说大家不太好理解,这个我们称为呢,叫由类发起的,哎冒号,冒号怎么着呢,叫做实力方法。哎,同学说,诶这个不对吧,这怎么类还能去调实例方法呢?当然了,类本身不能够去调非静态的方法,对吧,只不过呢,我们格式上这样来看的是这样的,是写的是那样的是吧,实际上我们调的方法呢,仍然是这个类的一个实例来调的。来具体的话我们来进行分析啊好,那首先呢,咱们来看第一种情况说对象呢,来去调这个所谓的。所谓的这个叫实例方法,来这个对应的我们就打开这样一个代码,咱们来这块去分析啊,咱们下边就开始来写。好对象了,来调这个示例方法,首先这块我们一点点来啊写成最初的这种方式,比如说我现在呢,需要啊使用一个接口,这个接口呢,就是函数接口了,叫consumer是吧,然后这里边呢,声明成什么呢?诶我们写成一个,比如说叫诶string吧。
09:04
OK,这儿呢,我就想坑一,最初的这种方式呢,咱们不就是使用这个匿名的这个方式来写吗。哎,就这样来写是吧,诶我把这呢写成咱们最初的啊,第一种方式我简单来说了,好在这里边呢,这个事儿呢非常简单,我们就把这个S呢给它打印一下就可以了。没毛病是吧,好,呃,下边这个雕呢,其实不是咱们说的这个主要问题了,呃,你要愿意调呢,你就调一下,这个叫accept,里边呢写一个叫诶hello是吧,诶这就可以了,这呢是我们说的第一种方式,然后第二种方式呢,咱们可以使用这个拉姆达表达式。呃,顺便大家回忆一下啊好,你看我这边呢,还是写成叫consumer,这呢我还是string,这没问题是吧?啊这个我们写个二,然后右边的话呢,咱们讲过了,直接呢,看你内部唯一的这个抽象方法的形态列表啊,形态列表你发现呢,只有一个参数,我们这个类型和这个小括号呢,是不是都可以省,所以我就直接呢就S了。然后右边的话呢,因为只有一个输入语句,所以我们把大括号呢也可以省略,是不是这就我们讲的叫拉姆达表达式的这个写法是吧?诶我们科二的话呢,也可以调一下accept。
10:05
谢哈。好,那么基于咱们目前的两种写法呢,把它运行一下。你看非常的简单是吧,好,那么基于现在这两种写法呢,我们说呢,进一步的去做这个刻画啊,咱们使用的叫方法引用。嗯,大家你看啊,左边的话呢,还是咱们这个consumer,哎,我不妨呢,就还写成这个叫string呢,三是吧,右边你看我们怎么写,大家注意看。呃,咱们现在呢,要重点重启的方法叫做accept。你会发现呢,我们内部呢,就只写了一个执行语句,这个执行语句的本质上来讲,咱们是不是调了一个方法叫做print line。好,大家你会发现咱们这个accept这个方法和这个方法呢,行参列表和返回类型都一样。对,这个方法的形态列表是不是只有一个叫类型,而我们这呢,是不是也同样的一个类型,是吧,然后呢,它是word的,然后这个呢也是word,那么满足这样的情况,我们说呀,就可以使用这个看作是对现有的accept这个方法的一个替换。
11:08
或者叫覆盖。好,那怎么写呢?哎,因为这块呢,你看啊,我们这个方法呢,是不是一个实例方法是吧。压,这就是非静态的方法吧,哎,它既然是一个非静态方法呢,我们是通过对象来调,这个对象是谁呢?就是我们system.out这个对象吧,所以这块呢,咱们就可以这样写了啊叫system.out是不是个对象嘛,然后呢,哎,冒号冒号的方式。咱们调的谁呢?调的是你内部的这个printline这样的方法,注意这块只写方法名,不要写小括号。好,这儿呢,就是咱们说的叫方法引用下面也可以去调一下。Accept,这个咱们再来一个hello。这样呢,我就写完了。那你看是没问题,诶那这个呢,大家稍微的体会一下啊,如果呢,你要看着感觉有点别扭,你说这块这是个对象,有点不太好接受,那大不了呢,你就把它呢先提出来也行啊这呢不就是咱们对应的叫打印流嘛,是吧,Print stream吧。
12:03
你就这样也行,然后这个位置通过去调是不是也可以。哎,没问题是吧,啊这块呢,你加不加这个空格呢,其实都可以啊行,这呢就咱们说的方法引用,呃,再来看下边这两个例子啊,这个咱们多举几个例子,大家去看看这个规律是什么,这呢,我使用另外的一个函数接口叫supply,然后供给型的啊这块我们返回值呢是一个什么呢?呃,返回值呢是一个string。啊,这个比如叫他啊另外一个啊pplier咱们先慢点来啊,呃,先写成咱们最初的这种匿名实现类的这样一种方式,我希望呢调这个方法返回一个死string型的一个对象,那这个对象是谁呢?诶不妨呢,提前我们先造一个叫员工。啊,New一个employee是吧,对employee的信息呢,不妨我就借用一下咱们当前这个reference下边这不有这个employee和这个相关的这个data,咱们就随便拿一个。比如说咱们把第一个这个小马哥呢,给他拿过来。行,这比较简单是吧,好,然后这块呢,有个employ,然后在这个方法调用的时候呢,我希望你返回这e.get一个name吧。
13:05
返回他的这个名字是吧。就可以了啊行,这样呢,就是咱们所说的第一种写法啊,写完以后的话呢,你要愿意调你就调一下,这不是咱们说的这个重点,对吧,Get这个操作啊,我们去输出一下,这样的话呢,不就把咱们这个小马哥的这个名字给他打出来了吗。哎,没问题是吧,哎,这是咱们说的第一种写法啊好,那下边咱们看这个第二种写法,咱慢点来再整一个这个拉姆达表达式的写法。行,那左边的话呢,跟咱们原来是一样的CTRLC。哎,这个写成二了啊,然后右边的话呢,直接看我们的一个所谓的抽样方法,然后呢,直接小括号了,就是吧,里边的话呢,我们就直接返回当前它的这样的一个name,这呢,因为只有一行之英语句,然后return呢,我们都可以省略掉,大括号也可以省略掉,诶所以呢,我们就这样写。这呢,就咱们说的第二种写法。诶get一下,诶这个咱们啊对着呢是吧,要了个get。
14:00
然后第二我们去输出一下。没问题是吧,好这个的话呢,就是我们说的这个第二种这个写法了。OK啊,来,咱们接着来看这个第三种的这个写法啊,方法引用。方法应用,诶,我再来分析一下啊,你会发现呢,我们现在要重启的这个方法叫盖方法,它的形态列表和反问类型与我们内部调用的这个概内的方法的形态列表和访问类型是一样的。啊,也是返回string类型是吧,那进而的话呢,我们可以使用get name这个方法呢,替换咱们现有的这个get方法。所以这块你看我怎么写啊,声明呢,还是咱们这叫supplier,还是这个类型的。啊,右边的话,呃,你发现呢,我们这个方法的调用者,它是一个对象啊,换句话说呢,它是一个实例方法了,对吧,那我们就有这个对象的发起啊,然后冒号,冒号叫get name诶就可以了。诶,大家想想我们为什么这样写呢?主要原因就在于你现在要实现的这个方法的形态列表,访问类型跟我们这个是一样的,而里边呢,你就调用了这样一个操作,那相当于是你的这个啊里边要怎么去其他方体呢,你就看一下我们这个方法怎么做的了,所以就相当于对它的一个覆盖,那那你得告诉我谁发起调用的呀,因为是个实例方法嘛,对吧,所以这块你告诉我是哪个对象就可以了,这儿呢,就是咱们所说的第一种情况。
15:22
叫做对象发起啊,实例方法的一个调用,它呢实现对于我们啊要重写的这个函数接口里边传方法的一个替换。好,那么针对于咱们第一种场景呢,咱就讲完了,大家看看能不能这块呢做一个总结。这块怎么去说这个事儿啊。你看我这块来表达一下啊,咱们写一个具体的叫要求啊。哎,要求什么呀?哎,你会发现呢,我们这个函数是。诶,接口的。哎,接口中的这个,诶抽象方法。呃,咱叫抽象方法A吧,是吧,它与咱们这个方法在被重启的时候呢,内部呢,我们提供的另外一个方法B,哎,他们俩相关的这个结构是一样的,满足这种情况我们就可以实现叫方法运用是吧,好写一下啊啊,与其。
16:16
啊,内部实现时。在调用的啊,对象的。某个方法B的啊,怎么着呢,叫行参列表和返回值类型都相同。啊,那我们说呢,此时。啊,可以考虑啊,使用这个方法B实现,对啊,方法A的。啊,一个替换或者说呢,叫覆盖。啊,那就是这个意思啊,诶你看咱们刚才写的这个抽样方法A啊,比如为代表的假如就这个吧,这个A呢,是不是就相当于叫钙的方法是吧,它与我们。呃,与其内部实现时,就是我们现在要重启这个方法时候啊,内部调用的对象的某个方法B啊,这里边我们调的这个对象的这个方法叫EP啊,它的一个方法B呢叫概内,这两个方法的形成列表和法类型都相同,哎,此时的话呢,我们就考虑使用诶方法B呢实现对方法A的替换啊,或者叫覆盖,那么此替换或覆盖。
17:20
在极为啊叫方法引用。就是这样的场景。啊,这要注意一下啊,哎,这里边儿呢,有一个小注意点啊,是怎么着呢,就我们此时候这个方法。呃B,它是非静态的方法。啊,它是非静态方法啊,需要我们对象来调用是吧。啊,所以这块呢,我们是对象冒号,冒号是理方法。行,这个呢,我们就说清楚了,那这个说清楚之后呢,其实我们第二种情况呢,就非常的好理解了,诶那我们先把第二种情况呢,其实可以直接来写一写了。好,那这种情况是什么样的呢?你看函数式接口,它当中有个串号方法A,它与其内部实现什么呢?调用的啊,这叫类的。
18:11
呃类的某个呃静态方法B的形态列表和反射类型都相同,那么此时呢,我们就考虑使用方法B呢,实现对方法A的一个替换和覆盖啊,这呢也称为叫方法用,只不过呢,此时我们这个方法B呢是静态的方法,需要呢类来调用。哎,仅仅换成了是一个静态方法而已。好,回过来我们看看这里边这个例子啊,比如我们先看这个,这呢我使用的是叫comp啊,有一个两方法来,我们直接来写啊,首先呢是咱们说的第一种写法了,这个呢就要comp,这呢我形成叫没问题是吧,好,这个COME1了啊new一个咱们再写一次这个最初的这种方式了啊在这里边干什么事呢?我需要return一下,我调用integer,它呢有一个方法。
19:02
诶叫做这个方法,我们把这O1和O2呢,给它扔进去。啊,这呢属于我们的第一种写法,没毛病是吧?哎,具体测试的话呢,你愿意测就测啊,这不是咱们说的这个重点了,比如我这写个12,写个21是吧,然后这块我们打印一下这个结果就行了,这是第一种写法,第二种写法,拉姆表示啊,我们快速的也写一下啊compare这呢还是这个。啊,这是我们的二啊,然后右边这块呢,我们直接就O1啊O2了。然后右边是吧,右边我们调用的话呢,不就是这样一个结构吗?哎,所以这样一写就完事了,这呢是我们的拉姆达表达式。你在这块诶随便写一个结果也行是吧,哎,就可以了啊好我就不调了啊,然后第三个的话呢,我们来看下这个叫方法引用了。左边的话呢,不变,仍然呢,需要去提供一个函数式接口的一个实例了,这我写成叫三,然后右边的话呢,大家看此时的话呢,我们要重启的方法呢,叫做compare,然后呢,内部我们调的这个方法呢,是内部的一个compare啊,这两个名一样不一样,无所谓啊。
20:07
然后你接着会发现呢,我们要重启这个方法的形态列表,以及呢反应类型,跟我们现在这个方法的形态列表和反应类型呢是一致的。啊,注意这块我没有说特别强调说非比要一样哈,你比如我们这个compare的方法,但你发现呢,内部呢,它需要的实际上是两个特类型的变量是吧,而我们这儿呢,实际上是两个特类型,你说类型一样吗?也不能算一样,但是呢可以兼容。对吧,满足我们说自动装箱啊,拆箱啊,这种情况也可以包括呢,满足这种多态的场景啊,其实也行啊,OK,那它的这个形态列表和我们这个反射类型跟咱们这个方法的形态列表反应类型是一致的啊,那么只要一致,我们就可以使用这个方法去替换原有的方法。那由于我们这个compare方法呢,它是个静态方法了,所以我们就拿类来调,哎,那进而的话呢,咱们这块写的话就是然后冒号冒号啊写个compare就搞定了。哎,这个呢,就是对应的咱们说的方法引用的这样的一个情况啊,哎,这我再随便来写一个,呃数据啊,让他做个对比是吧,这就可以了,行一次性的咱们跑一下。
21:10
这不就出来这个结果了吗?没啥问题是吧?好,接着我们再看下边这样一个例子啊,这个呢,比如我们声明的是一个方式啊,这呢属于一个叫函数式,就是正好它就属于一个函数了是吧?哎,这样的一个接口啊好,然后这块的话呢,我们可以写一个double类型,这儿呢,我写一个long类型,哎这样子的哈,然后我们还是先写一个最初的一个方式,方便大家去理解的啊,那以后要写的话呢,可能我们就不去提供这个,呃,匿名那种方式啊,上来直接就写这个方案应用了。哎,到时候大家得能看得懂啊,这里边做什么事呢,我们调用这个mass这个类。数学这一类呢,它有个方法叫做啊round是吧,咱把这个大部型那个值放进去啊,返回的就是一个long性的一个结果,诶这样我们写个return,当然了,这个round呢,它返回的呢,是一个我们基本数据类型的这个long啊,我们这呢需要是一个,诶这个叫什么包,这个包装类型的啊,因为呢,咱们说泛型呢,只能写这个包装类型啊,这呢其实也没问题,有一个自动的一个装箱是吧?OK啊好,这呢是我们的第一种写法啊,最原始普通的写法,第二种呢,叫拉姆奈表达式。
22:15
声明的话还是他。好,右边的话呢,诶这块应该知道了,直接呢我们就aw了是吧?诶右边这块我们直接呢,就把它的结果给返回一下,这不就妥了吗?这是第二种写法,然后下边第三种写法叫方法应用。好,然后呢,左边呢,还是声明一个这样的结构。嗯,写这个三啊,然后右边呃,你会发现呢,我们现在要重启的方法apply跟我们现在里边调用这个方法叫做run,它俩的形态列表反类型啊也是一致的啊,所以这块呢,与我们刚才这个讲解出发呢,也没有说非得相同啊,这个货一致。嗯。
23:01
或一致是吧,这个词的话呢,其实在我们上面这块呢,也是适用的,这个怎么叫一致,我说一下啊,一种呢,就是满足咱们刚才现在说的这个场景,说我这儿呢,需要是一个包装类型的一个double类型,而你这个round里边呢,写的是一个小写的double,满足这种自动装箱拆箱是可以的。呃,另外一个情况呢,就是如果我这是个double,然后这块run的时候呢,诶,如果是double的一个副类也行,那也能够往这放,那就是满足这种多态的场景呢,也算是一致的,所以这块呢,就相对来说就含糊一点了。OK啊,理解这个意思好,那此时的话呢,还是我们说的这个电列表和反问类型是一致的,那我们就可以呢,使用这个run的方法替换咱们这个apply方法,那它呢,因为是一个静态方法嘛,所以由这个类发起的一个调用是吧,然后我们就直接写个round就可以了。哎,这个就是咱们说的叫方法引用完事啊,这个我具体的就没有去调了,这个都比较简单,就不调了。理解一下这个叫防海云的情况,这儿呢是咱们说的第二种情况。
24:00
啊,最终呢,来看一下这个结果的话呢,感觉就非常的抽象了,诶大家要写的话呢,你以后你再写,你就不能再写这个一跟二了,也就是说呢,你现在需要提供一个方式,它的一个实现类的对象了,因为你发现任我里边呢,就是想针对于咱们这个double类型的这个值啊,做一个round四舍五入对吧,返回一个long形的这个值了,那此时的话,你直接上来就卖冒号,冒号round了。啊,非常的方便啊,这个大家呢,后边得会用,呃,现在咱们这个例子还比较少,后边咱们不是还讲这个stream API,这个string API里边呢,出现了大量的函数式接口,那很多场景呢,我们都可以使用这样的方法引用,到时候我们再说具体的一些应用啊。好,那么接着的话呢,咱们看下这个情况三,这个情况三呢,相较于前面两种情况呢,它是比较难一些的。啊,理解上呢稍微难一点,大家在使用上呢,也稍微的有点难度,咱直接呢就来说了,啊说咱们这块写的叫类去调实例方法呢,不太对吧。确实啊,咱们说实例方法呢,就应该是由对象来调的,只不过呢,格式上写成类冒号冒号来调了,本质上来讲,这个方法仍然是由对象来调的啊,怎么来理解来,我们下边举例子啊。
25:10
比如说啊,首先咱们慢点来啊,先写成最初的这个叫compare这样的方式,但是里边的话呢,我写上一个叫string。啊,我写的是个string,嗯,然后这块呢,我们去一个啊,Comp这一回车出来了是吧?好,这里边干什么呢?呃,我呢去比较一下两个死追类型对象的大小,哎,咱就直接return了啊O1.2compare to哎,我就写个O2,诶看没问题是吧。好,具体要调的话呢,这个你就。点我们来一个啊,嗯,Compare是吧,ABC。然后这个abd是吧,哎,输出一下这个结果,这不就妥了,第一种写法。啊,第二种写法呢,你就把它改成是这个拉姆表达式啊,这个咱们上面一直写着,那我这块也保留一下吧。诶把它呢,CTRLC啊,注意这块我们在写的时候,脑海当中你尽量就不要再浮现这个结构了,如果写出它了,你再把它改成拉表示,那还不如直接你就写它得了。
26:07
对吧,诶大家呢,其实也发现了哈,就是咱们写这个拉姆的表达式也好,方法引用也好哈,他从这个执行效率上来讲呢,并不比我们之前的这个快。啊,只是说咱们在编写的时候呢,从编写的角度来讲呢,是要更快的了。有同学说没觉得快啊,还得先写给他是吧,你要这样的话呢,那就写拉姆小式和方案云就没有意义了啊,以后呢,再写,你肯定是直接要反映这样结果,不能再去写它了啊,注意一下,好,那就意味着大家啊,你看啊,假设呢,我们现在就没有这样一个结构。啊,你上来呢,就写这个了,脑海当中大家要浮现出来这个comp,它内部的这个抽象方法。就是那个compare方法,而且有两个参数是吧,参数的类型呢,还是由我们这个泛型的决定的,所以你上来的S1S2啊,脑海当中应该是这样的了啊,怎么着呢?诶,我们希望呢是比较一下它俩大小了,Return呢,省略掉了,直接s1.compare。
27:00
S2这样调用一下。就是你脑海当中要浮现出来这个函数式接口内部的抽象方法长什么样子啊,这块呢,直接写的就是它的形态列表,这呢写的方法体。注意一下啊。好这个,嗯,你要愿意调呢,你就调一下是吧。哎,Compare这块你写个AB。C。啊,ABB是吧,哎,这样掉下就行了啊好,这是第二种写法,然后第三种写法。诶左边不变啊,CTRLC拿过来COM3是吧,好右边的话呢,这块咱们稍微的细致说一下啊。啊,因为咱们刚开始来讲这种场景,但是你看此时的话呢,我们要重写这个方法呢,叫compare方法,然后内部调的呢,叫compare to这个方法,这两个方法你发现呢,他们的形态列表诶不一样了啊我们这儿呢有两个参数,而这呢只有一个参数。对吧,那他们满足什么样特点呢?首先说这两个方法的返回值类型还是一致的,我们这in的类型这儿呢,你也是in的类型好,返回类型相同或者叫一致,然后呢,我们要重写的这个方法的参数的个数,假设我用N来表示的话呢,我们现在内部调那个方法呢,参数的个数呢,注意是N减一。
28:17
好,然后呢,我们要重启的这个方法呢,它的第一个参数恰好呢,是我们现在呢,要调用的这个方法的标者啊,也就是说你看我们这里边儿呢,N,咱们可以把这个N呢,拆成首先是第一个,以及它之后的N减一个,好那么第一个参数呢,作为我们内部的这个调用的方法的一个调用者出现了。然后后边这个N减一个参数呢,恰好跟我们调这个方法N减一个参数是一样的。啊,这是一共两个嘛,是吧,那所以这里边儿呢,就只有一个,诶那么满足这样的场景的话呢,咱们也可以使用叫方法引用啊吧,那么此时的话呢,注意我们就也写成叫string了,然后冒号冒号哎叫compare to哎这么着。哎,是不是感觉比较神奇是吧,这个我们看我三点啊,第一个compare的方法啊,ABC,然后逗号ABB是吧,哎,我们跑一下这个结果啊,其实这个结果的话呢,不重要了,也就看你自己结果是啥,那就是啥,关键呢就是我们这块呢再去。
29:15
呃,实现的时候是吧,这个结构清楚。嗯,这个稍微的难一点啊,咱们再来看一个例子,这个呢叫BY啊dic啊,也是一个断定型啊,或者叫断言型的这样的一个接口了啊好,这里边的话呢,咱们写成的还是一个死猪类型啊BI。啊PRE1是吧,这样写吧,诶还是咱们把最初的这个方式呢,咱们先给大家写出来啊好,然后这里啊,这里边我们写错了啊,点开以后呢,这有两个类型啊,一个是T,一个是U啊都得写上啊,所以这块我写一个不对。咱们回过来啊。这呢是写一个string,那我再来一个string。这么着了是吧,好,右边这块我们去扭一个。啊,一个呢叫BY啊行这么着一个格式。
30:03
好,这里边的话呢,我们通过这个S这个或者写成叫S1吧,通过这个S1呢,咱们去调一下这个叫E方法,然后把S2呢给它扔进去,诶这样的一个方式啊好,这个呢是咱们最初的这种写法,叫匿名实现类的写法。哎,第二的话呢,就是我们说的叫拉玛那表达式的写法。呃,把它呢,CTRLC过来,然后右边。嗯,这边的话呢,诶直接呢,你就得脑海当中去浮现它的内部结构了啊,我就给你写了,脑海当中你要能想到啊BY它这个方法的话呢,叫做这个test是吧,方法的话有两个参数啊,我们这个泛型的话呢,恰好是指定这个参数的那一个呢叫S1啊,一个叫S2,没毛病是吧?然后内部的话呢,我就想返回一下这两个字符是不是相等了,诶returnna也给省了,直接S一点啊ES掉这个S2,诶这么着。哎,这块你打开看一下,哎,不就是这样个形式吗?这是我们这个方式二的一个写法啊,行,然后呢,来一个。
31:02
哎,第三个叫方法引用。OK,来,把它呢拿过来。三是吧,好,右边的话呢,你发现呢啊,我们现在要调的这个T的方法呢,内部呢,诶我就调了另外一个叫E方法,你看大家会发现,我们现在调的时候,内部是不是只有一行输出语句啊,你要有多行输入语句的话呢,这个方法用是没法用的。OK啊,你看这个要求也挺高啊,然后呢,这个。呃,我们现在要重写的方法,它呢有N个参数,然后这里边看第一个参数呢,仍然是我们这个方法的一个调用者,然后后边的有N减一个嘛,跟我们这个N减一个参数呢,是一致的,方式类型也一样,诶我们就可以用这个方案应去使用了啊,那这种使用的话呢,诶我们因为已经确定了啊,你就是呃,要重启的这个方法呢,第一个参数来调用的了。所以这块呢,也没有必要去写是哪个对象了啊,咱直接呢就指明是哪个类里的方法就行,所以呢,String啊,掉这个一口方法完事了。啊,非常的简洁是吧,诶大家如果直接看到这个结构崩溃不。
32:03
崩溃的话可以扣一哈。啊,不是特别好理解是吧,写着写着就有感觉了哈,这个游戏呢,大家啊,比如咱们后边讲这个拉,呃,四中API的时候啊,我们会有一些函数式接口,就是当我们调某个方法的时候呢,你看它的行参就是写的是一个函数式接口了,这时候你上来直接画写一个方法用,实际上还挺帅的啊。呃,大家现在可能还没有这种感觉啊,当你有感觉的时候呢,其实。是吧,呃,尤其是怎么着呢,就是当你会写,然后呢,旁边这个同事啊,或者朋友来问你的时候,你说诶这个这个这个咋理解呢,你给大家稍微讲一讲的时候呢,还是挺侮辱人的。呃,其实大家你想想什么样的这个场景最侮辱人呢?哎,咱们说呢,你遇到一个这种算法问题是吧。算法问题里边你发现呢,呃,每一个API是吧?呃,每一个语法结构都认识,但是呢,你放到一起的时候呢,就不认识了,而且代码还没多少行,很崩溃啊,你要说我们完成个功能,这个功能里边你使用了一些,呃,新的这种炸包啊,框架啊,第三方的API啊,完成了啊,代码量可能也挺大的,其实你要是嗯不会写了,你拿到别的同事这个代码,其实你并不羡慕。
33:12
是吧,你会觉得说这有啥大不了的,不就用一个第三方的API吗?是吧?挺简单的啊,我只不过没用而已,你不会觉得他很高大上是吧?诶,当你遇到这种算法问题啊,代码量很小,每个API都认识,但是呢,你放一起自己不熟,你就感觉自己智商受侮辱了。啊,那同样的这个写这个拉姆的表达式写这个方案,同样的是这样一个场景啊,你说这个不会吧,你也学了,但是你放在一起的时候呢,你不认识。这个是不是感觉挺侮辱的?其实就是多写写就好了啊,OK。啊,有同学说这个顿是咋出来的是吧,这个顿呢,就是因为你那其实说白了,大家你发现一个点啊,就是不管这个代码怎么写啊,怎么简洁也好,还是怎么复杂也好啊,关键的就是只要没有歧义就行。你想想是这意思吧,只要没有歧义,给我们这个编译器呢,非常明确的指令,说你就去调,谁只要呢,他也清楚,那这个事儿呢,就可以这样做。
34:10
啊,只不过以前的话呢,我们编译器呢,没有让他呢去认识这样的符号而已,现在给了他这样功能了,是吧呢,我现在呢,想提供这个接口的一个,呃,实现类的对象了,当然对象咱们很清楚啊,就是你过对象了,像这种都是固定写法,关键的就是你得告诉我你这个创造方法,你想怎么写。对吧,那现在我告诉编译器说我这个双方方法里边啊,我就是想调另外一个方法。哎,然后呢,你这个方法呢,形态列表怎么用,哎,我就按照指定的规则,你去调离方法的时候,你也这样去用,然后你这呢,需要什么样反应类型,恰好就是我这个方法呢,反射类型它俩呢是吻合的,那我就直接呢,就用这个方法呢,相当于替换或者换句话呢,这个方法就充当了咱们呃要重启的这个方法的方法体了。啊,只不过呢,刚才我们提到满足一定的规则了。是吧,哎,咱们再写一个啊,来总结一下这个所谓的规则,来再看最后一个啊。
35:03
这呢,我写的是一个方式啊。这个还是咱们的第一种写法啊,最原始的这种写法,这里边的话呢,我们先来一个employee啊逗号一下,再来一个string,因为这个函数嘛,是吧。然后你有一个这个具体的方式了。这块的话呢,我提前呢,也得需要一个employee啊,咱们上面弄一个吧,我觉得刚才那块写过一个是吧。还有这个小马哥为例啊。好,提前的把这个小马哥拿过来,然后在这里边的话呢,我们就调用一下,咱们这个叫employee,哎,它的一个get,一个叫name。啊,就我们行参这里边儿的这个变量是吧,哎,把它那返回一下就行了,诶这个我们就缝起来。这意思吧,好,那这块我们调用一下啊,但是这个诶。放个一啊。他呢,第二天我们这个apply这个方法,把我们这个上面提供好的这个ERP呢,给它扔进去,诶这块呢,我们就返回了一下他的这个name,把这个name呢,咱们打印一下。
36:01
OK了啊。好,这不就出来了吗?没问题,行,这呢是咱们说的第一种写法,然后第二种写法呢,我们使用这个拉姆达表达式。好,那么这个拉姆达表达式的话呢。大家看看熟悉了没有?嗯,右边啊,右边呢,这块我们直接脑海当中啊,咱们把这个给收起来了啊,你看能不能这块直接映射了脑海当中呢,你要能够浮现出来function这样的一个函数接口内部的这个抽象方法。啊,参出方法呢,叫apply,诶放一个参数是employee类型的,返回一个参数,诶返回一个变量是string类型的,就这意思放一个,所以这块我就写个,比如说我就小括号了,小括号呢,其实也可以省了,因为就只有一个参数嘛,然后你想返回的就是它的一个name嘛。哎,所以这样写是吧。Employee类型大家给我报错了呢?看一下啊,说is already哦跟这个同名了是吧,那咱们这块呢,就写成employee吧。
37:00
Employee吧,对,这个是因为重名的这个原因造成的啊。好,然后里边呢,我返回的是谁呢?就是咱们这个啊,Employee的一个啊,这就完事了是吧?然后呢,我们通过它点我去调这个方法,把上面我们这个EP这个变量呢,给它放进去,然后打印一下,这不就成了吗?嗯,没问题是吧,好这呢是咱们说的这叫拉姆达表达式的这样的一个写法,然后呢,第三种写法呢,叫方法引用,诶。方云的话呢,还是啊,这块大家可能不是特别熟,咱们再看一眼啊,现在要重启的是apply,然后呢,我们内部调了该内,然后这个方法的反应类型首先一样,然后形态列表的话呢,这是有N个参数,然后我们这呢有N减一个参数,N个参数里边第一个参数跟后边N减一个这样来分哈,第一个参数呢,作为我们这个方法的调用者出现了,然后后边N减一个参数呢,跟我们这个,呃,要调用这个方法的N减一个参数是匹配的,因为我们这儿就只有一个参数了,诶这个N减一现在这块就是零了嘛,所以这也是零是吧?诶这个调用者呢,就是我们这个行参。
38:01
哎,这样来去理解,所以呢,我们就可以这样来写。啊,就理论上的这个事儿,大家应该是能接受了,关键就是写的时候呢,还不太能接受啊,好,你看这是我们要写的话,咱们要想掉的不就是employee里边这个get这个方法嘛,是吧,然后它是这个employee类里边的这样个方法,所以直接呢,我们就employee了。啊,然后呢,就冒号冒号啊get name搞定。啊,已经搞定了是吧,把我们这个EP这个给好的变量呢,我们放进去就行啊行,这个调用的话呢,这是小事。嗯,这个都是可以的,好,那由我们刚才写的这样几个例子呢,大家来做一个总结看看呢,怎么去写这个事儿啊。怎么写这事呢,这里边儿呢,稍微的要复杂一些了。哎,咱们写的要求啊,这样说说呢,函数式接口中的抽象方法A与其啊,咱们应该看第一个啊,因为这是一个实例方法嘛。啊的是吧,我把这个粘过来啊。
39:01
说在函数接口中的乘法方法A与其内部实现时,就我们重写的时候是吧,调用的对象的某个方法B的首先呢叫返回值类型相同。是吧,哎,这是其中一个点,然后同时怎么着呀,说这个诶抽象方法。A中是吧,有N个啊参数。啊,然后呢,这个方法B中呢。哎,有,哎,我们说那叫N减一个参数。这个没问题是吧,然后同时。且。啊且怎么着呢,写这个,呃,抽象。哎,且这个抽象方法A的,哎,我们说呢,第一个参数作为咱们方法B的调用者是吧,然后呢,且。还得起啊。抽象方法A的。
40:01
对,从小方法A的是吧,后N减一个参数啊与。方法B的。嗯,N减一个。哎,这个呃,参数的这个类型啊相同。哎,当然这块呢,咱们还是可以写叫或一致是吧。啊则哎,我们的这个可以考虑呢,使用方法B实现对方法A的替换,或者叫覆盖啊这呢,我们也称为呢叫方法引用。哎,就这个意思。这里边儿呢,稍微的复杂一些啊好,它的这个注意点什么呢,就是我们此方法B呢,它还是一个非静态的方法,需要拿对象来调。啊,需要对象调,但是呢。诶,格式上啊,或者叫形式上。啊,是使用这个对象。啊A所属的类。
41:01
啊,这个呃,或者这样说吧,但是形式上呢,我们写成是吧。哎,对象A所属的类啊,也就是说我们这块写的是类冒号,冒号实例方法。OK,就是这样一个情况啊,行,这个有点崩溃是吧。这个大家呢得接受一下啊行,那目前呢,咱们关于方法引用呢,咱就说到这儿了,诶后边的话呢,在死猪PI当中,我们会调相关的方法,哎,那很多方法的行参就是函数式接口,我们呢就可以考虑使用,哎满足一定情况下呢,使用这个方法引用。OK啊好,那么方法引用呢,咱们就说到这儿了,然后呢,接下的话,咱们看下边一个概念叫做构造器引用啊,以及呢叫数组引用,其实这俩呢算是一个事儿了啊呃,这呢就涉及到了我们在还是啊提供这个函数接口这个时现类的这个对象的时候,关键呢就是重写这个抽象方法,那你发现这个抽换方法内部呢,你就是调来构造器,构造器呢咱们也可以大家看成是一个特殊的一个方法。
42:01
比如说是吧,哎,当然咱们原来提过啊,构造器是构造器方法,方法就是你要把构造器看成是一个方法的话呢,其实呢,不就相当于是方法引用了吗。哎,其实这块呢,套路是一样,哎方案应用如果你要不懂这个呢,还不懂是吧,方案应要懂了,这个构造经营呢,其实也很好懂。来,咱们看看是怎么回事儿啊。首先看第一个例子。啊,这儿呢,我们来说一下这个构造器引用啊,诶这块呢,我们先写成最初的第一种方式啊,需要呢写一个叫supplier,这块的话呢,我们想返回一个什么呢?诶返回一个employee的一个实例。OK,然后这块我们去一下这个叫ER啊,内部的话呢,我们着return啊,我就一个employee,咱们这个类的话啊,Employee在哪呢?在这呢啊,这个employee的话呢,咱们提供了一个叫空餐的构造器。啊,就这哥们儿是吧,那相当于呢,咱们刚才呢,是不是就恰好调了这个空碳的构造器了呀,没没没问题是吧?啊下边你可以去啊调一下这个盖的方法,哎,我们就打印一下就行,这呢,因为你调的是空单的构造器,所以里边呢,什么属性呢,都是默认值了啊就成这样的场景了,这呢表明我们确实在这调了是吧。
43:10
OK啊,因为我们这构造新内幕呢,这不有个输入语句吗。OK啊,比较简单,行,这个是第一种写法,然后第二种写法咱就不写拉玛表示了啊,我上来就整方法用了。啊,前面的话啊,给你一个桥梁过渡一下是吧,今天不过渡了,直接上来写啊,今天呢,我需要的是一个啊supplier,返回的是一个employee。然后右边的话呢,我们就直接呢,在这个创氧方法的内幕呢,就是想调一个构造器了,哎,返回一个对象是吧,那你把这个构造器啊,这就长这个结构呗,如果大家把它看成是一个方法的话,那不就是跟我们刚才讲方向应就一样了啊,那你现在这个盖的方法内部这块呢,形态列表,形态列表一样,反应类型,反应类型你就看到是我们要造的这个对象的类型了。没问题是吧,是一致的,那一致的话呢,我们就可以怎么去写呢,注意看啊叫employee,你看下边都给我们提示出来了啊,有冒号冒号。
44:08
哎,这样的方式呢,就可以了。哎,这呢,就是我们说的这个构造器,引用它的一个格式啊,这个格式怎么写呢,也就相当于叫类名,然后冒号冒号,哎,New。哎,这样的一个格式的一个写法啊,分号我就去了。这个感受感受。完事了啊,完了以后呢,这块你要愿意调呢,你就哎稍微跑一下去调一下这盖的方法呗,一样是吧,调空滩的构造器啊。嗯,这不就这一组吗。没问题,好,接着我们看下边这个啊,下边这个呢,我就要一个function啊,这个function的话呢,我们内部脑海当中大家要浮现出来的apply的一个方法啊,传一个东西,返回一个东西,呃,我们现在呢,想调另外的一个构造器,比如说我米employ当中呢,有个这样的构造器。嗯,看一看啊。好,有这样构器,我现在就想调这个构造器,这个造器的话呢,因为人家int类型咱这不能写特了,那我就写成inel了,反利的话呢,是一个employee。
45:07
没毛病啊。好,我这块呢,去扭一下,然后在这里边呢,我就扭一下,怎么着呢,叫employee,然后把我们这个叫这呢,其实是个ID了啊,咱把它就改成ID吧。ID呢,给大家进去。哎,这那就完事了。哎,通过这方1.2,咱们去调一下这个apply,比如写个12是吧,诶输出一下,这不就是返回了一个employee的一个对象,这个对象的ID值呢,是12吗。看没问题是吧。这呢是咱们说的最传统的这个写法啊,这个没啥可说的。第二种写法。哎,录大器引用啊。哎,这个我写成方法用了,这应该叫构造器用是吧。类似啊,跟方案用的结构是类似的。哎,这个的话呢,还是。左边声明成。当前你的函数接口这样的一个变量啊,然后右边的话啊,注意看我们现在new的这个构造器呢,跟你这个方法的这个形态列表啊是一致的,然后呢,我们这个反应类型呢,就是new的这个对象了,所以我们就直接呢写成employee冒号冒号new。
46:11
哎,就搞定了,这就完事啊。那有同学说,诶这块你调的是哪个构造器啊,这个我们在这写明哈,它调用的是。哎,咱们这个employee这个类中参数式啊,准确的来讲呢,应该是这个类型的一个。够到期了。是吧,应该是这个类型的过道器,但是我那块儿呢,没有这个,诶它这还有一个自动装箱拆箱的一个点,所以说参数是,诶或者的话呢,你理解成是int类型的。这个哎,构造器。而你上面这块呢,因为你这个我们把这个收起来啊,上面这块我们这个是盖的方法,这个你没有参数,所以呢,在我们这个位置啊,咱们说呢,它调用的是。呃,第二呢,是咱们,诶是啊。咱们这个employee这个类中的啊,相当于是呢,就是跟你这个get这块参数一样,你这没有参数,那我们这也没有,那相当于它这个类当中那叫空参的。
47:10
诶,勾到齐了。就是这样的场景啊,行,稍微的体会一下,那下边就是一个调的事儿了,咱们拿这个a fo2点,咱们调一个apply给我传一个,比如说哎11是吧。哎,这就相当于给我们这里边儿,你不是调这个吗?那不就这个构造器吗?那就传个11呗,ID就是11,哎,就这意思啊。没问题啊,行,这个呢,就是我们说的这个第二个例子,再来一个啊,第三个啊,这个的话呢,咱们就。诶叫by function,是这个by function是一个什么意思,几个参数呢?点开看一眼。哇,这个参数还挺多的哈,它那里边儿呢是TR啊,三个反型参数,诶它呢,首先是一个方式了哈,相当于是一个二元函数吧。咱们说一元一次方程,你可以称为叫一元函数,比如Y等于这个FX,这就相当于是一元的,然后Y等于F,就是X1逗号X2,这就相当于是二元的两个自变量是吧?
48:13
OK啊好,那这里边儿呢,我们这个T跟U呢,就相当于是这两个变量的类型了,然后呢二呢,就是我们这个响应变量的这两个类型了,那就是从我们高中讲函数的角度来说的啊,OK回过来啊,这块呢,所以你填的时候呢,这个参数类型呢,填的就比较多一些啊。现在呢,我想调一下咱们这个类当中的这个构造器。哎,我想调它啊好,那这时候呢,我们填的第一个呢,那就是类型,第二呢就是string类型,作为咱们当前这两个变量的这个类型是吧,然后呢,你想返回的是一个employee嘛,诶这不就这样写呗。哎,放一是吧,好,然后你一个by by function。好,这里边儿我们就一下啊叫employee。这呢我们叫ID,咱改名吧,这个呢叫是吧。
49:01
OK啊。哎,这不就搞定了吗?行,这呢,就相当于咱们是对传统的这样的一个写法了。啊,最传统的一个写法。这个放1.apply一下,然后来一个ID,来一个十吧。STEM来一个比Tom。那么这时候我们反馈这个对象呢,就长这样。ID事实啊,内叫Tom,嗯,就这样。可以了啊行,这呢是咱们说的啊,最传统的写法,第二个啊,构造器引用啊。来往那一扔。这个呢叫方块啊行,现在我们想干什么事儿呢,我就想调一下你内部的这个叫apply这个方法,然后返回一个employee,一个对象啊,这就直接呢去造对象的啊,所以就用构造系引用就可以了,哎,我就employee,然后冒号冒号扭一下就行。啊,就完事了啊,这个结构很简洁,诶这个还是因为呢,我们这个形态列表,呃,跟你这都对应了啊,你这有几个参数,我那就找跟你这个参数一样或者对应的,诶我们相关的这个,哎,构造器。
50:03
那所以这块呢,我们把它的粘过来哈,比如说CTRLC啊放到这,诶它呢调用呢,就相当于是我们参数是in enter或者int,然后呢,这个哎,这个还得顿号一下是吧,然后死锥啊类型的这样的一个构造器啊,因为人家这块呢写的这不就是这样的吗。所以我们调的话呢,就调跟你人家形态列表一样的这个构造器啊就可以。呃,进一步的话呢,我们去证明一下这个事儿是吧。这呢,我们写一个叫方块。啊,这个我们写成11吧,这个来一个叫托尼。啊,你看我那个结果的话呢,如果给负上值了,那说明咱们调的呢,诶确实是这个构造期。没问题是吧,不会说呢,诶这块你写的它是不是叫空间的构效器,不是啊,诶根据人家这个参数来确定的。这个我们就过了是吧,来回过来呢,稍微的咱们啊说明一下啊,大家看我们这个结构呢,叫做类名冒号冒号new啊它呢,哎,首先我们说呢,第一个点啊,这呢是调用了。
51:08
啊,这个类名啊对应的。啊,这个类中的啊,是不是某一个确定的构造器啊。啊,调来构造器干啥呢?造对象呗,那这不还有个new是吧?哎,New搭配上我们这个,哎,对应类当中确定的这个构造器,我们就造了对象了,那么下边来讲啊说具体调用的是。啊,我们说类中的哪一个构造器呢。啊,这个我们说呢,取决于。什么呀,函数是。呃,函数是这个接口的,呃,抽象方法的。啊,是不是这个行参列表呀。OK啊,诶,你根据它的行参列表的个数和类型来决定你到底调的是哪一个构造器。
52:01
啊,这个咱们注意一下这个问题了,行,然后下边这块呢,还有一个数组引用哈,它其实跟那个构造信用的这个类似的啊,这个呢,就是我们的叫诶数组名是吧,然后呢,来个中号,哎,这块来个new。几个还得冒号,冒号是吧。哎,这块来个new就可以了啊,哎,现在呢,就是我们这个类名呢,你可以列解成我们new啊,造个对象了,然后这块new就造一个数组,哎,所以这个格式的话呢,也很好理解啊好,回过来我们举一个例子就行了,比如说这个吧。这呢,我写的这个方式啊,嗯,想干什么事儿呢?呃,我希望呢,在这个啊,重写的这个play方法里边,返回一个指定长度的employee类型的数组。啊,所以这块呢,我们这个T传什么呢,我想传这个数组的长度,然后我就用这个了。然后类型呢,是一个类型的一个数组。就这意思啊。诶,那这都给我写出来了啊,这个位置呢,我们写成是一个叫Les吧。它啊,好把这个lengths呢,我们扔到这里边。
53:01
就行了。能理解是吧,诶返回一个类型的一个数组长度呢,就是我们传的这个类型的一个参数啊,这个是咱们最初的这样的第一种写法。哎,这里我就不去调了啊,然后第二种写法。把它呢拿过来。诶,然后来这个是方法二啊没问题啊,然后右边的话啊,右边的话啊,注意看这时候的话呢,我们需要呢,返回的是一个数组啦,然后这块还是个new的方式,哎,那这个数字是employee型的一个数组,这块怎么写啊,诶就写成employee诶这样一个中号。呃,然后这块的话呢,我们冒号冒号啊,这块来一个new就可以了。啊,也就是说,诶这块你这个参数咋用的呢?哎,其实呢,就是提供我们这个数组的这个Les的。啊,数字这个length的啊,行那就完事了。啊就可以了啊行,这块你要愿意调的话呢,也行,比如说我们在这个位置啊,通过这个方一点,咱去调这个叫apply这块,比如这个长度的写了个十,相当于返回的不就是我们这个数组吗?这个数组话呢,不是有一个属性叫Les,诶我们直接打印一下。
54:03
这个能理解是吧,那第一个的话呢,我们这个长度不就是十吗。没问题是吧,好,那么第二的话呢,我们类似的啊,比成C把它粘过来,这个我们叫方块二,这个位呢,比如说我改成这个叫20,哎,我们再走起一下。那这个20分看就出来了。呃,相当于呢,我们这时候呢,传递20确实作为咱们这个数组的长度出现的啊,没问题。行,这个呢,就是我们称为的叫数组引用啊。整个呢,咱们关于方案引用啊,高端去引用,数度引用咱们就告一段落了,诶大家呢,需要自己写一写啊,你要不写的话呢,这个看完以后你发现呢,就就懵了。是吧,亲自写一写,你发现呢,也就那么回事儿啊,你看我刚开始学的时候呢,其实也是觉得哇,这是啥呀,这。这这这这太诡异了是吧?诶当你自己试着去写写的时候呢,你发现。啊,也就这么回事儿啊,你告诉自己,你说这个东西呢,其实不太难是吧,啊你写写的话呢,其实也就有感觉了啊,啊尤其呢是当你自己呢,可能也迷迷糊糊写出来了,突然别人问你说诶这个是啥意思呢?
55:06
哎,突然你会觉得自己好像比他懂得要多一点,你给他讲一讲,你发现了啊,也就这么回事。OK啊行呃,那么大家呢,稍微的练一练,我们这里边讲的这个方案有构造器有的是啊。
我来说两句