00:00
好,那么讲完这个枚举类之后呢,我们来看下边这个概念,叫做annotation啊,这个单词的话呢,得会念啊,有时候我我之前我都念错了,我念成annotation,其实应该念annotation啊。这呢翻译过来呢,叫做注解啊,你看我们这块呢,这是一个包了啊,我右键的时候呢,我们去new new一个具体的这个结构,诶我们以前呢,都是new的class还可以呢,New接口,然后还可以呢,去new这个美举类,诶这块你看还有一个呢叫。啊,这呢,翻译过来叫注解,哎,是一个什么样的结构呢?哎,首先我们来看一下这个课件。说注解是什么注解呢,它是JDK5.0的时候呢,引入的一个结构,它这个结构呢,是长这个样子的,有一个圈里边有个注解名,呃,通过这样的方式呢,在代码当中存在,其实呢,我们在前面这个学习的过程当中啊,已经见过相关的一些注解了。比如这个啊叫oy的,哎,它呢来修饰一个方法,表明我们修饰这个方法呢,是你把父类那个重写的这个一个方法了,这就对应的是它,然后这里边呢,我们一会儿呢,还会去讲这个啊叫depreated,表示呢,就是相应的一些结构呢,已经过时了,这个呢,表示抑制编译器警告了啊相关的一些这种注解,OK啊下边这个说明。
01:12
说呢注解可以呢,像修饰符一样呢被使用,可用于修饰包类构造器方法,传变量,参数就变量等等,它可以修饰的结构呢,非常的丰富。然后呢,还可以呢,添加一些参数值,这些信息呢,被保存在啊annotation的叫name等于value这样的一个对当中,哎,像这呢,就是。啊,Name name在那叫value,然后它的值呢,叫做unchecked。啊,就是未被检查的啊,这样一个特征啊,然后这个注解呢,它可以在类编译运行的时候呢,进行加载,体现不同的功能。啊,这块呢,相对来说就会比较抽象了,咱们下边呢,有使用场景来进行一个解释。OK,好,接着我们往下再说啊呃,这儿呢,我们叫做注解,以前呢,我们在讲第一章hello的时候呢,讲过这个注释。
02:04
啊,注释呢叫comment啊注释注解呢跟注释啊,嗯,你要说像吧,也都有点像啊,毕竟呢,都是属于我们在程序当中使用的一个结构了啊哎,你要说不同吧,他们其实也不太一样啊,怎么来讲。说注解呢,如果宽泛意义上来讲呢,可以看成是一种注释了,但其实是两个不同的结构啊,那这个注解的话呢,我们说成圆,在不改变原有结构的情况下啊,我们在原文件当中嵌入的一些补充信息,从这个角度来讲的话呢,它俩有一定的相似度。诶,但是呢,这个注解呢,还是不同意注释的,这个单行注释也好,陆上注释也好,咱们前面讲过的这个呢,主要是给咱们程序员看的。啊,这个非常明确的就是给成员看的,因为呢,咱们编译以后生成的自解码文件当中是不包含单行注释和多行注释的。显然呢,就是诶让你看这个点Java格式的这个文件的,那就是让我们程序员来看的哈,而这个注解不是了,注解呢,它可以被编译器或者是其他程序呢所读取。
03:05
啊,我们读取的话呢,还要体现它相关的一些功能,所以从这个角度上来讲呢,它俩呢是截然不同的啊。啊,那么具体怎么来讲呢?下面我们来看看他的一些具体的使用了。首先的话呢,先明确这个注解的一个重要性啊,在咱们Java IC当中,也就是这个Java技术当中,咱们这个注解啊,其实不是一个重点内容。啊,也就是说咱们其实了解一下就可以了啊,但是呢,在我们后续的学习当中,比如说学习这个Java呢,就后期要学习Java的框架了,大数据的话呢,学习大数据的框架了,安卓的话呢,要学习安卓相关的很多的这种小框架了,啊那么在使用这些框架的过程当中,你会发现呢,这个注解呢,它占据了非常重要的角色。啊,也就后期呢,我们在框架的学习当中啊,是一定要用这个注解的,所以呢,要那样讲的话呢,我们现在应该重点讲一讲啊,其实不用为啥呢,因为到时候你得看你使用的是什么注解了,注解本身这个事儿呢不复杂。啊,我们在基础阶段呢,也基本上可用,可不用。
04:03
只是在后边的话要用,后边用的话,你就看这个注解是干什么用的了,就跟你说类重要吗,类重要。啊,但是呢,你现在把这个类你也讲不透,你后边呢,学框架的时候还要学具体的类呢,是吧,所以呢,到底怎么用,还得看具体这个注解是长什么样子的啊。那为什么说这个注解呢,在后期的框架当中学习很重要呢,因为呢,它可以呢,替换咱们以前的这种,呃,繁荣的代码和叉帽这种方式的配置。哎,包括呢,我们后期的这块提到了相关的一些框架呢,也都是基于注解呢去设计的了,怎么来理解呢?来我们一个一个来看哈,首先第一个的话呢,这是我们在之前写这种啊,相当于叫文档注释的时候呢,见到过的这种场景,这儿呢,也算是一种注解了。啊,这是生成文档相关的这种注解信息,这是第一个使用场景,然后第二个使用场景呢,就是我们一会儿要讲的啊,在Java基础阶段呢,咱们也就给大家呢提这样的三个注解,让大家来感受一下,知道是什么作用就可以了,哎第一个呢,Override呢,就表明我们这个方法呢,是重写的复类的方法,哎,这个deb呢,表示我们所修饰的这个结构啊,它已经过时了。
05:09
诶过时了,难道就不能用了吗?也可以用啊,但是呢,不推荐你去使用了,有可能它在某一个不确定的版本当中啊,就把这个结构呢给干掉了啊,然后这个呢,叫surprisewing叫抑制编译器的警告。啊,这个我们一会儿也可以举例子啊,这个呢是咱们基础阶段呢,给大家举这样的三个例子就完事儿了啊,然后呢,刚才我们提到说在后期的框架当中啊,我们使用是比较频繁的啊,怎么来理解,比如说呢,诶像咱们这个Java的同学,到第二阶段我们要学习javab相关的一些知识啊,前台呢,会到HCSS这块们后这个交互。啊,那这个是什么呢?这就是一个叉,你看我这块也写了哈,叉这种一个格式的啊,叫文件也好,叫这个语言也好。
06:02
啊,这个呢,叫扩展性的标记语言。啊,扩展性的标记语言里边呢,都是这种标签的方式。那以前的话呢,我们要是这个写一个针对于我们上面这是一个登陆相关的一个功能啊,我们要是配置这个色类的话呢,得写这么多的信息,现在的话呢,一行搞定。哎,你看这呢,就用了个注解。啊,其实这块呢,想代表的意思是什么呢?就是我们这块儿,呃,用户呢,通过这个客户端或者是浏览器呢,他发送了一个请求,这个请求呢,或者他可以发很多的请求啊,我也不知道这个请求到底是什么,这块呢,他会传送过来一个标签,这个标签呢,比如说就叫做login。诶,就是这个标签啊,那以前的时候呢,我们这个标签呢,就是相当于是在这儿去识别了,你发的这个标签呢,跟他一样,它呢跟它匹配,它呢跟这个是一样的,这个呢,就对应着我们当前是哪一个类了,前面是包名。我呢就去创建你这个类的对象。而现在的话呢,不用那么复杂了,你直接呢发送过来,这个标签呢,不是叫log in吗。
07:01
诶,我这个log我直接就在这写了。他呢,就来修饰你下边这个结构的。所以那个标签跟他只要匹配一样,我就去造你这个类的对象。所以呢,一行就可以替换原来的这么多行,哎,这不就更简洁吗?好,再举个例子啊,在后期呢,我们这个比如说学习Java的同学呢,我们要学习非常重要的一个框架呢,叫做spring这个呢。这个就叫spring啊。哎,就是相应的我们这些框架呢,你就不要去翻译了,因为学这个框架呢,叫春是吧。啊,叫泉水啊都不合适啊,就直接spring啊,但这个框架里边呢,我关于事物的这个处理的时候呢,原来也是用这个L格式,用文件的方式,现在不用了,直接呢,你就写个注解就完了。就搞定了。诶,所以呢,我们后期的这个框架呢,其实基本上都是基于注解的啊,那为什么我们现在技术阶段不讲那么细了,因为这个注解现在讲怎么讲。是吧,你只能后期学的时候呢,就告诉你它是什么意思啊,这个配置的参数是都有哪些,诶熟悉这个事儿就可以了啊。啊,这呢,就我们相当于讲清楚了这个注解的主要作用啊,在后期框架当中主要体现就这里边这个实例三。
08:06
OK啊行,那这个呢,基本上我们就说清楚它的这样一个场景了,然后回过来呢,稍微的咱们把这个笔记呢填一下啊,第一个关于annotation它的一个理解。哎,这块我们就提到了这样的问题。诶,首先我们知道它是5.0的时候呢,引入的,也就是在5.0之前呢,我们要在框架中使用呢,就是使用的这种配置文件的方式了。好,然后呢,接下来啊,这不就提到了有这样的两个事儿吗。啊,这个大家呢,粘过来这个稍微的体会一下就可以了啊。哎,这个也用不着去深究。好,这是它,然后具体体应用场景呢,刚才我们是举了三个例子,第一个呢,就是我们生成这个文档注释的时候,诶,我们加了这样的一些相应的参数信息,诶第二呢,就是我们一会儿呢,要给大家讲的,在Java基础阶段,我们使用的这样的三个常见的注解,通过这三个常见注解呢,我们稍微的讲一下这个注解它到底是怎么用的啊。
09:01
然后第三个呢,就是真正我们在后期框架当中使用的这样一种场景。CTRLC下。诶,这个我们放在这就可以了,好那么在基础阶段呢,我们讲的这三个注解,就是上面提到的这三个,那下边的话呢,我们稍微的讲一讲这三个注解的一个使用。好,那么在当前这个包下呢,我们去新建一个class啊,我们叫annotation。它的一个测试,哎,这就过来了啊好,那我直接呢,把这个代码就写到下边了,首先的话呢,我定一个类呢,这个类叫person类啊,String类型的name。哎,这个int型的age啊,这个我们都非常熟悉了,在这里边儿我写个方法叫做it。啊,这个人吃饭。好没问题啊,然后呢,我们再去提供他的一个此类这个我们叫做student,让他呢去继承于我们这个person。啊,继成P以后呢,我们可以针对这个E的方法呢,做一个重写啊,这呢我就直接写到下边了,这个呢叫哎学生吃饭,哎我就简单点了啊。
10:00
这个方法的话呢,就是对它这个重写啊,这呢也能看到这样一个符号啊,都很清楚啊,只不过呢,就是在这个方法上面呢,我们可以呢,使用一个注解去修饰啊,就是我们这叫O的这个注解。啊,那修饰跟不修饰呢,你说有什么区别吗?难道不修饰的话呢,这就不叫注解了,哎,这就不叫重写了吗?也叫是吧,哎,只不过这块呢,它会显示的,去校验一下哈,你这个方法呢,是不是重写的。如果说啊,举个例子啊,比如我们要是没有这个注解的时候呢,我这写的要一一了。那就是跟上边这两个不同的方法了,你在这种情况下呢,如果你试图呢,去加一个叫oy的呢,它就报错了。因为它显示的校验说你这个方法呢,根本就不是一个重写。啊,它就会提示我们这样的一个问题,相当于呢,一个保护机制一样啊。啊,就好比是比如说举一个特殊的场景啊,比如我们这块呢,写一个叫work的方法是吧。哎,这个我们叫这个人走路。
11:02
哎,这样写的啊,然后呢,你这个方法呢,在子类这块你去定义的时候呢,一不小心呢,比如说你把这个L呢写成一了啊。哎,这个呢,叫学生走路。哎,写成这样了,哎,你以为这是一个重写呢,结果呢,你在这块调的时候呢,你发现呢,哎好像不太对。比如说哎这呢,我们就诶声明成就这个percent啊是一个PE啊new了一个student,这是一个多肽了,通过PE呢,我们去调这个work方法。啊,结果这块呢,执行的时候说,按说呢,这不应该是一个方法的重写了,呃,应该是叫虚方法调用了执行的应该是子类的这个重写方法结果诶怎么还是类呢。感觉莫名其妙的啊,其实你细看的话,你知道这个呢,跟它根本就不构成重写,是你自己写错了啊,那如果说要是有这样的一个注解存在的话呢,你就明显知道呢,就是写错了。所以它能起到这样一个作用啊,加上0L,这时候呢,你再去调,这就是你此类的一个方法了。那就这样啊,行,这个呢就叫做overread,它呢,注意只能够用来修饰方法。
12:03
哎,只能够用来修饰方法啊好,这呢是我们说的第一个注解了,就它,然后第二注解呢,叫pre啊。哎,这个呢,表示的就是,呃,废弃了过时了啊,就这个意思。嗯,怎么用呢,首先呢,我们来看看现成的一些结构,比如说我就在这边啊。后边呢,咱们会讲这个日期的相关的API,这个叫date了啊,这我写个date,一个date。啊,这呢,我们指明一下al回车咱们用一下下吧。好,那么UT加这个date呢,它表示的是一个就是日期的一个类啦,然后呢,我们现在造了他一个对象,我们打印一下这个值,此时呢,获取的就是当前的时间。哎,2022年的这个咱们是这个11月28号周一是吧,哎这个时间,哎这没啥问题啊好,那么这个date的话呢,我们进到它的源码当中。哎,我就进来了啊,进来以后的话呢,我们比如说CTRL f12啊这呢,我们就能够看到当前的这个类里边定义的一些结构,然后你会发现呢,有一些位置呢,加了这个。
13:06
中间这个线了啊。这个线的话呢,表示的就是对应的这个结构啊。哎,加了这样一个标识。叫P了是吧,表示呢已经过时了啊,过时的意思呢,就是我们不推荐去使用它了。但是能用吗?能用啊,那你比如说这个date,你看叫年月日,哎很清楚,那我们这块就想用一下,哎,咱们用一下啊。诶,这个叫一。诶,一个这个data,然后这块呢,比如我们写2022年的11月。啊,来个随便写一个吧,29号。好,我就写完了啊,写完以后的话呢,明确的就是我们使用的就是刚才这个构造器了,因为它加了一个deprecated,所以呢,这块它也给你加了一个线。诶,那接着的话呢,我们试着呢,打印一下这个对象,你看看是不是咱们今天啊走一下。啊,你发现的好像不太对。啊,3922年啊,咱们都不在了是吧。
14:04
怎么成这一天了呢,诶这个呢,就是因为它这个构造器啊,它其实有一个这种偏移量哈。呃,它其实呢,就是在1900年的基础之上呢,又加上了这个2022了。所以这块你要写的时候,你得把这个1900的给它剪掉是吧。当然这个这细节了,咱们就不不去看这个细节了哈,这个我们后边讲这个日期的时候呢,到时候我们再说一下它总之的一个点是什么呢?就是这个构造器呢,不建议我们去用了。所以呢,这块呢,它就加了一个depre,但是呢,标识为已过时的这个结构呢,还可以用,只是不推荐而已。啊,那一般呢,他告诉我们说不推荐了,通常大家如果你要看他的API的时候呢,他会呢,给我们一个提示哈,他会告诉我们说拿什么替换了。你看replaced by是吧,用后边这个结构呢,给替换了。所以呢,诶不推荐你用了,那你推荐用什么,你可以呢,看看它这里边的一些说明就可以了啊好,这呢是我们看的现成的一个结构,那我们自己写的呢,也可以用,比如说我这儿来一个public和一个person,这呢是一个空的构造器,我再来一个public person。
15:13
我这写一个四针形的name。诶,我这么着是吧,诶C4点。好,那么这个扩大器呢,我现在也加了一个叫de。那压之呢,就是这个构造性呢,不建议你用了。但是呢,你也可以用。哎,下边呢,我们就诶P2NEW一个person,这个呢是我们空餐的哈,这没问题,那现在我们再new一个P3,这个时候呢,我写了一个叫Tom。哎,那不好意思了,这个呢,我们标识为是一个,诶过时的了,哎,当然你如果就非要用,非要用呢也行啊,包括呢,我们有概塞方法。哎,不是盖方法图方法。诶加一个它是吧,把这两个纸呢,打印一下这块我们也可以呢,输出一下这个P3。哎,照样没啥问题。
16:01
哎,啊,也照样是可以输出这个结果的啊呃,他标识为过时呢,呃也一直呢,就是他在以后的某一个版本当中有可能会干掉,所以呢,他就不推荐了。实际说白了,大家想想为什么我们要把相应的结构加上过时啊?对,其实呢,他是不想用,不想让你这样用了是吧,但是呢,他为什么又没有马上给他拿掉呢。对,因为你以前的代码可能用它写了是吧,所以咱们在这个JDK,不管是JDJDK也好,其实所有的这种软件都是一样啊,我们有一个特点呢,一定要向下兼容是吧。对,你比如我们这块呢,在1.2的时候呢,出了这样一个API了,然后呢,在出这个1.3这个版本的时候呢,这个API呢,不想用了,你不能啊,一下子就给它拿掉,那原来用这个版本的这个代码的话呢,在新的JDK上,这就直接报错了,如果要是这样的话呢,那就任何一个厂商就没有动力呢去更新JDK了。一更新了,我原来项目都跑不了了是吧,所以你必须要呢向前兼容,所以这块的话呢,我不建议你用了,我就加了一个标识就要过时了,所以呢,你要是再写新的项目的话呢,你看到这标识呢,你就避开它。
17:11
哎,这样的话呢,导致你后边代码的话呢,就没有用它了,但是以前的代码的话呢,还正好能跑,诶其实就是这样的特征。这呢就叫做哎。我们就说到这儿了啊。好,然后再往后看的话呢,这个叫surprise warming啊,它呢叫抑制编译器警告啊,啊这个我们也是做一个了解就行啊,你像我们这块看到有好多这个。橙色的是吧,这个呢,其实就相当于是一些警告信息。嗯,这个呢,如果你看着感觉这有点碍眼,可以把这个相应的这个警告信息呢,给他,一直不让它去做这个显示啊,比如说举个例子哈,Number呢,这我写一个十。啊,写完了是吧,写完以后的话呢,这块呢,看看他是说谁的呢,说的不是他。啊,这个就比如以它为例吧,针对于我们当前这个number的话呢,你看我光标放在这儿。
18:04
然后呢,我们点一下这个吧。哎,它这有一个叫surprise,就是意志的意思啊,放在哪呢?放在类上面,放到方法上面,还是放在这个语句上面,我就写放到语句上面吧,点一下。你看这块就有一个他。他的意思呢,就是你当前这个变量啊,你没有用。你光定义了,你没使用。哎,我这儿呢,就是有一个警告你,警告你没用。没用的话呢,有可能你根本不需要,那就把它删掉就行是吧。你看我刚才呢,要没有它的时候呢,这块你看它是个灰色的啊啊第二你看做的还是挺细致的啊,这个P2呢,你也没有用过,它就是灰色的,P3你用了它就是这个黑色的了,这个你没用吗?但是你看我加上这个注解以后的话呢,诶它这块就变成一个黑色的了。哎,因为我把它呢给标识了。哎,类似这样场景,这就叫抑制编译器警告,了解一下就行。好,那这呢,咱们就把这个Java基础阶段呢,咱们常见的这三个注解呢,就说清楚了。
19:01
啊也比较简单啊好,那下边这块呢,我们再把这几个事儿呢说一下。好,下边这个呢,叫自定义主解。啊,稍微的咱们感受一下如何呢?去呃自定义注解啊呃,自定义注解的话呢,大家就以。啊,叫warming为例。啊,做一个参照啊。来进行定义即可,这块呢,不算是咱们的一个重点内容啊,呃,大家呢,如果以后呢,呃,你需要呢,去写框架的时候。啊,我们说框架里边呢,就大量的使用的注解了是吧?诶这里边呢,其实也涉及到有一句话啊,刚才我在课件里边也有就是这个框架的话呢。他呢,其实就理解为。首先呢,我们有注解。然后呢,后边呢,我们会用这个反射呢,来调取这个注解。哎,然后呢,再配合相关的设计模式。这呢就是我们的框架。啊,就是基本上能给你搭建起来的哈,然后具体呢,你使用这个框架呢,再结合你具体的这个业务呢,去写你这个项目就可以了。
20:07
就跟类似于说人的一个骨架一样,是吧,然后你再把它填充的有血有肉的啊,就是实打实的一个具体的项目了啊,然后呢,这个注解呢,就体现了这个在框架中的一个使用啊,那么什么时候我们会自定义注解呢?一般的话呢,如果我们开发的时候呢,就用现成的框架了,人家注解都定义好了,你直接拿过来用就行了。啊,那么如果以后呢,大家有啊这个这个需求,自己写框架的时候呢,你毫无疑问也会去自定义注解的。哎,同学说那这个一般不会出现是吧。啊,不一定哈,呃,因为呢,你看我们要不你去的是这种大公司,比如像阿里,在咱们国内来讲呢,整个Java的生态呢,其实阿里的话呢,支持力度还是很高的啊,很多的一些开源的框架呢,其实都是阿里呢推出出来的,包括呢,你像这个在大数据里边用的这个flink啊,也是阿里这块呢推出来的是吧,还有很多其他的一些框架哈,有大的有小的,呃,那么这些框架的话呢,如果你参与其中了,那毫无疑问呢,呃,你要是用Java原来写的这个注解呢,就要使用了。
21:04
说那我也去不了阿里是吧,诶你要是去一些中小公司,或者去一些比如说这个国企相关的一些公司,哎,有时候你也会发现,比如说你去这个平安银行了,哎这个银行的话,你发现了它用的呢,不是我们常见的比如说SSM框架了,它就是公司它自己整合了一套框架。啊,可能更方便的去使用啊,那么自己整合的这套框架呢,实际上也算是自己开发的了,其实里边呢,也会涉及到一些自定义的注解的问题了。OK啊,所以说大家呢,知道这个框架呢,前期呢,我们作为一个学习者啊,我们都是学别人的啊,那以后的话呢,其实你也会参与到相关的这种开发当中的啊。好,那这块我们就稍微的感受一下,说这个注解呢,该怎么去定义哈,定义的话呢,大家就参考一下这个warming就可以按住CTRL键啊一点。是不是就这样定义的?啊,看着是怪怪的是吧。诶,这个注解的话呢,它是使用这样的一个结构呢,来去定义的。注意啊,跟接口没关系。
22:00
啊,前面有一个这个符号啊,就是通过它来去定义的,好,那咱们也写一个啊。右键。哎,你一个这块,然后我们就选择它呗,这个比如说我们就叫做my anation。哎,就它了啊。好这呢,我们就哎写成这样了啊,然后它这里边儿有什么呢,我们也抄一下吧。它这也叫死string形的一个数组,哎,叫value,这这这算叫什么呀。这叫方法呀,还是叫属性啊。看着好像怪怪的是吧?感觉有点像是一个抽象的方法是吧。哎,对啊哎,其实呢,这个呢,我们理解成呢,其实是一个属性哈,但这个属性的话呢,是一个死轮形的数组,其实呢,就可以有多个值的意思。哎,多个值,诶,我看我这块能不能看出来这个效果啊。嗯,比如说这块,诶很遗憾了,你看我们这个值的话呢,它呢,刚才我们把它抑制住了,它就这一个警告没它了是吧。没它了,比如说我们这个结构呢,我们看一下啊。
23:04
嗯,这个alt回车。这个有一个他。嗯,我们点一下。这个呢,我们放在这个上面,这是一个。嗯,还有不。Out,来一个回车。他也就这一个呀。没了。没了,那它就一个啊,什么意思啊,我想说的这个事儿啊,就是我们这里边儿呢,提到了它是一个数组类型的,就意味着它其实可以有多个值啊,比如说这呢,这不就其中的一个值吗。诶,如果你要还有的话呢,这个你可以在接着上再给他去复制。啊,就这个场景啊。呃,因为它是个数组类型的,只不过这里边儿呢,我们恰好就只有一个了。嗯,这呢是我们说的这个场景,然后呢,我们自己呢,定义的时候呢,也可以呢,去提供它的这个属性啊,比如咱这块呢,不是个数组,就是一个死针形的啊,这块呢,注意后边有个小括号啊。啊,你就按照它这个格式来就行,这个属性名呢,就叫做value了。
24:00
定义完了。说这是干啥的呀?那就咱们先用一用呗。啊回过来啊,这块的话呢,在哪用啊,注解使用的位置啊,其实挺灵活的啊,比如说咱们这块呢,就想在person这个类上面去使用,那我就这块写一个叫MY。哎,这块呢,我就写这了,写这以后呢,他就报错了啊。它的错误信息呢,就是你当前这个注解呢,有个属性,这个属性呢,你没有指定值。啊这块,比如我就写个Y6,然后呢,你这样写,比如我这呢,表示的我这是个类啊,然后我就这样来写了。哎,就这个意思。啊,你说我这边想修饰一下我们这个。扩大器,那我就写到这了啊叫my attention,哎,还照样的报错,就是提示呢,说你这块没有给这个属性赋值。呃,其实这块呢,回来在这个啊属性的后面呢,我们可以呢,给他提供一个默认值,比如说哎,我就写个哈路了。这我就很随意的来的啊,具体这个注解呢,看你到底定义是想干什么了啊好,我这个写完以后哈,再回过去诶,你发现的马上就不报错了。
25:06
为啥呀?对,因为我要没写的话呢,就是用的哈。呃,然后回过来这个位置我写了,相当于用class呢去替换了哈。哎,就是这个意思啊啊这呢就是来修饰它的。那自定义的注解。那就这样了。你说这这干啥呢,这是。是吧,哎,这个要干什么呀,这得看你后期呢,你定义这个注解的时候,你想让他干嘛。然后呢,我们还得用配合一个反射的方式呢,去用它才行。单纯的光写这呢,它就纯粹只是一个标识而已。啊,那我们讲后头讲到后边这个反射的时候呢,我们再呃,结合着这个注解呢,我们到时候给大家举个例子啊,暂且的话呢,咱们就稍微的感受一下就行了啊。好,这个呢就完事了,然后下边这个呢,叫圆柱解的一个理解。啊圆柱解什么意思?
26:01
哎,圆柱解,首先我们解释一下啊,就是对现有的注解进行解释。哎,说明的注解。有点抽象,我再换句话呢,更抽象,对现有的注解进行注解的注解。又要圆柱姐。啊,还不明白,好,我再给大家举个例子啊,看这个我这儿呢,写一个他。这个我们已经很常见了啊,哎,那么问一下这呢叫类型,这个叫名,这个叫值,这三个里边最核心最重要的是谁。对,这个值是最重要的。对,你包括我们在这个手机的页面上,你看到的其实都是一些具体的呈现的数据值是吧,至于说你这个教程名,我不关心。哎,我只关心这个具体的数据啊,说你的账户有多少钱,那我看到有3000块钱。还是看到13000,那肯定那心态不一样。是吧,但是你这个变量名叫什么,那我不管。是吧?诶,所以这个值是最核心的啊,那么前面这个name和string呢,一定程度上我们都可以理解为修饰这个值的两个结构啊,一个呢,指定当前这个值的类型,一个呢,指定它的一个名称,那么这个时候的这个string和name啊,我们就可以看作是Tom这个数据的原数据。
27:21
以后呢,我们讲数据库的时候呢,也会有类似的这个概念啊,稍微的我们可以提一下啊,比如说我这块呢,使用一个客户端,这个客户端呢,我去连接我自己电脑上这个数据库了,诶随便呢,我打开一张表啊,那么打开这张表表的时候呢,比如我这块就看到汤唯了,这个呢,就是我们所说的核心的数据。那其中的这个name呢?就是来修饰这个汤唯的。哎,表明呢,就是你这个值它叫什么名。啊,这个呢,就叫name这个名,然后呢,它还有具体的一个类型啊,比如叫verar啊,用workar类型来来表示它就类似于我们Java里边的string一样了。哎,都是来修饰它的啊,那以后呢,我们会讲这就叫原数据啊。
28:02
那说这个的意义是什么呢?就是以后呢,我们这个概念呢,还是蛮重要的啊,那通过这个呢,我们回过来看圆柱解说注解是什么呢?就是我们前面讲的这些东西了,那圆柱解呢。啊,原数据是来修饰数据的,叫原数据注解,原注解呢,就是修饰你现有的这些注解的。朱杰。比如说在surprise warming里边,你会发现呢,上边你看是不是有俩。一个呢叫target,一个呢叫tation啊,这两个注解就是圆注解。因为他俩对它进行修饰了。哎,修饰现有的这个注解的这个注解,这就叫做圆注解,那圆柱解呢,我们在这里边儿呢,给大家呢,稍微的提四个。哎,这个往下走,哎这呢,就是对应的这四个。诶,这个稍微的有点啊这个啊CTRLC啊,咱们粘一下。啊,这个我就往下提了啊。
29:00
哎,这呢,我们讲。哎,四个圆柱结啊。好,就他那这四个里边呢,其实我们比较关心的呢,应该是前边的这两个啊。对,后边这两个的话呢,咱们做一个。了解就可以了。稍微的把这个符号呢去一下。在这块呢,我们首先呢,来看这个第一个哈。第一个这一块注解呢,叫做target目标的意思啊,诶咱们就不用看这个笔记了,咱就直接来看它啊,其实这块你直接的硬看呢,基本上你也能猜的差不多。这个target的话呢,它这个注解里边呢,那这就我们体现它这个数组的一个概念了,所以呢,我这块看一下这个target啊,按住CTRL键一点开,这不就也是个数组的类型吗。对应的这块,你看这不是有多个值的意思啊好,那么这个target里边呢,它有一个叫element这样的一个类型的数组,这个element呢,我点开一下呢,它是一个枚举类。
30:04
这个媒体类的话呢,它有好多的这个对象啊。这个对象的话呢,你像这个tab表示的呢,就是类呀,接口啊,枚举类呀,或者record记录啊,是吧,Field呢,就是我们所说的属性了,这就是方法,这就是行参。啊,然后这个呢,就构造器,这就是局部变量啊,这是注解类型啊等等等等等。啊,那么大家你看完这个之后呢,你回过来再看一下我们这个warming,你觉得这个注解是干嘛的。对,它其实就是表示呢,你这个注解哈,你能用来修饰哪些结构。哎,就是这个意思,好,你看我把它呢,CTRLC一下,咱们粘到咱自己的这个my not那块。我往这块一粘,那也一之呢,就是我这个注解可以用来修饰这些结构。啊类接口可以修饰属性方法,行参构造器局部变量。
31:00
是个啥?啊,这个module模块是吧,这是从我们GK9开始呢,有这个模块的概念了啊好,这个呢,我们可以修饰的。啊,写的比较清楚了,好,那么回过来。我这块呢,假设呢,删一删啊。咱们山的。嗯。行,我就。到这儿吧,然后呢,我把这个也删掉,你看哈,现在我没有删的情况下呢,咱们回到代码这块呢,它修饰这个类呢是没问题的。那这块其实已经能看得到有问题了啊,我们用它来修饰这个构造器了,然后咱们在这个位置呢,没有写构造器是吧。哎,你要逗号一下呢,这个叫constructor,我加上以后呢,再回过来,这不就没事了吗?哎,那如果说我把这个类型type呢删掉了。然后这块呢,你回过去,这不他这就报错了。诶,所以呢,它其实就是指明我们当前这个呃,注解能够用来修饰的结构。好,这是第一个啊,就说完了,然后第二的话呢,叫T。那一般呢,我们定义注解的时候呢,通常都会加这两个注解,Retention呢,它也是个圆注解,点开以后呢,叫retention policy这样的一个类型,点开它也是一个枚举类。
32:08
它的值呢,有三个。一个叫一个叫,一个叫这个注解呢,它在编译器编译的时候就被discard了。什么意思啊?就被处理掉了。第呢,就是我们这个啊,它修饰的这个注解如果是S这样的一个生命周期的话呢,对应的这个注解如果到这儿是S的,那么这个注解呢,编译以后生成的C加码文件当中是没有它的。啊是没有它的好,然后呢,下一个呢,叫做class,诶这个class其实就意味着是自解码文件了,啊所呢这个注解呢,它会被保留在我们的自解码文件当中。啊,使用编译器编译以后的自解码文件当中,但是呢,它不会呢,在我们这个虚拟机运行的这个时候呢,保留。那就是我们往内存中去加载的时候呢,就不考虑它了。
33:00
这儿呢,是一个默认的行为。啊,那么如果希望呢,说在这个内存当中啊,也就是说运行的这个时候呢,他也能够去保留,我们就得用runtime。哎,其实这块呢,就指明了我们所修饰的这个注解的一个生命周期了,是吧。诶来,我把它呢也CTRLC粘到咱们自己这块呢,诶。往这儿放一放,抄一抄是吧。好,那么这时候呢,我们写的是S啊,回忆一下,S意味着当前这个朱解。对,我们在这用了是吧,咱们生成的四解码文件当中是没有它的。这就不包含它了。好,那我现在改一下啊。哎,我把它那改成哎点class。啊,那这时候呢,意味着我们,诶对应的在这儿用的时候,自己码文件里边就有它。但是呢?对,运行的时候没有它就是不会把它加载到内存当中。啊,那咱们呢,后边呢,会讲一个技术呢,叫做反射了是吧,反射的话呢,就是我们在程序运行的过程当中啊,使用反射的API呢,我去想调这个注解。
34:09
在运行的时候呢,想调这个注解,如果你想调,必须得保证运行的时候有,所以以后我们讲反射的时候呢,必须要把这个注解呢改成。对,点不是class.run time。就是得让它运行的时候呢,也得在我们才能够通过反射呢拿到它。诶这个呢,以后我们再说,所以你知道呢,它是表明生命周期的啊就可以了啊好,这两个圆柱解呢,一般咱们在定义初解的时候呢,都会用。除了这俩之外呢,还剩俩一个呢,叫documented,哎,表示呢,对应的这个注解呢,应该被Java do工具呢能够去解析。啊,那比如说呢,咱们上面写了一个。咱们呢,叫deprecated。啊P我们在诶。刚才这块用了是吧,这个debre的话呢,你看我们点开哈,它上面呢,就加了一个documented。
35:04
那就意味着这个注解呢,呃,相对应的修饰的这个结构哈,回到这儿来,这个person呢,如果我们整个把这个类文件呢,咱不是以前第一章也讲过哈,使用这个Java do。咱们解析完以后呢,不会生成一个ATM这种格式的说明文档是吧,那么这个文档里边就你就能看到这样一个注解了。啊,因为他呢,用这个documented修饰了。啊,那举个例子啊,咱们上面这块不是使用了这样的一个被debated这样的一个结构了吗?所以呢,你回到我们这个API这块,你看一眼啊。啊,这个呢,比如说我们就看这个date了。好,这个咱们就看的是这个U下的data,好回过来咱们刚才用的是哪个构造器呢?就是这个。年月日嘛,这你看它有个depated啊,之所以这块呢,加上它,就是因为呢它呢用documented去修饰的,所以生成这个文档里边就能看到它。OK啊,诶那么再回来,呃,像咱们这个叫surpriseing,它呢就没有用document去修饰,所以呢它呢就不会呢,保留在Java dock里边了。
36:10
了解一下就行啊,后边这个呢,就更了解就行,Inherited啊这个继承的意思了,哎,我们要用它呢去修饰,比如说叫MY。如果修饰以后呢,诶我呢,在这个person里边呢,去使用了这个M了,那么它就具备继承性,Ya IG呢,就是它的这个子类啊,比如说这个student呢,自然而然的,它上面呢,就相当也有一个叫MY。啊,就相当于直接呢,就被此类呢所继承了。啊OK啊行,了解一下就行,这儿呢,就是咱们所说的这个叫朱杰。哎,整个呢,关于注解这个内容呢,咱们就讲完了。所以呢,在基础阶段这个注解这块呢,其实就是大家作为一个了解就行,至于说呢,我们在框架当中大量被使用,那到时候就说具体的注解怎么用了。啊,到时候呢,我们再展开说明就可以了,好,那么这个注解呢,咱们就讲完了,大家下来的话呢,我建议呢,其实也就不用再花时间去看了。
37:02
啊,精力呢,就不要放在这儿了,那通过讲这个注解呢,我们接下来要讲这个事儿,大家反而要关注一下,叫做单元测试。啊,因为单元测试里边我们使用了这种注解了啊,所以呢,顺带呢,我们就把它呢引入进来了啊什么意思呢?这个我们先来看一看,下边这个叫单元测试的问题啊。首先这块呢,我们提到一个叫测试了。咱们前面也讲过整个开发的这个流程,前面呢叫产品经理,还有UI的工程师,后边我们就开发组是吧,然后后边还有这个测试啊,还有相应的这个上线的这个运维的啊,运营的啊,诶这样的一些相关的岗位了,好那对于我们程序员来讲的话,我们前面呢有产品经理,后边呢有这个测试。啊,这个关系呢,都得处好。啊,诶,后边这块不就测试涉及到这个测试人员了吗。对于我们写的这个程序在做这个测试的啊好,那这个测试的话呢,大体上就分成两种测试,一种叫黑盒测试,一种叫白盒测试。黑客测试呢,就不需要写代码啊,输入这个值,然后呢出来个结果,看这结果呢是不是我们想要的。
38:02
哎,对于里边呢,到底怎么做的不关心啊,所以就是黑咕隆咚的是吧,不用管这个细节了,叫黑盒测试了。所以呢,很多时候呢,这个黑客测试啊,就是来测试功能的。啊,这个也有相关的这种培训啊,这个培训的周期呢,就很短了,可能这个俩月。俩月可能都差不多了,就啊,你就可以出来做这个测试了,相关的一些软件会用就行是吧。啊,你主要就测试这个功能,看是不是想要的结果,不是,那你就报出来就可以了。行,然后呢,还有一种测试呢,叫做白盒测试,那就说白了,就是这个里边这个功能啊,对我们来讲是透明的,是可以看到的啊,那么相应的这个实现的方式呢,效率高啊,效率低啊啊那这个呢就有讲究了,所以对于白鹤词来讲呢,相应来讲呢,它首先呢,开发的能力呢,也要有。啊,甚至说呢,这个开发能力呢,还要好一点啊,这种测试的话呢,对应的这个新贷呢就会高一些。啊,这就白盒嘛,需要关注这个代码的啊,那么我们这儿呢,要讲一个叫单元测试,这个单元测试呢,实际上呢,是跟我们程序用的,说白了就是我们其实面向的是能够看得到的这种代码的。
39:06
啊,类似于我们现在讲的那种白盒测试一样啊。好,那这呢,我们就引入了一个叫。啊,Unit呢,就是你可以理解成是Java的这种啊单元测试。啊,是由这两个人呢编写的,供Java人员啊这个使用的啊。嗯,那我们可以呢,在这个代码层面呢,使用它给的这种单元测试,测试一下我们这个代码相应的这个功能呢,是不是正确的。啊,以前的时候呢,咱们去测试功能的话,实际上呢,就是在这个酶方法里边去测的。你看你这个代码呢,写的靠不靠谱啊,对不对呀,我们在里边呢,去做个执行。但是在那里边儿这个执行的话呢,呃,大家呢,有没有感受到有些什么不方便的点呢。你比如我这块呢,写代码,它呢就一个入口。哎,我这块呢,想测了一下它没问题,哎,下边又想测它,测它的时候呢,上边这个没有用。那你还得把它注释掉。啊,然后呢,你测这个的时候呢,上边又没有用,还得把这俩都注释掉。
40:01
嗯,留着倒也行,但是又跑一遍呢,没必要。尤其呢,你上面这个,比如说测试呢,要往这个数据库里边呢,写入一条记录。然后下边这个呢,假设呢,又是测试另外一种啊,这个修改的记录,下边呢,想测试删除的时候呢,你上面这俩还真得注释掉,不注掉了,又给添加记录了。哎,你得该注释得注释。啊,所以每次呢,要这样去测的话呢,都写到妹里边呢,就看着很不方便啊,尤其呢,是这个测试的代码越来越多的时候。啊,就不好了,怎么办呢?这时候我们就可以引入单元测试来替换咱们原有的这个main方法。哎,就是这么个作用啊好,那具体怎么用呢?我在课件里边呢,写了详细的这个过程了,诶我这儿呢就不看课件了,咱们直接呢来进行一个操作啊,这个操作呢,需要使用相关的这个炸包了,这个炸包呢放在这儿了。哎,在这个课件里边呢,有一个软件与资料,有一个资料,资料这块你看有一个杠LIS是吧,那就它啊这里边儿呢,这两个呢都要用。
41:01
有同学说,诶,我们不是要用几unit吗?是咱们要用几unit,但是这个挤unit这个包呢,它要使用的话呢,需要依赖于上面这包。所以我们其实呢,是需要两个啊。那我现在这个。笔记这块我先把它写上啊,需要导入的包呢,有俩。还有这个。回到这儿啊,我先把它粘过来啊好,这呢叫炸包,怎么导入呢,这个步骤的话呢,大家就啊见。诶,课件就可以了。这呢我就来直接操作了啊,怎么做这样啊,首先的话呢,诶我们在这个file这块,File这块呢,我们有一个叫project structure是吧,点开点开以后的话呢,我们首先呢选这个啊。哎,Libraries这块呢,我们点一个加号啊,加号这块呢,我们是Java的一个JA包了啊,所以我们就选这个啊Java。接着的话呢,就找刚才我们看到的这个一个文件,因为他俩都需要,所以我就直接导这个文件夹了哈。
42:06
这个文件夹的话,你就找这个路径就可以了。我是放在桌面上的,桌面上你点它就行。啊,但是这块没呈现出来啊,没呈现出来,那我这其实也是一个快捷键了,哎,我专门放的这个快捷方式了啊,那我就实打实的找一下我物理磁盘存在哪了。哎,我是在这个下边啊,放到这儿了。然后在这里边儿。哎,这不就他吗?哎,这个呢,就不要再往下了哈,因为这两个我都需要,所以你就选中这个文件夹就行啊,点OK。好,接下来他会问说你当前这样一个呃,文件夹,你想用在哪个model下呢?我们想用在咱们这个里边是吧。就是他嘛,点OK啊。好点一下这个apply。好,这个呢就完事儿了,然后接着我们来看这个models啊,这个MOS这块呢,我们在这个位置。针对我们当年这个卡特零八,嗯。这不,我们就能看到他了吗?
43:00
诶看到它这块呢是compel啊,这块一定得是个compel,它默认呢,此时就是个compel,好我点一下这个OK。现在呢,我说呀,咱们就能在这里边去使用这个单元测试了,你看在这个啊,External libraries这不就呈现了它了吗。这里边儿有这俩是吧。就是刚才我们导进来的啊library好,然后的话啊,回过来在这个包下呢,咱们简单的做一个测试了,这我提前把这个类已经写出来了啊,这是小事儿,然后呢,在刚才看到的这个包里边儿哈,我们主要呢,是想用这个包下的某一个结构,这个结构在哪呢。嗯,在我们这里边儿有一个他。你看这个叫test。所以我点的这个事儿呢,你就看这么一眼就行,自己就不用点了啊,我想用它,哎,就这样来用了。直接呢,给大家呢,去演示一下啊。诶,Public word,我这个叫TEST1。这呢,就叫做单元测试,你看我写个hello。
44:00
哎,这个就收起来啊,就不用关注这个细节了。哎,那么此时的话呢,你会发现呢,在这个方法的左边呢,你看也有一个执行的符号哈,我点一下这个run呢。你看它就执行了。出来一个哈。哎,就没问题啊好,那这这有啥特别的呀,诶你看我可以写多个哈。我再来一个。哎,我叫TEST2啊。这个我们来一个HELLO1是吧。哎,包括呢,我们在当前这个类里边呢,你还可以定义,比如说定义一个变量,我叫number,这个number呢是十这个变量的话呢,也可以在这个方法里边呢去调用。哎,Number啊,这里我们就加上一个number。啊,你看我们在这做一个run。那就可以了啊,甚至我们去执行这个单元测试方法的时候呢,跟上边儿这个没有关系。上面这个呢,就不执行。我们只测他。
45:00
所以这块你可以呢,列很多的这种单元测试方法。包括呢,我们还可以呢,再去定义一个普通的方法,比如叫做method。哎,这呢,比如我们就写个叫哎method是吧,哎这一个方法,然后这个方法的话呢,诶我们就可以直接呢,在咱们当前这个单元测试里边去用,说白了就是这是非静态的,它也是非静态的,非静态里边呢,是可以调这个非静态的。我直接呢就写到这儿了,然后你这块呢,去run一下。哎,也可以。呃,那你要以前的话呢,怎么弄呢,以前的话呢,我们这是一个非静态的变量,这呢是非静态的方法,如果呢,你要想测试呢,你得写到main方法里边。然后因为呢,没方法是静态的,静态的要想调非静态的是不是得找对象了。哎,就是以前的话,咱们还得就得这么着了哈,然后呢,你这块通过T呢去调这个number,哎,你打印一下,通过这个T呢,去调这个method呢,你去调用一下,现在的话呢,因为这是非静态的,所以直接呢我就可以调了。啊,非常方便啊,而且呢,这块你可以呢,想测什么代码,你就诶定义一个单独的单元测试就可以了,这时候呢,我们使用的这个注解,诶刚才也看到了哈,就是在我们当前这个炸包里边,就是我们刚才导进来的这个接口。
46:13
OK啊行,哎,这个代码我说完了,然后呢,如果大家你想在其他的这种model下去使用。注意我现在是在这演示的哈,如果呢,你自己呢,是在这个OP3这个里边,我就简单举个例子啊,比如说我在这个com下边啊,往右键啊,咱们也写一个叫做诶the unit关于它的一个测试,哎,放到这是吧,然后这是呢,我们来一个fair。就会发现,诶怎么。出不来呢?呃,是不是因为下边方案没写呢,那我们写上啊,T1。哎,写一个叫hello,你看这时候写完之后呢,是不是就报错了。诶,这就不对啊,原因是什么呢?因为当前这个Mo呢,我们根本就没有让他去使用这个单元测试这个炸包,所以他就报错了。那怎么解决呢?
47:02
啊,你把你当前这个炸包呢,是不是让他用一下就行。哎,这是一种方式哈,那么还有一种方式呢,就是大家呢,前提都有网哈,在有网的情况下呢,你看我我out enter。我直接呢,可以去添加。哎,我通过这种添加的方式呢,其实我1.ok呢,他就开始去联网去下载了。这个呢,是大家有网的时候呢,就很方便,你说现在没有网,没有网的话呢,那咱们讲一下怎么做呢,这样做啊。还是回到刚才我们这个架构这块,在当前这个model下,是不是你有了。那放在这儿呢,是没有吗。那我得让他有是吧,怎么办呢?你就在这个啊,Dependence是吧,在这块呢,有个加号啊。因为咱们当前这个libraries这块已经有了。这块已经有了,就是当前我们这个工程线已经有了,你只需要让当前这个Mo呢用一下就行啊,所以呢,这块呢,你回到嗯。它的这个结构这块呢,选一个加号点一下这个叫library是吧。
48:00
哎,把它选一下。哎,添加一下,这不就过来了吗。大家注意啊,跟这个的区别呢,就是正式的一个compel是吧,你这块呢,是不是啊。所以把它改成compel啊。改正以后呢,我点一下OK。啊啊,没有啊。又点回来了。在这儿是吧。是不是完事了点OK?这不好了吗?哎,这就行了,这就能用了啊,诶所以大家呢,你要想用的话呢,你记着你后边你再建其他的model啊,都一样啊,你想让哪个model用的,你得回过来,诶随便选一个是吧,然后这块呢,给它加号,然后library把它选中,然后哎添加一下,把它呢这块务必改成compel啊,然后呢,应用点上OK,这时候呢才能用。啊,这就可以了啊好,这呢就叫做单元测试方法,它的作用呢,就是以后我们写代码呢,就可以不用may方法了啊。好,这块呢,我们得稍微的再多说几句,因为这里边儿有一些细节啊,大家写的时候呢,得去注意哈。
49:06
啊,具体呢,写这个测试呢,咱们就建这个代码了。啊,这块没啥啊,关键呢,就是说我们要想这个单一测试方法呢,正常的能够执行,必须要满足一些条件。诶,在这儿写的。诶,我把这两行CTRLC一下。哎,我粘过来。有同学可能会说,说这块也没看到有什么条件啊,是我这块写的时候呢,已经把它避开了。啊,什么要求呢,针对于我们这个类的话呢,把它称为呢,叫单元测试类。就是相当于就是包含单元测试方法的那个啊,这呢就叫做单元测试方法。其实很好理解啊,那么对于这个类,对这个方法有要求。来看一下要求。这块说的啊,说所在的类,也就是我们这个单词类啊,必须是public的。
50:00
非抽象的。包含唯一的无参的过道器。哇,要求好多呀,是吧。诶,首先呢,叫public,就是我们这个单元测试啊,这是个public。一般呢,咱们去右键定一个类的时候呢,其实默认的是不是都是public。所以这个呢,你就不用太关心了是吧,第二呢,叫非抽象的。那就意味着你这个类呢,得能造对象啊。哎,你想我们现在呢,诶大家你看哈,我调的是这个方法。这块我一直接点就执行了。说你为啥用没方法说得造对象到这不用了呢,是因为呢,我们这个单元测试啊,其实呢,你在调查的时候呢,自动的帮你去造对象。啊,所以呢,你只需要呢,写你核心的逻辑呢就可以了,他既然能帮你造对象,前提是你得能造对象吧。你不能抽象啊。就这个事好,还说一个,说你得有一个唯一的无参构造器,有还不行,还得是唯一的,言外之意呢,就是我要再多写一个构造器。比如说啊。Public。啊,Test,咱先给他一个空参构造器。
51:03
我再呢复制一份,随便呢,我就整一个了,这不就俩了吗。那你说我多一个你还能错吗一下?还真不行。说呢,你这个呢,只能有一个构造器是吧。要求还真高啊,这个呢不能写,而这个的话呢,你不写它也有,所以干脆呢构造器一个也不要写。就可以了,自然而然这个就满足。好,接着来看下边这个啊,这个呢叫单元测试方法,单元测试方法呢,我们使用这个try test呢去修饰哈,要求这个方法,你看事儿还挺多的哈。哎,就针对于你看我写的T1T2都满足,首先public。非抽象的。那肯定不能是抽象了,那你单元测试,你测试啥呢?你不写方法体,那要它干啥?肯定有方法体是吧,哎,那就不是抽样方法非静态的。不能加在啊。是Y的。是午餐的。
52:01
很崩溃是吧?你像后边这个呢。看看能不能理解啊。哎,非静态的意思呢,就是这个方法呢,我们就直接拿对象去调的啊,你不要生命成静态了,是Y呢。这个其实跟may方法一样,May方法为啥是word呢?因为may呢,就是入口了,你也没有谁去返回了。这个也一样,我们就想测试这个代码的执行的,所以呢,你不用返回给谁。有同学说,诶,那我想测个方法,这个方法就有返回值,那怎么办呀。有就有呗,我这有个印的。哎,我这叫比如说受。嗯,In。是吧,然后这里边儿,哎,我们比如说呢,你去return一个。我这写这个int了啊,Int就int我就演示一下啊,我就返回个十,包括呢这块呢,说无参的是吧,如我要是有方法有参数的话,那我怎么测呀,有参数这块你想测哪个方法,方法的特点那多了去了,它可能是各式各样的。比如说这块呢,有个具体的音符这块我这个十呢。
53:02
嗯。或者或者或者这样吧,我这里边儿呢,把这个音符呢,打印一下。然后我返回一个十,呃,我想测这个方法,这个方法的话呢,可能有返回类型,可能有型参还可能有多个啊,那这个方法你测的时候,你放到这种单元测试方法里边。啊,这块比如我们去调一下,这个叫收银粉是吧,真的,比如我们写个叫China。哎,这个方法调完以后呢,它有个返回值啊,你接收一下这个值。诶把这个纸呢,打印一下,这不影响。哎,就是你要测的方法呢,是什么样的都有可能,诶你在这里边测的时候呢,你就把这个值呢,给它传上,有参数你就写上值,有反应值呢,你就接收一下这个我们去做运行,那它就把这个方法呢就给掉了。哎,就可以了。哎,对于我们这个单元测试这个方法来讲的话呢,它不要有参数。换句话说,它要有参数的话呢。咱们也没法去给他传这个食材。你只是让他调一下执行的是吧,就像我们写没方法,如果大家你不考虑咱们前面讲过的给他传参数的话呢,那我们其实原来写的时候呢,要他这个参数好像也没什么用是吧。
54:08
哎,这呢,体现在我们这儿呢,也是一样的道理啊。就是你没必要呢,给大家去提供这个参数了。好,这呢就是咱们说的单一测试方法的一个要求,这个要求呢,大家不用死记硬背。那因为我是讲课的,所以我记住了啊呃,对于正常程序来讲呢,你让他去说他也说不明白,但是他就只需要知道呢,我就去右键呢造一个类,这个类里边呢,我去写单元测试方法的时候呢,我就直接呢public word写个名,这块我就不写参数里边呢就测就完了,关于这个类的话呢,你也不要去提供构造器。他就用这个无参的扩大器就可以了,所以一切的要求呢,看似很多,其实也可以理解成是无形的。啊就可以了啊好多说一句啊,在默认的情况下呢,咱们这个单元测试方法里边使用这个scanner的话呢,会失效哈,是这个意思。我这块我再写一个单元测试方法。
55:00
哎,我叫太三。哎,这么着啊,咱们以前呢,在main方法里边呢,使用这个scanner。哎,Scanner这个呢,咱们加一个。System。有点硬是吧。这么着了啊,然后这块你可以写一句话啊,说请输入一个数值。哎,这么着啊,然后呢,你拿着这个干点,我们去调next,就能得到一个具体的数。哎,这呢,我们打印一下这个数啊,诶这个呢很好说啊,诶那现在的话呢,我们在单元测试里边呢,去写的时候呢,诶如果大家呢,没有做个配置这块,你去写12的话呢,这个控制台呢,你写什么他都。显示不出来。啊,他等着你写,但是你写的话呢,它呈现不出来,这是默认的一个情况,怎么就能呈现出来了呢?诶大家在这个help这块哈。他这有一个他。呃,我这里我课件里边都写了啊,诶点一下它,然后呢,把这一句话呢给它加上。啊,课件里边都有啊,把它加上以后的话呢,然后呢,你在这个位置呢,它有一个呢叫。
56:05
嗯,叫他,哎,Restart一下我们当前的idea就行。当然你不点这个的话,你直接自己关了再开一下也行啊,重启一下,重启完以后的话呢,再去run。输一个数值,我就能够写进去了。啊,一回车啊,也没问题哈。啊,这就这样一个细节。可以了是吧。啊,这个呢,我就说清楚了啊,然后呢,我再说一个小的事儿,以后的话呢,咱们写代码呢,会经常写单元测试方法。既然经常写,哎这块呢,我就再补充一个哈,说呢大家。哎,可以。加。哎,单元。哎,测试方法。哎,设置为。一个模板。模板咱们都已经用过了,比如在这里边我们之间的for。这不就是个模板吗?说我们单一测试方法呢,既然你全部都是public的,是word的名不一样,呃,小括号呢,都是空参的,基本上这个套路都一样,前面还都有个它,我就也想设置成一个模板来看一下啊。
57:10
点一下这个设置。点一下这。点一下这个,诶。把这个。啊,就在这儿了啊,显然这有一个叫live template这个是吧。啊点它啊点过来以后呢,这呢,就是咱们是模板的一个位置了,就在这儿了啊然后右边这块呢,其实就有好多现成的模板,像我们刚才这个fo I,你看是不是就在这了。啊,大家之所以能用呢,其实就因为这有一个模板了,那那咱们也定一个呗。这呢是现成的啊,咱们这块点加号,加号呢定一个模板,建议呢,你先自己定一个组,像这我们看到的这都是组啊,我定一个组,组的话呢,就起名为我们自定义的吧。然后就起名叫custom。就是用户是吧。吧。
58:00
哎,用户自定义啊,OK一下这不就有了吗?里边啥也没有是吧。好,然后在这个里边呢,我去定一个模板。啊,定个模板好,这块写什么呢?这块就是你希望呢,通过什么给他调出来。我就希望写T的时候就掉出来。我就这样写哈,说这个呢,叫就是一个说明。这个我们就是自动生成单元测试方法,就相当于给我们一个提示啊。就他好这呢,就是你希望通过它呢,调出来这个模板长什么样子,我就希望它长这个样子啊。Public void test光标呢,在这块闪,哎,我我先这么着吧。整体上是长这样对吧,我希望呢,洗完以后呢,这个光标呢,开始在这儿闪,我就整两个Dollar符,这呢,我们来一个叫万一。变量的意思啊。然后呢,这个光标带着闪,我要洗完以后呢,我一回车,希望呢光标呢,接着就跑到这儿来。哎,这个你这个写个YY2也行,其实这块也是我们最后了啊,写个N的吧。
59:02
就这样,这个完了以后呢,注意千万要记着选这个哈,DeFine。哎,我们希望他在Java相关的逻辑当中去使用。选中,然后我点一下。OK。好我就盯完了啊,定完以后大家再看啊,我就直接呢,以后咱们写单元测试的时候呢,就不用上来就圈test,然后下边public去写了。直接呢,就这样。Has。自动生成单元测试方法是咱们自己写的啊,一回车次一回车放这儿,直接一个输出语句哈,搞定。啊,再来一个啊,TEST5。这样写。是不是就很方便了?建议大家呢,也自己呢可以弄一下啊,这个我相应的这个操作呢,都在这个课件里边都写着呢。哎,这呢,怎么去设置这个模板啊,这都有。诶,你自己弄一下就行啊好,那么我们关于这个注解呢,诶对应的这个单元测试这块就说完了,注意注解本身大家就不用细看了哈,这个单元测试的话呢,稍微熟悉熟悉,明天呢,我们过来呢,讲这个包装类的时候呢,咱们就不在main方法里边去测了,我就在单元测试方法里边来测了。
60:11
哎,大家呢,用几天呢,其实就熟了啊。
我来说两句