00:00
好,那么接着的话呢,咱们再往下看啊,这个呢叫做Switch。啊,应该说呢,在GDP8以后的话呢,这个版本的新特性语法层面这个表达式呢,提的是比较多的,呃,因为你打开这哥们你看也提了好几次,G12当中呢,这叫预览特性,13当中呢,二次预览14当中呢,反正了。这呢是在十字当中给转正的,然后在这个17这版本当中啊,又提到了一个叫Switch的一个模式匹配。诶,刚才呢,咱们提的叫instance of的模式匹配,这呢又提到Switch的模式匹配。模式匹配啊,所以你看这个题的这个次数的话呢,还是比较多的,首先呢,咱们先来看一看关于这叫词位表达式是一个什么意思。啊,我们来看一下这个对应的课件。找到我们这个Switch表达式。啊,这个Switch呢,咱们都知道了,前面呢,咱们讲这个分支结构的时候,除了另外一个呢,叫做Switch,这呢针对的也是我们说的这个分支结构啊,Switch case这个结构进行的一个修改。说呢以前呢,咱们使用这个随时结构的时候呢,有些弊端啊成弊端呀,哎大家看一看是不是这么回事儿啊,第一个说匹配呢,是自上而下啊实现的,如果呢,你忘记写break了,后面的case语句,不论匹配与否都会执行。
01:15
哎,这个呢,不就是咱们所说的叫case穿透吧。哎,说的就是这个事儿啊,没毛病啊,下一个。说呢,所有的case语句共用一个块的范围,在不同的case语句定义的变量名啊,是不能重复的。诶这个呢,确实如此啊,他说的呢是这个意思啊,比如说呃,这块呢,我先写了一个这个代码,呃,大家也都能看得懂,这儿呢是一个枚举类是吧,星期一星期二啊,一直到我们星期日,然后呢,诶我呢在这个测试当中,首先呢,取出来一个枚举类的一个对象了,放到这儿,然后根据你到底是星期一星期二,星期三星期四啊,星期五还是星期六星期日啊这块我们输出不同的值。诶,以前呢,大家也经历过这样的场景啊,比如说我在这个money当中,我定义了一个变量,我叫number,这个值呢是十。
02:03
没问题是吧,好,那么我们在下边这个位置啊,不管是星期二也好,星期三星期四也好啊,我随便呢,再找个位置,我要定一个同名的一个变量。你会发现呢,它是不允许的。呃,因为他认为呢,我们在同一个这个大括号内呢,是不可以定义同名的变量的,所以这块你叫number了,这个呢就不能再叫number了。这就是我们所说的这样的这个问题啊,你可以呢,叫一个叫NUMBER1是吧,啊,必须得错开才行。啊,这个大家小心一点这个事儿啊好这个呢,就是我们说的这样的一个场景啊,嗯,稍微再提多提一句哈,你看咱们以前如果说这样的情况怎么怎么办呢。啊,以前的时候呢,我都是这样来解决的,大家回忆一下,咱们当初讲这个项目的时候,啊,项目三的时候呢,就是这样来处理的,我可以呢,在这个位置呢,先写上这个number变量,然后这个位置的话呢,我们就不给他呢去。哎,声明了,在相对呢,就使用这个变量在这里边做赋值就行是吧,诶你可以这先指定个默认值。嗯,指定一个默认值啊,这个我们把它俩得写到这块是吧。
03:04
啊就可以了啊行,这个呢,就是咱们以前的这种处理方案啊,总之的话呢,它在这个不同的K当中,咱们是不可以定义这个同名的这个变量的啊,这个都是清晰的啊。好了,这个事就过了,回过来。下一个说不能在一个case里面呢,呃,写多个执行结果一致的条件。啊,你比如说呃,当我这个case啊,针对的是咱们那个叫月了哈,它是三月的四月的和五月的时候呢,说我能不能写一起啊,不好意思不行,你要这样写的话呢,咱们是不是成了一个叫未运算符了呀。啊,相当于我们这个345做了一个运算啊,得到一个结果,这个结果呢,呃,是几啊。这边写的说这个是七是吧,啊,那就成了你这个case成七了,所以呢是不可以写到一起的。啊说诶我们以前写不是可以这样写吗?注意这块写的话呢,其实你相当于这块呢,还是有执行逻辑的,只不过呢,你这个逻辑里边呢,没有break了,所以呢,他就接着往下执行了。
04:00
啊,这呢,仍然可以看到是多个不同的这个执行的case结构嘛,诶你不能理解成呢,说是合并了是吧?诶。下一个呢,说整个Switch呢,不能作为表达式有返回值,但这显然的啊,就是我们相当于整个这个Switch结束以后呢,说它能不能看成是一个结果返回呢,那显然不可以啊。这呢就是我们之前这个思维者的特点,然后呢,我们在JDK12当中,诶这块呢,我们就引入了一个操作啊,这个操作是一个叫啊,还是这个符号啊,叫箭头操作符,这个符号的话呢,我们说呢,可以替代以前的这个break了,言外之意呢,就是我们这个操作符啊,执行完以后的话呢,就不用你刻意的再去写这个break。OK啊,什么意思,回过来。好,大家呢,直接来看我这个代码了啊,这儿呢,是咱们以前的这种写法。这个应该都能理解是吧,好,那我们在这个这D12当中啊,咱们就可以不用去写这个break了,呃,咱们使用这个箭头操作符就行啊,比如说我从这到这啊CTRLC啊,我把它呢,原封不动的就粘过来。
05:02
好粘过来以后注意看我们这个位置啊,我把这个冒号呢就给去掉了,我就换成了一个叫哎箭头操作符break呢,就不用去写了。诶,那既然不用写了,我这就只有一行至英语句,不妨呢,我就换成一行了啊,就成这样了啊好,那么针对于我们这三种情况呢,它的这个输出语句呢,是一样的,诶这个时候呢,我们就可以呢在这儿呢去写这个叫逗号。哎,可以这样了。哎,逗号一下,然后这个位置呢,我们换成这个,呃,叫箭头操作符。啊,Break呢,就不用去写了。哎,你看。是不是挺好,OK啊,然后这个位置的话呢,也同样道理,我们改写成呢,叫箭头的操作符。哎,就这么着。看比较简洁啊,在这个位置换成个逗号。啊,替换一下我们这个冒号。诶,就这样一个场景啊,然后这个位置的话呢,这个你可以使用建造操作符那就可以了,也就是说啊呃,如果我们使用这个建造操作符替换这个冒号了,我们就可以呢,不去写这个break了。
06:05
啊,不去写这个break了。哎,稍微的感受一下啊,下边这个啊,所以呢,我们在GT12当中还可以呢,使用变量,咱们来接收一下这个思维表达式的一个结果。啊,这个有点意思哈,嗯,怎么着呢,你比如说咱们还把上面这个操作呢,我粘过来是吧,我就粘过来了,粘过来以后的话呢,我这块呢,我想接收一个result吧。啊,这就是所谓的结果是吧,你这结果诶首先呢,整体来看,呃,这块呢,算是一个诶一顿操作的是吧?诶给一个结果,这呢是得加个分号了啊其次的话呢,说你这也不行啊,你也没给我结果呀,那这个位置咱们就改写成是一个叫。一是吧,然后这个位置我们换成这个角二。三。那这个时候是不是就行了,那这个你可以把它提到这儿。没问题是吧,好在这边呢,我们可以把这个所谓的result呢,咱们做个打印,哎,因为呢,这是周五是不是有返回的结果,这个就是三呀,哎走起一下。
07:03
你看这时候呢,我们这个Switch结构呢,就更加的灵活,它呢跟咱们的E这个区别呢,也更明更加的明显一些了,呃,相当于此时的话呢,我们就可以作为一个,呃,相当于是一个,就像一个比较复杂的一个运算符出现了,是吧,得到一个相应的一个结果。呃,咱们可以呢去想这个叫条件运算符或叫三运算符,只不过这块呢,我们这个分的情况呢,就更多一些啊,那通过这呢,大家似乎也感觉到了,呃,好像呢,我们这块呢,诶就把这个结果呢,是不是有点返回的意思了。对吧,哎,就成这样的场景了,所以呢,你会发现呢,在JDK13的时候,这呢,我们就引入了一个新的关键字。啊,这呢,又出现一个新的东西啊,这个新的关键词呢,叫做yield。哎,说呢,用于返回指定的数据,结束咱们Switch这个结构。啊,那这呢就意味着什么呀。啊,这块稍微的大家,嗯,得记一下了啊,就我们在这个Switch当中啊,以前的时候咱们是使用break的表示的就是结束当前这样的一个case结构啊,不让它继续穿透了,哎,那就是说你要是没有返回值的情况呢,咱们就用break,如果呢,你要是有返值了,咱们可以使用的叫有的。
08:13
注意这个业务的话呢,它的返回主要呢,是结束咱们当前Switch结构,它跟return不一样,Return是结束方法的是吧。啊,这个大家小心一点啊好,那么还针对咱们当前的这个题,CTRLC以下啊,我把它粘过来。诶,我就粘过来了啊,我粘过来以后呢,大家你注意看啊,我现在呢,就想用一下这个叫业务的这个关键字了,是吧。嗯,这个呢,咱们这么着啊,比如这块呢,我就写个业务的。这块写个业务的话呢,你注意他这块呢,会报错哈,哎,需要呢,咱们把这个大括号呢,该补上的还得补上。啊,就得成这么着了啊,言外之意呢,就是这样一个结构。啊,这个结构啊,好,下边这块的话呢,同样的道理。咱们的一个大括号。哎,这呢,我写上一个叫哎业务的。哎,这么着一下。
09:00
啊,这呢也是一样的啊打括号。业务的啊这样。哎,业务的是吧,哎这样,哎,如果这个位置的话,你说我不想抛异常了,这个你也可以呢,在这块写上一个业务的。比如来一个五是吧,哎这块的话,其实如果大家还有其他的一些语句的话呢,也是可以的啊这个比如说叫哎这个。啊,不匹配。对,或者说叫这个值啊,未找到是吧。诶这样的情况就是你可以呢,有其他一些语句啊,然后此时的话呢,咱们这个所谓的I呢,就是表示的是返回值的意思了,相当于在我们这个结构当中啊,你可以呢,有其他的一个执行语句是吧?诶执行完以后呢,最后诶我们返回的是一个值,这个值呢就给到我们这个result了,最后呢,你可以把这个result呢做一个诶打印。那就这样的场景来走起。嗯,看没有问题啊行,诶这时候呢,我们就体会了一下这个返回的一个场景了,哎,然后我把这个呢,稍微的再诶多说两句啊,诶这个我再复制一份,写一个五吧。
10:06
咱们现在呢,用的是不是都是这个叫箭头操作符了,那这个不是咱们拉姆的表达式这个操作符了啊,在我们这儿呢,是另外的一个结构,只不过长得呢,跟咱们拉姆的操作符呢是一样的。呃,然后呢,这个符号呢,其实大家呢,也可以呢,你比如说我们现在能不能用这个冒号去使用啊,其实也可以。啊,其实也可以啊,只不过这种你要使用的话呢,就没有必要呢,我们再去提供这个大括号了啊,就是你要用这个。哎,冒号呢,去替换一下咱们这个建造操作符的话呢,那就直接这样就行。就是我换一种写法了啊,注意这时候咱们没有用这个降噪操作符啊,就是用这个冒号,那你可以把我们这个大括号呢给它去掉。啊,这就是不同的这个写法。诶,熟悉一下就行啊。嗯,这个位置,这个位置咱们就简单一点吧,就只有一个结果是吧。
11:00
哎,是不是就这样了,诶ctrl alt加个L啊,把这个格式呢,稍微调一下啊,它都给我写到这个下一行了啊这也行。就是相当于呢,你要是用这个箭头操作符的话呢,这个注意得有个大括号,你要用这个冒号的话呢,这个就不用我们这个大括号了。啊,因为冒号的话,咱们前面讲three case的时候呢,本身有冒号也不能写大括号是吧?哎,这个注意一下。这个呢,就是我们说的叫此Switch表达式啊,它的这样的一个情况。这块呢,稍微的总结一下,就是主要提到了我们有这样一个箭头操作符了。OK啊,有这个操作符呢,我们就不用写break了,而且你要想具体的有返回值的话呢,我们还可以呢,引入这个叫I的这个关键字是吧,来去使用啊,这个业务的呢,没说,只能跟建造操作服去使用,它呢,也可以搭配咱们原来的这个冒号使用,也是OK的。好这个呢,我们就过了,然后呢,诶大家呢,再看我们另外的一个这个所谓的新特性,GDK时期里边的叫Switch的模式匹配啊。呃,这儿呢,我写了一个例子。
12:01
啊,我举个例子,大家呢,来感受一下就行了。啊,怎么着呢,那是这么着的啊。呃,这个呢是JDK时期之前,哎,我就写了个方法,这个参数的话呢,叫object。是吧,哎,一个O啊说呢,呃,如果你这个O呢,叫是叫的一个I啊,这呢,这不就用了我们的这个模式匹配吗。那说呢,你如果是个特类型,顺带呢,我们就诶相当于把这个类型对应的这个强转以后的变量名也给想好了是吧,里边呢,就针对我们这个字符串呢,给它重新赋了个值,你要是一个long类型的,是个double类型的,是个string类型的,我们都类似的这样的去操作。没问题,行,这个呢,还算是比较清晰哈,然后呢,我们现在呢,怎么办啊,诶我把这个类似的这个结构啊,咱们改写成了叫此位式的一个模式匹配。啊,诶,这是一个什么意思呢?来你看我这块来写啊,这块呢,首先我针对这个Switch。哎,我把这个O呢,我就可以呢,给它扔进去了。
13:01
啊,我可以把它扔进去啊,诶扔进去完以后的话呢,咱们接下来啊,考虑的事儿呢,我就去做这个case的一个匹配了,匹配的话呢,说你可能是一个inter类型的啊,Inter类型呢,顺带着我把这个变量呢,诶都给你想好了,这个变量就I,也就是呢,如果你的O是一类型啊,那这块呢,我把这个变量名呢,也给你想好啊,就是这个I。呃,接着的话呢,我们还可以呢,体现一下它呢,作为一个结果可以去返回,呃,咱们上边这个题目不也是返回一个叫format是吧?诶这块我也写成一个叫。Form。哎,这样一个磁性的一个变量,好如如果呢,你要是这样子的话呢,咱们就让他俩做一个业务的。哎,我们刚讲的这个业务的是吧,呃,业务的一个什么呀,我们说叫一个int,然后一个冒号啊,空格这块,我们加上这个I。那就这样一个结构哈,然后再去case说呢,如果你是一个long类型的,我们小号的名叫L。啊,业务的这块,我们比如就写一个叫long空格加上一个L。
14:02
就这么着是吧,然后呢,Case,如果你要是一个嗯,Double。那这个我们就写成个小D了啊,这个呢,就是个业务的。嗯,Double的。哎,加上一个小D啊,就这样啊,Case如果呢,是一个string类型的。啊,业务的。这个呢是一个A4针的空格。加上这个S啊,就这么着是吧,然后最后呢,你可以再来一个叫default default怎么着呢,我们可以呢,这个不是上面这个类型,咱们直接呢叫O点。诶把这个结果呢,我们做一个业务的一个返回啊,返回给谁的呢?不就返回一个我们这个死真形的一个这样的变量了嘛,然后咱们把这个变量呢,给他返回一下。啊,就这样的一个结构是吧,诶大家稍微体会一下啊,然后呢,因为呢,整个这块呢,是充当了我们这样的一个变量的值,最后呢,你把这个分号呢,直接给它加上啊好这个呢就行了,学完以后的话,有同学说,诶说你这也不靠谱啊,是不是报错呢?哎,确实是是吧,哎,咱们先呢把这个呃方法呢,我在这块呢先调一下啊这不就他吗。
15:09
好调完以后的话呢,我们此时呢,呃,去运行一下啊,这块你看提示呢,就报错了,说呢,你当前呢,使用的我们这个新特性。啊是我们呃JDK啊,这块提到叫17当中的一个预览的特性,这个还是个预览的啊,说你这块用的话呢,你得加上这样的一个修饰,呃,其实这块呢,这样来处理就行,大家呢,也可能会遇到同样的问题啊,回到我们这个啊,Product structure这个位置上。针对咱们当年使用的这样model啊,不就在这儿嘛,是吧,然后大家呢,在这个位置呢,呃,选择的是我们JDK这个没啥可说的哈,肯定还是JDK17了,嗯,因为实际的新特性只能在这这个版本里去里去测哈,然后前面这块选这个level的时候呢,不要选这个。啊,选谁呢,选这个。啊,这俩有区别吗?有区别就是这个呢,会增加一个我们这个。是吧,你看这块呢,主要的特点就提到了Switch它的一个模式匹配吧,所以你把这个选上之后呢,我们来一个OK。
16:05
诶,你看这时候他就不报这个问题了。行,那就说明呢,它支持我们这样的方式去写这个呢,咱们就称为呢,是叫此Switch的一个模式匹配,你看case的时候呢,我原来我们都写变量值,现在是不是是这个类型的话,哎,我们把这个变量名就写这了,有点像咱们的instance o是吧。这块我们做一个执行。你看他俩都没有什么问题,执行的结果呢,也都是一样的。啊,这个大家稍微的感受一下啊,这个我就这样一说啊,你一听就完了啊,因为目前呢,它在实际当中还是一个预览特性,而且呢,使用的场景呢,也相对来说比较有限。啊,先了解一下就可以了。啊,这呢,咱们就过了啊。好,然后下边这个呢,称为他叫稳稳块的一个使用。啊,这个在JDK13当中是预览的,14当中二次预览事务当中转正了啊,也就意味着我们以后呢,可以去使用它针对的这个场景呢,其实也非常的明确啊,这个新特新特性呢,比较简单啊,大家呢直接来看一看啊。
17:03
就是咱们呢,在后续开发当中,经常呢,会将一些字串的一些信息啊,粘贴到了咱们这个代码层面,但是粘过来的时候呢,这个格式呢,往往可读性呢就比较差了啊,比如说啊,明明呢是我们这个ATM的一个非常简单的一个代码啊,这呢是整个ATM的这个跟标签啊叫ATM标签里边呢,有这个有body我就没写啊,Body里边呢,我们写了一个标签上硅谷是吧,然后这样的一个简单的一个。啊,标签的内容如果呢,大家你要是按照我们以前的那个思路啊,比如我这块我再稍微的再重写一下啊,诶我就要IN1了啊,你这块呢,CTRLV1粘,它会自动的给我们加上这个相应的这个叫杠N这样的换行啊这样的操作,你说这个idea智能吧,实际上呢,应该算是挺智能的,因为它会自动的给我们加。是吧,诶因为你本身想表达,这不就有个换行的操作吗。但是呢,这块你看一洗的话呢,明显这个可读性呢,是不是就差很多了。
18:00
哎,这不就跟咱们上边这个写法,这不基本上是一样的是吧?哎,那没办法啊,你只能是如此的去处理打印去的话呢,打印出来的结果倒是没有相关的这个显示。对吧,行,那我们想呢,把它这个可读性呢,更好的去呈现出来,怎么办呢?诶在我们JDK这个相关的版本当中,就提到了一个新的了,这块我们可以用三个双引号。啊,开始三个双引号结束啊,中间在这个里边放的就是一个文本内容啊文本块是吧,你就想怎么放就怎么放就可以了,你这块呢有放行,那自动的,我们展示出来的这个结果里边自动的也就会有换行。啊,那用这个结构呢,去替代我们上面的结构,明显的这个可读性呢,就更好一些啊。好,上面这容我写的是A的代码,那我这呢,写的是一个杰森的一个啊杰森呢,其实相当于是个对象了啊,以后的话呢,我们提到了这个客户端跟我们这个后台做数据交换的时候呢,咱们就可以使用这个杰森这种格式的字符串来表示了,那我这儿呢,就写了一个非常简洁的一个杰森,那如果呢,你要是使用咱们那个文本块的一个方式来查看,其实非常的直接啊,Name gender address啊,写的很清楚,但是呢,你要是用以前的那种写法用。
19:11
是不是看着就有点儿崩溃是吧?啊没办法,以前呢也想写,只能是这么着啊去写啊,那如果说我们有了这个文本块以后呢,你就直接呢这样去处理就可以了。看明显的这个口读性呢就更好一些,诶后续的话呢,包括咱们学习这个SQ也是一样啊,SQ里边呢,你粘了一个SQ语句啊过来过来之后的话呢,你看这块有杠N。啊,只能是这样了,哎,如果你要有文本块的话呢,我们就可以这样去处理了。啊非常方便,这两个执行效果呢,也是一样的啊好,然后呢,在这这十字当中啊,又增加了一个新特性啊这个新特性呢,其实也挺好的啊,它是这样的,你比如说呢,诶我这块哎,我把这个杠呢给它去掉了,去掉以后的话呢,诶包括我们把这个杠去掉了,这个呢,就是咱们在打印的时候呢,你看到的就是这个。目前它这样的一个效果。
20:01
没问题是吧,好,然后的话呢,如果说我这个位置大家你看啊,我加上了一个斜杠,在这个位置呢,比如我也加个斜杠,加上以后大家再看此的话呢,它就我们去掉这个换行的效果了。所以呢,这个email完了以后呢,这个呢,就跟它是一行的。是吧,然后这个位置呢,ID大于四,大于四以后呢,你看这块呢,它也是直接呢往后写就order了,这个customers呢,这块因为你没写呢,所以这块呢,它就还是这样,比如这块我也加上一个杠,哎,我们做一个执行。哎,就成这样了啊,但这块你发现呢,我们这个表明啊,真的是叫表明,后边呢跟这个where这个诶关键字呢,你看合在一起了,这中间是不是插个空格啊,这些空格呢,可以用这个杠S来表示啊,比如我这块写个叫杠S啊,你再写个杠。这个时候呢,你再看我们这个执行的效果。嗯,这不就挺好吗?这块相当于是一个空格。杠,然后这块呢,表示的就是我们不换行的意思。就这样写。呃,也就是说呢,呃,现在呢,你写的时候呢,呃,你可以换行,这样就是你这样换行的来写,但是呢,你这块通过加这个盖的话呢,实际上让它呈现出来是一行的这样一个效果。
21:07
诶可读性呢会更高一些,这个呢,就是我们所谓的叫文本块的一个使用。啊,文块的一个使用行,挺好玩的,这样的一个新特性啊。好,这个过了以后呢,咱们再来说一下下边这个。啊,这个呢叫零七叫做record的一个使用,呃,这个也是咱们提到了说,诶我们说引用数据类型都有哪几种啊。啊,数据类型,咱们在JDK14当中啊,就增加了一个新的类型叫做record。传统来讲,我们说有数组,有类,有接口对吧?哎,这是我们说最啊传统的这样的三种结构,后来的话呢,我们又引入了这些5.0当中,这个嗯叫枚举类啊in或者叫an。是吧,还有这个record,哎,不是record这个noation啊,我们叫注解这个呢,都是JD5.0的引入的,现在呢,我们就引入了一个十字当中的叫做record,都属于引用数据类型。
22:00
啊没问题,就好比是呢,我们右键的时候,大家去new,你这块看到的这都属于这个引用数据类型对吧。啊,这不就有这个record吗?好,那么这个record是干什么的啊,哎,我们首先呢,看一看这里边儿的这个说明。呃,在这儿写的啊,说呢,早在2019年的这个二月份啊,说Java的架构师他呃就发文抱怨啊,说扎va呢,太啰嗦了,呃大家回忆一下,咱们去写这个比如像扎in这样的结构的时候,里边呢,我们写这个构造器概算方法啊,Equals high的to string是吧?诶是不是呢,每次都这样去写,感觉还挺麻烦的。啊,那怎么办呢?呃,这块就提到了第一个啊,咱们可以呢,使用这个像idea啊,这个集成开发环境里边呢,相关的这个自动生成代码那个操作啊,就相当于咱们自动的使用out加insert,咱们去自动生成的是吧?呃,这是一种情况,另外的话呢,以后咱们还会去讲比如第三方的类类库啊,比如long box,使用这样的一个结构的话呢,咱们可以呢,自动的让它去生成。
23:02
啊,或者我们通过相关的一个简洁的注解的方式呢,就不用我们再去显示的把它写出来了,这个以后呢,咱们再去讲这样的一个第三方的一个库啊。好,这个呢,是咱们的一个啊,现在没有办法的一个替代方案了啊呃,那么在GDK10字当中呢,说就引入了一个新特性啊,这个官方他这样说的啊,神说要用record,于是呢就有了。啊,就出现了一个record这样一个结构,哎,当我们把一个类呢,定义成是一个record的时候,那它呢,就避免了我们再去定义构造函数啊构造器是吧,这个呢,访问器呢,相当于叫盖的方法了啊,以及相关的这样的一个结构。啊,下边关于他呢,还有一些具体的说明是吧,直接呢咱们就上例子。啊,直接上例子来,你看啊,我这儿呢,提前呢写好了一个类。注意我这是个类啊,这个类呢,咱们就没有用这个record,但是你看这里边儿都有什么东西啊,我呢定义了两个属性。
24:01
哎,这两个或者叫这个传变量也行哈,他呢,哎声明的是private final。注意,是private的,是final的。诶这两个属性,然后接下来呢,我提供了他们各自的,因为你是final了,是不是只能有get方法了,但是这个get方法你注意我们不是get谁叉叉叉啊,而是直接呢,就用我们这个属性名充当的。诶,这个稍微注意一点,诶,然后呢,我们提供了个构造器,这个构造器呢,就是针对这两个属性的啊,我们做的这个初始化啊,因为你是final嘛,需要呢做赋值是吧,我通过构造器赋的值,然后接下来呃,关于呃这个当前这个类的这个E扣的方法哈,扣的方法,突出人方法啊,这我呢就都提供上了。那么这个结构完全的就等价于注意看啊,我现在的话呢,去定义一个叫record。然后这个呢,我就写成叫ORDER1吧,咱们换个名。好,然后AL1呢,但是你发现呢,它是一个record了,然后这块呢,有个小括号在这里边儿呢,我们就写上啊,刚才咱们这呢,定义的是不是这两个变量啊,我这也同样的去写啊,Int型的叫order。
25:09
ID,然后呢,类型的叫I order。好,我写完了。什么意思啊,就是刚才呢,这个order呢,咱们看到这里边的有属性构造器啊,Get的方法,Equals high和to string,诶完全呢在这里边就自动的给提供了。诶自动的就给提供了,注意这个结构呢,为什么在这写小括号呢,它其实呢,就暴露出来,我们当前这个record当中,首先呢,你是有哪几个属性。其次的话呢,这个构造器呢,呃,就是长这个样子的。啊,给我们这两个属性的做初始化的。啊,这个大家注意好,那这个呢,我们就完全的可以看到对刚才这个题况了,诶我们下边呢,就来具体来测试了。好,大家呢,应该针对我们刚才这个al呢有个印象啊好,首先的话呢,我们是已经写好的,这个al就是用这个class的方式来定义的,这个里边的话呢,我们首先呢,造了个对象调用这个图方法,那显然呢,这个图打印出来不就是我们重写以后的吗?不再是一个地址值了是吧?好这个get这个方法。
26:13
咱们注意对应的啊,我这个属性名叫什么,我这个方法呢,就叫什么了。这呢是ID的,这个是的,没毛病,我现在下边呢,又造了一个对象。又造了个对象呢,然后我们调了一个叫E方法,说判断它俩是不是ES的,诶这块你看显然也是个出是吧?好,下边这块我想测试的是这个哈西扣的合力E。因为呢,我这儿呢,使用那个哈西赛把ORDER1。啊一和咱们这个二呢,是不我就都放进去了啊,因为呢,我们在这里边呢,已经重启了,是不是这个哈的方法了,所以呢,它需要呢,先拿这哈进行判断了,然后呢,再看一下你俩是不是ES呃,进而的话呢,咱们这里边那最后发现呢只放了一个。啊,相当于我们调用过这个high code的code重写了是吧,没毛病啊好,这个呢,是针对于咱们使用class定义的这个结构,然后大家注意看,我原封不动的把它CTRL一下。
27:05
啊,这块呢,我们来。哎,测试一下。这个叫record啊。哎,测试一下,我们这个所谓的这个叫记录啊。然后呢,我把这里边儿的order呢,咱们是不是只需要改写成叫ORDER1就可以了。啊,这块改一下,然后这个位置呢,我们改一下啊,这块我们放的是ORDER1是吧,哎,真的就没毛病了。行,然后这块呢,我完全的替换成2.1了啊,接着大家你再去做一个run。你看你会发现呢,我们打印出来这个结果呢,跟刚才呢,我们上面这个order呢,是完全一样的,首先呢叫twoth three,诶我们这里边看啥也没写。他呢,已经给我们提供好了一个储存量,就是打印我们这个属性的值。对吧,然后呢,提供了对应的这个钙的方法啊,就是以我们这个属性名字来命名的这个方法。好,当我们去调离一个方法的时候呢,明明是两个对象啊,它确实是个true,说明呢,我们比的就是属性值说明重写了,然后这块呢,我们也放到含义S当中,诶发现呢,还是有一个说明也重写了这个哈西库的方法。
28:07
哎,这个呢,就是我们所谓的叫record这样的一个结构啊。啊,比较简洁,行,那么在呃,它自动的给我们提供了相关的这个方法的基础之上哈,我们说呢,还可以怎么着呢,这块呢,你看我写了这样的一个声明啊,咱们可以呢,再多说两句啊,比如说现在呢,我们再去创建一个啊record这个我写成了叫person吧。啊人啊这样的一个结构啊,呃,这个的话呢,比如我们也去提供一个int型的叫ID啊,这个string类型的我们叫name是吧?呃,这个呢,就已经给我们提供了很多的结构了啊,然后在这个基础之上呢,诶我们发现呢,这块还可以。说呢,还可以在record当中去,诶声明。呃,生命的这个类当中,我们去定义叫静态的字段,静态的方法,诶,构造器,或者是叫实例方法。嗯,来咱们测试一下啊,比如说呢,我们还可以再去声明静态的字段,呃,我声明叫static啊,死string类型的,比如说叫一个呃描述吧,或者叫一个infer,哎,这样也行。
29:10
那这块你也可以给他赋个值啊,诶我是一个人,嗯,你看这个时候呢,是不是就可以了,行,那至于说呢,我们这个sta这个这个静态的变量哈,诶它的权益修饰符啊,Privacy public啊,这都无所谓啊。这是然后呢,静态的方法就是public static,我们写个个方法。啊,写个输出是吧,哎,我是一个人啊。哎,这样就行。啊行,这呢就是一个静态的方法了,说呢还可以去声明构造器。扩大器。对,首先的话呢,咱们这个person里边呢,已经有一个两个参数的构造器了啊,我呢再去写一个,比如说空仓的一个构造器。哎,这样写的,哎这样写完以后呢,你发现诶报错了啊,这个怎么理解呢?哎在这里边呢,你可以发起对我们线这构造器的一个调用啊,比如这呢,写成是一个零。啊,这呢,咱们先扶这个闹啊,这样的话呢,就没问题了。
30:03
啊,这样我们就不调所谓的super了啊,哎,Super是谁啊,这个咱们一会儿说这个事儿。呃,接着,呃,还可以定义呢,这个叫实例方法。比如我们原来定义这个叫eat吃是吧。啊人哎吃饭哎,这个你看是没问题。啊,这就是它啊行,诶那么这儿呢,就是我们说的还可以呢,额外的定义这样的一个结构,诶这块你注意我没有提到说可以定义这个叫实力变量了啊,那实力变量怎么不能定义呢?那你比如我们这块我就声明一个说我在想定一个in特性那个age。啊,你看这时候呢,就报错了。注意我们在啊,Record这里边呢,已经写明了他俩了,那就意味着我们当前这类里边呢,就由这两个的实体变量,而且呢,他们还都用final去修饰了这个位置的话呢,你要写首先呢,不可以了啊,你这样写法的话呢,也没加final啊。是吧,即使你加上final的话呢,这块呢,也不会再去声明了,因为你在这个位置已经指明了声明的这个实力变量了啊,所以这块呢就不能再去写了。
31:02
啊,这个呢,也就是咱们下边这块,你看说明的第一个点是吧,不能够在这里边去定义这个实力的字段啊,即使你自己主动加final也不行啊,下一个那呢,不能够生明成叫abstract。诶,针对咱们当前这个record啊,就是用它呢去呃创建具体的实例的啊,所以你不能够不让它创建实例啊,所以呢,诶当你啊,比如我们再写个record这个我们称为它叫哎dog吧。是吧,当前这个dog呢,说能不能就咱们先整个小括号啊in,现在比如说叫ID吧,说这块的话,能不能把它声明成了叫abstract呢。哎,注意不行。啊,这是不可以的。嗯,行,再一个啊,说不能够声明显示的负类。比如说针对咱们那个person说呢,他能不能有类呢,诶比如我这块呢,去extend一下。啊,你比如我们说呢,想体现这个多线程,说让他去继承thread,那不好意思啊,不可以。啊,不可以有这种显示的这个服类。
32:00
啊,这个大家要注意一下。哎,比如我写到这吧,哎,是用那个record给咱们叫一个cat是吧。啊,然后呢,让他呢去。啊,这个呢,叫thread。注意,这样呢是不可以的。啊,把它给阻止掉了,行,那究其原因是什么呢?这块呢,其实大家呢,就可以去想咱们的这个叫枚举类啊了。啊诶,我回到咱们的这个位置啊,我简单的在这再写一个这个test。啊,这写成个三啊。这是个二,这个三好,你看啊,咱们当前的这个类呢,是不是叫person呢。哎,点class一下。哎,我这么着一下。嗯,就用它来表示吧,行,这个没问题是吧,好,这个person我点一下是不就对应到咱们这个record这了嘛,行,那么当前呢,咱们这个我get一个叫看下的这个是。啊,这块呢,其实它有一个啊指定的类,这个类呢,就叫做record。
33:03
诶注意它就是record record有点像咱们当时讲的那个酶几类一样是吧,酶几类的话呢,使用伊姆定义的它呢,呃,显示的这个负类呢,是不是都叫做这个呃姆这样一个类。啊,这个大家看还有没有印象啊,好,因为呢,它已经有明确的一个负类了,所以呢,你就不能够再去指定它的一个负类了,呃,实际上呢,是这个原因造成的啊。好,包括呢,你看咱们这个record啊,是一个说能不能定义它的一个类呢?啊,你比如我这块声明叫做这个student是吧。哎,我让他呢。哎,去extend一下,咱们当前那个person行不行呢。诶,你看这块呢,写的说当前的我们这个,呃,下的这个person啊,说不能够去继承啊,因为他这个final。啊,说明我们当今的re呢,还有个要求,它是个final的,Final就意味着不能有此类了,是吧。你看这个要求还挺多的啊。啊,这个大家都得注意一下这个点。OK,行,那么关于这个record的话呢,咱们就说到这儿了,诶那最后呢,还要提一个点说呢,Record record引入了啊,感觉还挺好的,那他能不能看作是对咱们的一个扎病的一个替代呢。
34:11
哎,这块注意不能。但不能因为呢扎B的时候呢,咱们呃说呢,首先呢,也是创建一个一个的对象是吧,比如说咱们整个的手机使用的时候呢,呃,咱们想查看一个列表中的数据,这呢就是一个列表了,往上滑动每一项呢,其实都可以看成是个对象,那么这呢都可以看成是对应的叫扎病这样的类的创建的对象了。呃,这个对象的个相关的一些属性信息啊,我们说呢,以前咱们讲扎的时候呢,还会除了get方法之外,是不是还会提供这个叫方法是吧,那现在的话呢,你针对于咱们这个里边这个数据呢,它是只能get是不能够去修改的。是吧,哎,提到它不可变的,所以呢,它不能够简单的看成是对扎病的一个替代了。啊,那那如果说没有这样的替换的行为的话呢,你可以考虑呢,使用record来设计啊,也是可以的啊。好,这个呢,是咱们说的这个叫记录啊,这样一个结构。
35:04
呃,还剩一个啊,咱把这个呢也说一下啊,这个呢称为呢叫蜜蜂类。蜜蜂类这个什么意思呢?其实呢比较简单啊,我一说呢,大家就能明白了,咱们前面呢,讲Java中类的时候。啊,就提到了两个点啊,第一个点说这个类呢可以被继承,这呢也是默认的一个行为,在权限允许的情况下呢,你能被继承是吧?哎,只要能被掉你就能被继承,但如果想体现出这个类呢,不想被继承了,咱们是不是用这个final去修饰一下就可以了。所以这块针对这个类的话呢,我们就非常简单粗暴的分成两个维度,第一个能被继承,第二个呢不能被继承。那么在实际开发的时候呢,我们说呢,不够灵活。啊说呢,我们想让这个类呢,体现一定的延续性啊,也就是说希望让他被继承,但是呢,又不希望用户呢乱去继承。怎么办呢,这块呢,我们就引入了一个关键字叫做S啊,用它呢来去修饰个类,那么对应的这个类呢,我们就称为叫蜜封类。
36:04
避峰类,然后呢,我们就可以指定啊,稀有的修饰的这个类呢,可以被哪些子类呢继承,只有指定的子类呢才能继承啊,没有指定的就不能继承了。啊,就相当于我们针对原来这个final去修饰的话呢,就是力度呢更细了是吧?啊非常的简单啊,好,下边也有具体的说明,咱们直接通过代码上去看就行了。来直接我们看这个蜜蜂类啊,在15当中引入的啊,引入的比较晚啊,16呢二次预两,17呢转正了。啊,就是这样的场景,好,咱们直接呢来去写这个例子,比如说啊,我这块写的就叫做这个person吧。Person没问题是吧?好,那么针对于这个person的话呢,我给它加了一个修饰叫做。啊,它就是一个密封类了啊,然后加上以后的话呢,它会报错啊,因为我们需要呢指定,既然呢,你是一个稀有的一个密封类了啊,你说呢,能够被指定的一些类呢,所继承哪些类啊,你是不是紧接着要写出来呀。
37:03
哎,所以我们后边就去写这个,写的话呢,用的这个关键字呢叫permit。啊允许啊谁呀,比如说允许呢,被student。啊,允许呢,被这个teacher。是吧,哎,再加上一个,比如叫a worker。哎,工人,哎允许呢,被这样的三个类呢所继承。啊,就是这样的一个意思了,行,那具体的话呢,这个类呢,我们就可以呢,声明出来了啊,你看我下边写啊说class一个叫a student是吧,诶我让他去继承这个person。啊,这是一个啊,我们一共有三个吧。哎,这个teacher。啊,这个哎,Worker。OK,这样写的。是吧,诶,但是注意呢,你看我写完之后的话呢,还是报错哈,呃,那什么意思啊。诶这块呢,我们说呢,诶被啊,我们这个C的这样的类啊,指定的说被这样的三个子类呢,所呃继承啊,允许被他们仨继承,其他的就不行啊,比如这块你试图的去写一个说class来一个。
38:05
啊,来一个,比如说这个,哎,这个叫什么农民是吧。哎,Farmer。是这样写吧。Farm,哎,让他呢去继承咱们这个叫a person。这个呢是不行的。啊,他的不幸是因为你这块呢,没有promise。啊,这个呢,注意这是不允许的,那这块要写的话呢,还报错啊,因为我们有要求啊说呢要求。啊,指定的这个子类啊。啊,就是我们下边呢,对应的这三个子类必须啊是怎么着呢?哎,要么呢,你是一个final。什么意思啊,就表示呢,你这个此类的话呢,不能够再被继承了。啊,必须是final的是吧。啊,这是一种情况,然后还可以什么情况呢,你还可以呢,写成是一个叫做呃。就是你也可以呢,写成一个叫私的。啊,你也可以呢,写这个叫SE的什么意思啊,就是说你这个类的话呢,你仍然可以指明,呃你呃可以被哪些词类呢所继承。
39:09
啊,这是一种场景。是吧,哎,这是一种场景的,然后呢,你还可以呢,指明呢,你当前这个worker,比如这个worker的话呢,说呢我们啊还可以呢,去声明成一个叫none。C这块把它粘过来啊,CTRLC。说呢,要求指定的此类呢,必须是啊三者之一。诶这样才行,你看此时的话呢,我们这个跟这个不报错了,这就表示我们,嗯这样修饰的话呢,相当于咱们这个死丢顿的这个类呢,不能被继承了。是吧,哎,这个类就不能被继承了final吗?然后这个是什么意思呢?先把它说一下啊。此时呢,咱们这个叫worker,它呢加了一个叫na,它就是不是一个密封类,那就我们这个类呢,呃,在被继承的时候呢,没有任何的限制。
40:00
啊,相当于这个worker这个类呢,可以被啊任何的啊或者叫呃,在被继承时是吧。哎,没有任何的限制啊。哎,没有任何的限制。啊,比如这块呢,你想诶用什样的类,只要你能看得到啊,你想继承你就继承,比如说你是一个手表是吧,咱叫watch吧,诶手表的一个工人。这样个worker,让他呢,去继承于咱们的这个a worker啊,没问题是吧,啊没有任何的限制。啊,这就跟咱们以前你没有加这样一个修饰,写一个类一样啊,那这个位置呢,加上了,那自然而然我们就知道了,它只能够被是不是指定的这个,呃,一些类呢去继承。啊,你比如说我们这个teacher啊,指定的什么词类呢。Teacher,比如我们叫senior。啊,Teacher。啊,Senior是不是就是这个叫高级教师是吧。啊,这个我们在这写啊,说当前我们这个teacher这一类呢。
41:01
哎,只能。啊,只能被啊指定的这个艾斯丽娜继承。就相当于它还是一个跟我们这个类似的这样一个结构啊,那这个类的话没有,嗯,整出来呗。Class也是他是吧,让他呢去继承于咱们的这个叫呃,Teacher是吧。诶这就可以了,诶但是这块的话呢,你因为是诶他了,他呢,是不是类似于我们刚才说person的这个子类一样,它也面对的同样的这个场景,比如这块你要没有限制了,那你就加个na。那就这样写就行。诶这呢,就我们说的这个场景,诶,也就是说啊,我们这个呢,叫做蜜蜂类啊,我们在这写上啊说这个person呢。是一个啊,咱就叫密封类了啊,指定。可以被啊指定的这个子类呢所继承。啊,非指定的这个类不能继承啊person类。
42:00
这个呢,就是它的一个主要特征,呃,然后呢,我们这个指定的这个此类呢,必须得是三种情况之一。啊,你想不加任何修饰啊呃,像这种啊,不加任何的这种修饰的话呢,就不对。这不就报错了吗?嗯,OK啊。行,这个呢,我们说叫诶高级教师是吧,这个教师的话呢,像那个中学里边也会评那个职称。啊,这个呃,一般的我们一说呢,叫特异教师,这就属于级别很高了啊,其实呢,在这个执政当中,最高级别其实就是高级教师了啊,这个特异教师呢,可以理解成是一种荣誉啊,哎,像这种学酗里边一般都说有这个特级教师的。啊,一般呢,就说的感觉很高级是吧。这个昨天的话呢,我还给我这个大学玩的特别好的一个朋友打电话啊,也是好久也没联系了,他呢是在南京啊,然后呢,这个一开始呢,是毕业之后啊,就直接留到这个南京大学呢教书了啊,现在呢说又去这个中科院了哈,呃,前段时间知道他去中科院了,他没有细聊啊,昨天一聊。嗯,他跟我一样大啊,然后呢,现在已经是博导了。
43:02
啊,很厉害啊,已经是博导了这个,而且呢是中科院呢,叫百人计划团队的之一啊,我说你真牛啊。啊,36岁现在能做到博导,在整个他们体系里边应该也是很少见的是吧。哎,这个呢,应该是做科研还是比较厉害的啊。嗯,他原来呢,跟的是南京大学的,他们学校的这个校长读的这个博士啊,跟这个反正有点关系,主要还是个人比较强啊。其实想想的话呢,随着这个年龄呢,越来越大啊,以前的时候呢,我不是也当过了一个中学的老师嘛,是吧。这个二三十岁的时候啊,往往都想着要出去看一看啊,闯荡闯荡,当这个年龄越来越大的时候呢,呃,就是发现呢,找一个这种稳定的一种事业单位呀,是吧?诶感觉还是挺好的,所以我还挺羡慕他的哈。这个当时呢,我不是也打算是读博嘛,哎,我要是读博的话呢,这个有时候想想,哎呀,这个有时候这个选择就不一样啊,原来我在北航的时候想要读博,跟他是计算机学院的一个徐老师。啊,具体名我就不说了啊,也是一个学科带头人。
44:02
啊,前段时间呢,咱们国家那个教育部的部长换了是吧,然后呢,当时一顿可惜啊,因为我要跟着这个徐老师他的导师。啊,就是咱们现在的教育部的部长是吧,哎呀。还是挺厉害的啊。当然了,我觉得我要读博的话,也不一定心能够静下来。OK啊。行,所以呢,人的这个选择啊,有的时候你发现还是挺多挺不一样的啊,关键呢,还是你选了其中的一个选择之后呢,啊,一路走下去是吧,把它做成是一个好的选择也挺好啊。OK,那么这样的话呢,咱们就把这个密封类呢就讲清楚了,诶那么只此咱们把这个零四里边的关于语法层面的这些新的特性呢,诶我就给大家呢都过了一下,除了之外呢,其实还有其他的一些点啊,但是那些点的话呢,相比较来讲,呃,都比较小细碎是吧,这个有的可能一些文字性的描述,对于我们开发来讲呢,没有直直观的这个这个表达啊或者帮助,诶我就剥滤掉了啊就不多讲了,这里边儿呢,大家主要关注的也就这八个点就可以了。
45:04
咱们在一开始讲这个,呃,大家如何看待不同版本这个新特性的时候呢,我就提到了一个角度一的问题,关于新的语法层面呢,大家多去关注,那么刚才讲的这些,那除了我们提到这个叫Switch的这个模式匹配,它属于一个预览特性之外呢,剩下的这些呢,基本上在后续的版本当中都做了一个转正啊,那么转正了就意味着我们后边呢,不会轻易的把这个新特性给干掉了,哎,大家呢,就可以放心的去使用。啊,OK,这呢我们就说清楚了,然后呢,第二个点的话呢,我们来看看关于API这块层面的一些变化,呃,这块整体上来讲的话呢,还是JDK8当中我们提到的这个string upi是比较重量级的一个内容,然后剩下这块呢,其实就没有特别夸张的这个API了。啊,那这块我筛选了一下呢,也就给大家呢,说一下我们这叫optional这样的一个类啊,主要呢就来说一下它。这个类的话呢,其实也是在GD当中引入进来的啊,那这块呢,引入它做什么用呢?嗯,提到了,说到目前为止叫臭名昭著的控制异常是导致Java应用程序失败的最常见的原因啊,这呢用了一个词叫臭名昭著是吧,可见呢,大家对控制人异常呢是多么的深恶痛绝啊,说呢,为了解决这个控制异常,谷歌呢,在他的一个项目啊,项目当中啊,就瓜A这个项目当中,他呢引入了一个叫optional这样的一个类。
46:22
啊来通过这个类呢,嗯,它相关的一些检查的机制是吧,避免了出现这个控制帧的异常,那受到谷歌这个项目的一个启发呢,Optional呢,在我们JAVA8当中啊也引入进来了,说白了就是我们Java呢,就是抄了一下骨骼中的这样的一个类是吧,这样的一个想法,那么这个类的话呢,我们把它呢,也看作是一个容器。前面的话呢,我们提到哪儿的时候,收购容器呢,是不是提到了数组,提到过这个集合的时候,对吧,实际上呢,还可以有一个位置跟我们这个结构呢,更相似谁呀,就是我们讲的这个包装类,或者说叫封装类。啊,你看我们这块呢,定义一个叫做integer是吧。这个in里边呢,它封装1INT型的一个变量啊,那现在的话呢,我们这个option说它呢,是封装了一个具体的某一个类型的一个变量,哪个类型啊,就是我们这个泛型气这个类型的一个变量。
47:09
啊,那么我们诶针对optional啊,或者叫针对这个气这个变量的一个相应方法的调用呢,我们可以理解成呢,是从这个容器里边先把它取出来。所以呢,从那个角度上来讲呢,这个英特尔啊,也可以看到是个容器,就是对应的基本数据类型啊,包装起来的一个容器。OK啊好,那这块呢,我们看看它如何去规避这个控制异常,下面呢,有对应的创建optional的这个方式,包括它常用的方法,来我们回到这个代码层面呢,咱们做一个说明,大家呢,打开我们对应的这叫诶零五,第一个呢叫optional是吧。好,那第一个呢,引入问题,说我们为什么要引入option呢,主要呢,是为了去避免。诶代码中,哎出现这个诶空指针异常。哎,这样的这个场景啊,包括呢,咱们看到了在讲解到这个stream API的时候呢,咱们是不是也出现了相关的这个反回制的类型呢,是optional这个类型的,对吧?诶我们午呢讲的时候呢,也提到这个事儿了啊好,那下一个问题呢,就是如何呢去实例化咱们这个optional,诶这块呢,就提到了几个不同的这个方法的一个调用啊,比如说调这个叫empty啊,调这个of啊,调这个o novel,主要的这块想跟大家强调的就是我们最后这样的一个操作啊,叫o no这样的一种方式。
48:21
哎,那么具体的常用方法,哎,这个我们就一边说呢,一边给大家去引入了,诶这块呢,我们写一个具体的测试。啊,比如我们叫做option。它的一个test。这么着啊。对回过来啊行,那这块的话呢,我们就直接呢,给大家呢,去引入一个场景,比如说我现在有一个死正形的一个变量啊,假设呢,叫star有一个明星啊,这个明星呢,比如说啊叫哎迪丽热巴。啊,我觉得长得挺好看的是吧,好,那么这个迪丽热巴呢,是一个变量的一个值,然后呢,这个变量的话呢,我们说呢,有可能它是一个控制帧的。那比如说这块,我们就调它的一个方法叫做to string吧。
49:02
那如果说这个呃变量了,它的这个值是不空的,我们调兔子string的时候呢,呃,就调用它这个具体的功能呢,此时呢,就把他这个信息呢,给打印了一下啊叫迪丽热巴。没问题是吧,啊,那么如果我们这个star。啊,它呢是一个闹值,我们再去调用的时候呢,很显然它呢,是不是就报一个叫空指针的一个异常了。这个我们都是很清楚的问题,好了,那下边呢,我们就来说明一下啊,我们使用optional如何去避免这个控制的问题。Optional。啊去避免哎空指针的问题。哎,大家想想这个事儿我们怎么去规避呢?说还能有这种好事儿是吧?诶其实呢,大家你经到一个场景,比如说诶现在在一个公司当中是吧,诶你这块呢,邀请一个明星呢,去做一个活动,假设这个明星呢,你请来的就是迪丽热巴了,诶迪丽热巴呢,诶到这个时间呢就来了,然后呢,比如说你让他唱一首歌啊是吧,表演个节目啊,诶这块呢,人家啊就正常的把这个活动呢就给做完了,这不都是没问题的。
50:04
啊,那么控制人的问题呢,就类似于什么呢,说这个明星呢,你请他来了,他本来也说来,结果呢,到时候呢没来。出现问题了是吧,诶这个出现的问题呢,就类似于咱们说的控制人问题,那你如果呢,你想避免了,在实际的这个活动当中,你说诶就不能把这个厂子给晾到这儿了,你怎么办呀。啊,唯一的办法呢,就是这样说呢,你请的是迪丽热巴,诶迪丽热巴呢,说他能来,那万一要是来不了呢,诶这块呢,如果他要是没来,咱们是不是再有一个后辈的一个明星。是后辈这个明星啊,这个呢先准备着,如果迪丽热巴来了啊,迪丽热巴呢,去要相关的方法,如果迪丽热巴没来啊,那你拿这个后辈的明星呢,是不是顶上去,那这样呢,你也就避免了这个空场的这样的一个场景了。诶,那我们这块呢,如何去避免控制异常呢,也是类似这样的这个思路。诶,类似这样思路,你看我们怎么做哈,首先的话呢,既然你要用这个optional了,第一个问题是不是涉及到实体化的问题了。
51:01
诶,实例化的问题,好在实例化的时候呢,我们就使用刚才提到的这样一个方法叫novel。好,那这块呢,我就调一下啊叫option里边呢,我们调了一个叫of no,然后这个位置呢,我们就可以一个的一个值,这个值是呢。那这个值的话呢,就是我们对应的这个叫做四套。啊,就是它好,把它传进去之后,我们来一个alt加回车,就生成了一个optional这样的一个实例。啊,这块我们操作的就是这个死string类型的,诶因为你传进来的这个实际的这个值就是死顿类型是吧?诶我们刚才也提到一个点哈,说这个option呢,它不就是个容器吗?怎么体现这个容器的概念呢?哎,就是相当于它内部呢,就是封装了我们这个T类型的一个value。咱们呢,其实呢,呃,本质呢,就想操作这个value呢,但是现在你把它呢,封装在我们这个op类里边,作为一个属性出现。啊,你像咱们刚才呢,这块叫no调到这个star传进去的,就相当于呢,咱们把这个呢,实际上就复制给了我们这个option里边的这个属性,你看我们它本身呢,不是个no是吧?哎,就调这个呗,调这个的时候呢,你看我们点进来把这个VALUE6,就是我们这个迪丽热巴的这样一个字串了,是不是就付给咱们当前这个VALUE6了。
52:13
诶没有问题啊行,这块呢,咱们调的方法呢,就是它,诶我把这个呢CTRLC啊粘过来。诶,写到这儿。哎,那么此时呢,咱们说这个气啊,它有可能是一个闹,哎,你像我们要是把它注入掉了,这就不是闹啊,你把它打开,它不就是个闹吗。诶,所以它有可能是个闹啊,这块注意一下行,那么接下来的话呢,我们就要拿着这个star呢,去调这个方法怎么着呢,咱们从这个option里边呢,把它取出来。就是你先放进去,然后呢我再取出来啊,取出来的时候呢,我们用的方法是哪个呢?诶咱们看一下课件,诶它这里边儿有好多这个方法啊,现在呢,我们主要想用的是其中一个叫all else这样的一个方法。诶把这个方法呢,我们给他。CTRLC一下啊粘过来,这个呢,你可以放在这儿,这呢就是我们主要强调的这样的一个方法。
53:03
哎,就他啊。好在这块呢,我们就调用这个所谓的这个叫哎all else啊传一个T类型的这个叫other了,哎调这个方法。好,那我们点一下叫I else。我们就需要传一个另外的一个啊字符串进去了,所以这呢,我写一个叫other的一个star。啊,另外呢,我们再请个明星。啊,请个谁呢?比如说迪丽热巴的这个老板杨幂是吧。好,我把杨幂呢就写到这儿了,然后呢,把这个字符串呢放进去。放进去以后。诶,此时呢,我们来一个alt加回车,就能够返回一个死中性的变量,这个呢,就是咱们最终要来的这个明星啊,叫做这个star。好,我把这个变量呢,放到我们这个位置呢,去做个调用。哎,这样的一个结构,这呢,就涉及到我们这个OS这个方法,它到底是一个什么意思了,诶大家你看啊,我们点进去。哎,这不就这吗说呢,如果诶我们这个VALUE6就是当前我们这个类里边的这个VALUE6的这个属性是吧,说如果你这个属性呢,它要不是闹呢,我就把这个VALUE6返回了,如果你要是闹呢,我就把这个诶传进来的这个参数的这个值呢给你返回。
54:14
这不就非常的清楚吗?言外之意啊,就是我们当年呢,不是把这个迪丽热巴呢给放进去了吗?给我们的option里边这个呢,做了一个赋值,说如果那迪丽热巴呢,他不是闹,那我们取出来的就是迪丽热巴,那如果呢,呃,他呢是一个闹,那我们取出来的实际上就是我们刚传进去的杨幂了。夏丽呢?诶迪丽热巴要能来呢,迪丽热巴呢去表演是吧?诶迪丽热巴呢,如果要来不了,让杨幂呢去表演。哎,就成这个意思了,所以这儿呢,我们把这个方法呢写一下啊,就是诶如果。Optional。这个实力啊,内部的这个Y6属性。啊,不为闹。啊则返回啊Y6,那如果呢,这个Y6呢为no。
55:01
哎,如果呢,这个Y6为闹啊,怎么着呢,我们说哎则。哎,返回咱们这个,呃,参数other。啊,就是我们这样的一个操作了。行,那这块我们去调这个结构就行了,那如果这时候呢,你看我们这个迪丽热巴呢,它显然这个不是个闹是吧,那此时呢,我们要去做个run打印出来的话呢,相当于就是迪丽热巴了。没问题是吧,那如果说这块呢,你要是一个闹呢,那迪丽热巴来不了了,这块我们再去run一下,那杨幂呢,是不是就顶上了,那这个结果呢,就是杨幂。哎,通过这样的一个操作呢,我们就规避了这个控制针的一个问题。是吧,哎,这就我们讲的这个情况啊。行,这呢,就是咱们主要的这样一个场景,那他呢,还有其他的一些方法啊,这个方法的话呢,诶我就不过多的去说了啊,主要这块呢,就再提一个,就咱们上午的时候呢,用到这个stringpi的时候呢,这不我们提到了它的一个方法。诶这个方法是谁呢?就是我们通过这个optional,诶它有个方法呢,叫做get方法,诶这个get的方法呢,实际上就是把它内部的这样的一个value呢,给它取出来,诶但这块取的时候呢,还判断说你是不是闹啊,如果要是闹的话呢,说没有啊,如果要不是闹,哎再取。
56:06
哎,就这个意思啊,比如我们这块呢,存的就是迪丽热巴,哎这块盖的话呢,就把它内部的这个value呢给返回了。嗯。OK啊行这块呢,我们主要呢,就提一下这个get这个操作。取出。诶,内部的啊,咱们这个Y6值啊,当然前提呢,你这个Y不能是个闹是吧,是闹的话呢,就报异常了啊行,这块呢,关于这个option呢,咱们就说到这儿了啊,相对来说也不是太复杂啊,然后呢,此外的话呢,还关于那个啊这呢也算是咱们平时开发当中比较重要的一个结构了,诶关于它的一个简单的说明,在GDK9的时候呢,我们已经提到过了,它内部呢,是不是使用这个差型的这个数组改成了这个BA的这个数组了。啊,这个已经说过了是吧,好,然后呢,它已经变了,然后呢,基于它啊,像我们提到这个string buffer builder可变的字,如序列,他俩呢,变没变呢?哎,通过这样一个说明,你会发现呢,他们内部呢,也改写成了叫be类型的数组。
57:05
啊,也就是说呢,跟字符串相关的一些类啊,底层呢,全都变了。啊,这个大家注意一下就行,然后呢,在这个GD11当中,针对于咱们这个string啊,又增加了一些方法啊,这个我就简单的在这也有个罗列啊,其实一般呢,我们用的也不多啊,需要呢用到的时候呢,这个稍微再来看一下就行啊,然后呢,在这个GD12当中啊,我们这个呢,又多实现了一个接口啊,实际上呢是两个啊啊E。这块呢,主要体现就是它是这种常量啊,因为我们此缀的话呢,它不是叫字符串常量池里边放在字符串常量嘛,啊体现了这样的一个接口。啊行,这块也没什么特别的哈,大家也不用特殊的去过多的去做这个关注了啊,也比较简单啊,不用刻意的去看了。呃,这块呢,G12当中又增加了这个相应的这种方,这块呢,我给大家写了这个测试的了,还使用了咱们这个拉和这个方法用啊这个愿意看呢,大家就看看,其实这个用的也不是特别的广泛是吧?呃,在很特殊的场景下,或者说呢,我们这个基于啊S令呢,提供的这样方法呢,它内部呢,呃,在提供其他的一些API的时候呢,他可能会用这个的相关方法,我们要自己用的时候,有时候可能想不起来。
58:19
好,这就关于这个就过掉了。这个咱们一开始的时候,第一天讲Java提到了是不是叫Java SE javae和Java me啊Java的三个这个呃,应用的场景是吧,Java SE呢,诶Java就我们说的个后台发了呢,我们说可以用va的一啊对,就相应的桌面的一些A这个一些相关的开发,你包括呢,咱们讲到的这个补充的项目。啊,写的这个,比如说俄罗斯方块啊是吧,咱们这个贪吃蛇呀,诶像这块呢,实际上呢,都是桌面级的应用了,咱们都会使用到这个APP的相关的一些API,包括呢,大家看一些书的时候呢,有一些教材呢,还专门讲这的API,呃可以写相关的一些效果看着呢挺好是吧?但实际上呢,这块已经不是Java的主要的发展方向了,在GDK9的时候呢,就把相关的API呢给标志成过时了,在G时期当中呢,呃,通下杀手啊,直接把它给删了。
59:20
啊,这个大家如果看到一些书当中还在讲这个内容,这个书呢,显然就比较老了啊,建议呢,你就就别看了啊,OK,行,这个呢就稍微的说一嘴就行,接着的话呢,还有其他的一些结构的变化啊,比如在GT9当中提到了一个下划线啊,以前在GP8里边呢,大家可以呢给一个变量,直接就命名为叫下划线。啊,可能大家没这样做过啊,实际上是可以的,但是在G9当中就不允许这样做了。啊,以后呢,也都不能这样去使用啊,没什么具体的意义是吧。好,然后还有一个小事儿啊,就是在这个大家一开始啊,咱们通过这个命令行去写这个代码的时候啊,先编译后运行,之前呢,有的同学呢,就一不小心呢,就做成这样一个点了啊,当时感觉很神奇啊,还特意的来问我,诶我说啊这就是一个新特性。
60:07
诶什么意思啊,你比如说啊,咱们就写了一个hello word。啊,我举一个就就在咱们写的这个代码里边吧。哎,我就在这边,比如说给大家呢写个例子,呃,咱们写一个谁啊,我就写一个叫。诶hello word啊,这个大家呢,你就觉得挺好玩的哈,理解一下就行,诶把这个打开,我这块呢,就写一个哈,说class一个。啊哈。Word啊行,注意这块呢得有个要求,就是我们这个文件名呢,跟我们这个类名呢得一样啊。好在这里边呢,我写一个public。The static world。来一个妹。哎,词缀类型的是吧。啊,在这呢,咱们就写个hello了啊。行,保存一下没毛病啊好,这个程序呢,我就把它给关掉了,然后接着的话呢,咱们在这个位置呢,我来一个叫CMD。
61:01
注意这块呢,是咱们JDK。诶,这是11的一个新特性,你在之前那版本当中是看不到的啊怎么着呀,诶我过来之后直接呢,咱们就诶Java。哎,空格一下,哎,我们这样叫hello word。点Java啊,但是你看啊,我这呢,是不是既不是个编译也不是个运行,诶我这块写的是Java,然后后边呢,我竟然写的是一个原文件是吧,你看这是我回车一下。当然你会发现呢,你看直接呢,我们把这个结果呢,就给输出出来了,相当于你可以理解成叫编译和运行呢,就给合成一个操作了。啊,那回过来你看一下,我们在当前这个目录下呢,也并没有帮我们去生成这个迪尔卡这个自建码文件是吧?呃,只是呢,就是直接呢给执行了,像这呢,作为一个小的新特性啊,大家呢,了解一下就行。这就过了啊,然后呢,这个JC方面的变化啊,简单的提一下,这个呢,我们毕竟呢提到了说呃,关注于这个新的版本这个特性的时候呢,有三个刚才我们了实际是A的,然后关于这个底层的优化方面呢,实际上也会有一些变化,比如像G8中我们提到这个内大的一个调整方法区呢,从这个永久带呢,我们改成了叫圆空间啊,挺大的一个变化了。
62:13
然后呢,这个还涉及到了,比如说GDK7当中的,诶,我们说呢,叫串池这个静态啊,都切换到了我们这个叫呃空间当中,是从这个方法给转移过去的啊还有呢,我们在每一个GDK的版本当中,通常呢,都会看到相关的一些比如回收器啊,GM相关包括的一些优化的一些调整,这个呢,对于我们开发来讲呢,其实呢,尤其是中高级成员可能不用关注太多。呃,当以后呢,大家需要做相关的一些系统的调入的时候呢,我们再去关注这样的一些具体的变化啊,好,那么关于这个垃圾回收器这块呢,简单的说一下啊。这个首先呢,这块提到一个叫j first啊,一般呢,咱们说成叫j first啊,这个呢就是garbage啊,所以呢,可以理解成就是垃圾回收优先啊,叫garbage first一个J啊,这个呢是GK9以后的默认垃圾回收器,那G8的默认圾回收器谁呢叫llel。
63:08
啊,Parallel这个J啊,这个大家了解一下就行啊,并行的垃圾回收器。行,然后呢,GDK9的话呢,默认的垃圾回收器呢,叫做g first垃圾回收器了,然后呢,在GDK10啊GDK12是吧,相应的都会有一些呃,它的一些这个底层的一些优化啊,这个细节呢,咱就不多说了,然后呢又提到一个叫SJC。啊,山豆这个呢,比较长,不太好念啊,叫低延迟时间的啊JC。啊圳呢,就想起来一首歌,大家呢,可能也听说过啊,叫嗯,Country road take me home啊,Take me home country road是吧,里边呢,就提到了这个叫圣river啊这首这个河流哈,呃,这呢就以这个来命名的啊这样的一个垃圾回收器啊,特别长,这个垃圾回收器呢,注意不是Oracle官方发布的啊,是谁发布的呢?是红帽公司发布的。啊发布的啊呃,它的主要目的是什么呢?他呢希望呢,呃,不管我们这个堆的内存是200兆还是200个GB啊,就不管你有多大,都希望呢,将我们这个JC的这个呃垃圾回收的这个暂停时间控制在呢,指定的这个毫秒以内,比如说十毫秒以内。
64:17
这呢是它的一个目标,哎,其实呢,主要目的呢,就是提到一个点叫做低延迟是吧,低停顿时间。啊,这个什么意思啊,稍微以前咱们也提到过哈,就是咱们要进行这个JC的时候呢,叫垃圾回收,它呢需要呢,呃,就是清理我们系统的这个内存的垃圾了啊,也需要做相关的判断啊,先把垃圾呢给它挑出来,然后呢给它回收掉啊在这个过程当中啊,其实它会出现这个叫stop the word这样的这个场景,就是把我们的用户先给暂停。啊,那么这个暂停的这个时间当中,咱们用户的线上就不能执行了,那你要时间特别长呢,给用户的感觉是不是就卡顿的效果了。啊,那这块我们就把这种暂停时间就看作是我们垃圾回收期的非常重要的一个指标了,哎,这个stop the world,这个时间呢,越短越好。
65:02
OK啊,尤其呢,是跟这个呃用户打交道的这样的一些场景,那不能让用户感觉到卡顿的这个场景是吧,所以我们就提到了叫低啊暂停时间或叫低延迟,诶它呢就是主打这样的特征的啊下边一些具体的算法呀,呃,具体的一些这个这个数据的测试啊,不多说了。这个呢,是红帽公司发布的啊,然后呢,这个Oracle官方自己也发布了一个叫做。哎,大家以后呢,学习GM的时候呢,可以多去关注一下它,你看这个名字起的叫Z啊,Abcd最后一个字母叫Z,是不是呢,想给人一个暗示呢,就是这是我们最后的利器了啊,叫ZJC啊,它呢也是一个啊,主要目的呢,是跟咱们上面的深圳斗JC呢是一样的,呃,就是实现第一延迟时间的啊,希望呢把它控制在十毫秒以内。不管咱们这个堆的内存大小有多大啊,都希望控制在十毫米内,这块呢,主要提到的堆,因为咱们这个GC的行为呢,主要就是在堆里边的方法区的话呢,诶回收效果并不好啊,回收的频率呢也极其的低,主要呢,就是针对堆空间的OK啊行,下边的一些具体的数据测试啊,就不多说了。
66:09
呃,整个来讲呢,这个Z咱们说是官方Oracle发布的,咱们根正苗红吧,而且从具体数据来看的话呢,这个Z它的相关的数据呢,比神斗啊这些呢还要好一些。所以呢,大家以后啊,我们相关的这个底层的G啊,如果做调整的话呢,就会换成。哎,包括呢,你看我们要想主动的去使用,以前呢,他还没有转正的时候呢,你还得去加上一个实验性的一个特性,才能够去使用这个C,现在呢,他在事物当中已经转正了,如果大家呢,底层使用的垃圾回收器,你就想用它,你就加上这样一个参数就行。啊,我就不去演示了啊,这个咱们在GM当中呢,才会去涉及到这样内容,大家做一个了解就行。啊不用多说了,行,然后呢,最后有一个展望啊,呃,这块呢,就相当于是我们看一看啊Java呢,每半年发布一个新的版本,实际上的话呢,虽然说迭代的速度很快,但是整体上的话呢,我们发现呢,也没有伤筋动骨是吧?诶整体上来看,面对新的这种场景,从传统的这个大型企业啊到互联网应用,呃,现在呢,我们说呢,已经开始被云端被容器化了,被模块化了啊,微服务化了。
67:17
啊,这块呢,我们也体现了其他的一些语言当中提到这种函数式编程这样的一些特点,那么Java呢,面对这样的一些冲击啊,这样的一些市场的变化,还有其他的语言的这样的一些冲击啊,怎么办呢?诶只能是不断的去革新是吧,看看其他的一些语言啊,有哪些优良的一些特性,我们给他引进来。啊,针对一些具体的市场的一些变化,我们再推出一些相关的呃,新的一些框架啊,去应对这样的一些需求。啊,应该整体来讲啊,就是我这儿写了一句话叫士不可不宏义啊,任重而道远。大概就这样一个情况啊。好,那么整体的话呢,咱们就把呃,涉及到的G8之后这些版本的新特性呢,咱们就说清楚了。
我来说两句