00:00
看一下啊,同学们注意,在我们声明一个变量的时候呢,它的基本语法是VAR。或者是V,然后后面是变量里面变量类型可以写也可以不写。那么我这里呢,做了几点说明,大家看。第一点说明是,声明一个变量时,类型可以省略。那么这个其实在我们JDK8.0就加进去的,JDK8.0实际上也是支持这个类型推导是不是用过吗。用过大家知道为什么JDK8.0有吗?其实不是,本身不是JDK加进去的,而是scanner加进去,导致JDK8.0有这个功能。实际上是由推动这个JDK的发展,那么编译器呢,会自动推导及类型推导,我举一个例子。好,来吧,咱们就举第二个案例啊,同学们。好,我给大家写第二个小案例,呃,我们学东西你放心都能这个呃开了,我还是非常有信心给大家讲的很清晰,很很明白的啊,就是大家这个放心,但是呢,节奏我们要控制,不用太快,也不用太慢,把这个讲清晰是目标。
01:15
好,我们来看看,来做一个类型推导。开类型推导。类型推导。推。推导,OK,这个关它的术语叫类型推导,比如说我给他一个number,给他一个值,比如说呃,Number等于十,你看我没有给类型。我没有给类型,那么这个number呢,是什么类型呢?就是类型这时。这时注意听number number。Number就是in inter类型,那问题来了,说老师它是number是一个类型,你给我证明一下呢,有两个方法可以证明,注意听啊,就是有些时候我们在做开发的时候,你要知道这个类型,有时候你还是心里面要要很清晰的,你怎么知道它是in特类型的第一个方式。
02:09
注意听方式一证明。方式一,我们可以可以可以。可以利用,利用什么呢?Idea的提示来证明。那你说老师我怎么知道他你什么意思不明白呢?看注意听啊,看我写一个per number,他看你看后面是不是就已经出现in了。说明这个idea这个工具它是很强大的,它就直接告诉你是什么类型的。就不需要你再去玩一把,这是第一种方式,就是用它我们就可以看得出来,它会提示我们。会给出提示,给出提示这是第一种方式,第二种方式呢,你也可以这么玩,说老师我你给我说一个方法可以,我可以用这样写number.is instant,然后OK。
03:05
那么这个方法呢,同学们在Java里面学过一个叫做instance of,学过吗?Instance of就这玩意儿,它没有意思,就是instance of就是判断一个类型是不是,一个类是不是一一判断一个对象是不是一个类的类型是不是,哎,好,这个呢也可以判断,那么我们来输出一下,请看效果。情感效果,那么这个时候呢,我们发现它输出了一个什么呢?处说明什么呀,是特两个方法啊方式二。这两个方法大家要有要有个认识,就是说使用。使用什么呢?使用这个is instance of来判断。用这个方式来判断,来判断,这个很明确了,好,这是我们说类型推导这个知识点我们就说完了,类型推导第二点注意听,类型一旦确定以后就不能改了。你看啊说了,有些同学可能会认为说老师诶,你给他一个十,他是in特,那我这样给他一个呢。
04:06
我把这个number拿到过后,我再给他一个小数,不是也可以吗?对不起,不行。因为你这个number一旦上面类型推导以后,它就的的确确就是特了,你不能再改了,你可以修改值,但是不能修改类型。那有些语言是可以的哦,有些同学学过这个动态语言,你给他一个十,它在这地方运行的时候,它就是一个int,等到你给它1.1,它就变成double,变成double型。所以有有些同学学完那个,呃,静态编程语言再去学动态,会觉得非常的不习惯,以前我讲那个我最早的时候,我我参加工作的时候,最早我用的是什么语言呢?最早我用的是C语言,纯C在那个unix下面做了数据通道的,其实我参加工作我都不知道unx是什么。哦,去了过后面试问我,你知道尤I是吗?我说没有听过,我他说你你有个我又不好意思说,我说我说学过一点啊,学会一点,他说他说你知道那个unix下面,呃,那个可以做网络编程吗。
05:13
我说跟Windows差不多吧,那哥们说对,是差不多啊,是差不多,然后很有意思,就是说我参加工作室,其实我跟你讲,我参加工作时比你们比起来就说那个基础差很多,但是有一点我比你们强,就是学习能力太快了,我们当时晚上晚上只要一一加班,人家都都都下班了,我们就是几个小伙子,小伙伴,因为跟我入职的不是我一个人,我们有一帮人一起到那个公司去了,知道吧,然后那个那个那个我们的项目经理跟我们讲这个需求,讲说你们听懂了吗?对吧,那些人都不说话,我也不敢说,我以为他们都听懂了,知道吧,结果等到等到那个呃,领导走了以后,我就问你们听懂没有,他说我没听懂,你有没有听懂啊,我们都没有听懂,大家都很高兴的样子,知道吧,这个人人很奇怪,你们以后就知道韩老师说话很有意思,你看人很奇怪,什么人并不担心自己不懂。
06:05
他担心是什么呢?他担心的是别人懂了他,他跟别人不一样,他压力就很,就变得很大,比如说你旁边有个同学,你一直认为他技术很差,天天睡觉什么,结果他发现你发现他什么都懂,你突然觉得自己很有挫败感,知道吗?智商是不是有问题,我这个啊,所以说这个人不并不怕自己不懂,他是怕跟别人不一样啊,这个人就这样想的,好,我们就说到这里,我把这个写到这啊,同学们就是当一个类型的确定以后,我们就不能够再去改变了,这是静态语言的特色,别人问你这个,这个就是说明它是强制强类型语言,也叫静态语言,为什么叫静态语言,因为我们编译器注意听这句话,编译器它在第七行的时候,编译的时候,它在底层已经把这个类型给写进去了,于是在这他在这个地方再去编译,他就会告诉你对不起,错了。
07:02
编译器它是很聪明的,看2.3这个就不行,好这个下面这个出错,这是第二个细节。啊,这个就会错错误,好的我们来看第三一个注意,需要注意的地方,在声明或者叫定一个变量时,可以使用VAR或者是va来修饰,那么问题来了,它的区别是什么呢?来朋友们,我给大家讲讲它的区别啊,讲讲它的区别,好,我们讲的是第三点啊,它的区别是什么?往这边挪一挪。好,来做一个变量,首先呢,我给大家定义一个变量,比如说是age。啊,等于十好,这个没问题,那么这个时候呢,我把这个A级的值发生了一个修改,大家看这里是OK的,那说明我们这个变量如果用VAR来修饰,说明它这个变量是可以修改的,即修改的。
08:03
即即什么呢?Age是可以改变的,是可以变化的,可以变化啊。可以。改变啊改变。改变的好,但是如果我这样去修饰了一个啊,比如说我有一个呃,这么一个词,比如说这个人的这个什么呢,一个NUMBER2吧,NUMBER2NUMBER。好,我给他一个30,注意看区别不一样了,NUMBER2呢,我也给他一个40,这个就报错了。看这里报错了,他说你分重新给这个VR分配值了就错了,这是什么呢?就是V修饰的。修饰的这个变量是不可以改变的,不可以改变的。好,这两点大家要注意,一个是可变,一个是不可变。那么问题来了,苏老师。
09:01
那为什么开了要设计这两种东西呢?他为什么要设计一种可变的和不可变呢?这就是这个它从性能上考虑的,我说两点啊,第一点呢,如果说呃,我们我们从这个这个角角角度来说明,就是为什么会有VR和这个这个东西,我们来探讨一个话题,就是就是scanner sc设计者为什么为什么呃设计了一个这个VR和这个R这两个类型。我我的理解啊,一般书上也不会说的太多,我的理解是这样子的,第一个呢,就是我们在通常情况下,我们得到一个对象,注意听我们得到一个对象过后呢,往往去只是读这个对象的内容。或者是修改这个对象的属性值,听这句话啊,就是因为在在实际编程中,编程中我们更多的需求是干什么呢?是获取或者构建一个对象啊,或者说获取或者是构建。
10:13
创建一个对象后,对象后我们是干什么呢?是读取,读取该对象的该对象的属性。属性,或者是修改这个对象对象的属性值。但是我们很少去改变这个对象,本身就是从内存里面把它地址进行修改了。第二点。啊,我们把这个,把这个再再写到这啊这个因为这句话有点不够用了,或还有一种什么呢,但是我们很少,但是我们很少去改变这个对象本身,什么叫改变对象本身呢?就是从,就是把这个对象变成一个完完全全的新的对象。
11:02
比如说我原先有个dog,比如啊我我先举个例子,大家看看能不能理解,比如说我这里有一个对象叫我溜了一个dog。好,那么这个dog呢,我可能里面有一个age,我这样去修改,这是可以的dog。这儿写错了。Dog。ADOG啊,我们可能是这样去修改这个值,但是我们很少有这个动作,干什么呢?我们去分配,又给他分配一个新的dog,很少。我们很少,原先执行把一个dog给他了,再把一个dog再给他,很少。你你想一想,你们做编程,你们真的什么时候你们改变过这个对象吗?仔细想想,你们选这个电信项目过后,你们可能会获取到或者构建很多对象,你们可能是把这个对象拿过来过后,要么是改变这个对象的那个属性,比如我,我要改一个改一个,改一个这个数据库里面东西,我把它拿出来过后,构建这个对象,把这个对象取出来过后,改变了它的一个属性,然后再重新写到这个数据库里面去。但是你这个对象本身。
12:07
他并没有创建一个新的对象,是不是很少有这种需求啊?很少很少,你想一想,真的是很少,那所以说所以说既然如此,他就把这个对象搞成这个V的啊,很少这样子的啊,那这时这时干什么,这时。诶,这时我们就可以使用where。那么为什么用它呢?因为效率高。为什么用它,因为。因为这个VR没有线程安全问题。它没有线程安全这个问题,因此效率较高。因此效率。效率高,没有现场安全问题,我不用对它这个同步机制没有了吗?没有的话我肯定效率就高,所以说将来再撕开了里面呢,他推荐大家你们掉线了没有。
13:00
没有啊,所以说在这里我要提醒大家撕开了设计者推荐我们尽量使用VL。撕开了的设计者,设计者推荐,推荐我们尽量使用啊,推荐我们使用VR。好,第三点我写到这里,如果我们有一个对象。如果。啊。如果对象真的要变化,我们的这个对象需要变化,需要变化则变化啊变改变改变改变,则使用什么呢?VR好,我给他举个例子,看上面这个已经证明这个事儿啊,你看这个地方值可以改变,那么这方值呢就不可以改变。那么呃,如果这个是基基本变量是这样子的,如果是对象的话呢,它就这样子的来写一个案例。来写一个案例啊,比如说我这里构建一个class,我就写个dog,这里面呢,我。
14:03
我我就这样子啊,同学们,我就写一个属性,我就写一个属性,我定一个什么呢?我声明声明一个名字这个属性。啊或者年龄吧,年龄再声明一个声明一个声名字。好,写两个,同学们我开始写啊,呃,VAR这个呢,这个我把它整成一个VR可变的。好,那么开始写了,Age。我给他一个int。好,先初始化,这个大家可能现在还有点看不懂啊,这个我先简单说一下,这是我生命的一个什么呢?生命的一个A级属性。A级属性给了一个默认值。给了给了一个默认值这个下划线。啊,下面写默认值。啊,默认下划线,那么因为它是int,其实它就相当于等于零啊,如果说我这如果让它轻松一点,我先写个零。啊,还给他设名一个名字VR,比如说这个小狗的名字呢,我给他来一个。
15:05
好注意听啊,因为你要把这个讲清楚,你就没办法我给他一个空的。这个名字好,同学们看我这个do这两个属性,我指的是VR,现在我来证明一下这个事情来写了啊。比如说我们去构建了一个dog,溜了一个dog。又了一个dog。OK,然后呢,同学们看这个dog本身是V来修饰的,所以说这个dog呢,就不能改变了,你不能这样干,说老师,我再给他一个新的道。这就报错了,因为你原先这个道已经指向了一只狗。现在呢?你又把这个狗指向另外一个,因为这个new dog和这个6DOG显然是两个不同的对象。这个是基本常识,我就不解释了,因为这方就一定会报一个。什么刚才那个错误,看报的就是一个错误。报就这个仇。
16:01
这个错误就是刚才我们类似的这种错误啊,我把它给它复制过来。就说他不能再分配了,不能再分配,但是你看我这个属性,我是VR这个可以改。为我是VR的吗?那你看我这个地方虽然不对,但是我可以改直的来,同学们看do点,我希望把名字改变成原先你是零,我给他一个90。这是一只老狗,你看。对吧,很老,那么名字我给他来一个名字,比如这个叫什么呢?叫小乖小红,哎,咱们取个名字啊,叫小小花,小花狗,哎,小花狗。好了,你看这个可以改的,这个就两全其美,我既可以让你属性改变,同时我还约束你对象本身不改变,那么这个对象本身不改变的话,我就可以用,我就在底层,我的编译器可以在底层进行这个优化,你看它多好。Java里面没有这个玩意,Java里面它因为没有区分,所以它的效率在一定程度上呢,就没有卡拉高。
17:05
啊,说实话这个开如果要推出时间比Java早一点啊,可能这个。假哇,就假巴的就救救命运。不知道怎么回事,其中有一个设计者,我是哪个语言的设计者,是Python还是谁?还是哪个语言设计者?他说了一句话。呃,不是pon是一个框架设计,他说如果我早知道,早知道有斯开了的话,我就不是,我就不去发明这个语言了,知道吗?就是他对这个斯开了还是非常推崇的。SKY这个语言你要学好了,别的语言都比较轻松了啊,好,这个你可以看到,这个可以改变,这是OK的,这个是OK的,这个呢也是OK的,你看它做了个东西,好,现在呢,我们把这个VAR和va和VR我就说清楚了啊,我就把这个说到这里,大家看啊,你这是VR可以改变,你是VR va不可以改变,你这个地方do是v do就不能改变,那么你这个属性是VR的你。
18:04
就可以改变,那我可以两方面都兼顾,当然我问大家一个问题啊,同学们,我问大家一个问题,如果我把这个名字这改成V,请问。这句话是不是马上就报错了?对,非常清晰了啊,非常清晰,因因为你不让他改啊,那就已经不改了,没法改好,道理非常清晰,好,我把这个笔记呢给朋友们先说到这儿来,最后一点,最后一句话,凭什么说我们再研究一下它的底层。什么底层呢?就说哎,你这个Val和VR到底凭什么它就不能改呢?你给我说个原因,告诉大家是这样子的啊,如果你的变量或者属性是用V修饰的,那么它在底层会给这个属性加一个final。Final这个单词我就不说了,同学们已经学过,在Java里面讲过final表示什么,最终最后的一次对不对就代表什么呀,不可改变,是这意思吧,那我们看一下。
19:02
来,同学们,我们给大家再举一个案例,我待会再板书啊,同学们,我先把这个写完,我再板书。VAR DEMO。不着急,咱们这个呢,都会给他讲清晰的啊,讲清楚好我写一个非常简单的案例,好这个他说已经有了DEMO03。好,我现在呢,嗯,简单一点啊,我写一个呃,猫猫类,那么我我干脆这样子啊,简单一点,我就不写这么多了,我就直接在这写吧。啊,在这写。OKOK,好,我把这个打开,给他写两个类型啊,一个VAR name。来我就用类型推导了啊,类型推导直接给他一个呃名字吧,比如说叫做哈,再来一个va啊H给它一个100好同学们可以看到啊,我们编译一下。
20:01
编译完了过后,我们可以翻看一下它底层那个反编译的代码,同学们一下就清楚了,来跑一个。我们先运行一下这个K有没有输出呢?输出来了,我们来看看这个VAR和V到底会有什么不同,打开我们的反编译工具。打开我们反编译工具一看就了然了,诶同学们打开你看啊,快速的走一下,这有一个用户addministrator,哎,这个地方找到我们的075好,Target source好,往下追在这个地方L好,同学们看,哎,同学们现在应该能看懂了,我问大家啊,我问大家一个问题,现在。我们这个地方写了一个VAR demo03,请问它对应生成的几个class文件两个,是不是这两个啊,这两个,那么我再问大家一个问题,再问大家一个问题,我们如果只是关心这个VRDEMO03,我们应该看的是,呃,上面这个还是下面这个,上面这个对吧?因为我们刚才讲了这个其实是他做了一个包装,其实将来这个类是它的那个半身类,因为现在你没有写半生类,所以它相当于说也生成了一个空的,但你这个object的对应这个类呢,就它我们进去一看就了然了,哦,明白了,同学们看你看到没有,看清楚没有,你看这个name它没有final,而这个age有了final,看没有,好,这就把这个东西说清楚了,好,他加了final,加了final了,好,同学们,我把这个呢给大家板述一下,我们就休息一会啊,快速的把这个变量使用说明给各位朋友板述一下。
21:46
OK。变量使用说明,呃,刚开始呢,有点慢,有点慢不是问题啊。后面我们有基础过后呢,我们这个讲课速度会呃提快一点,有现在大家还不太清楚他的一些基本的东西。
22:02
好,变量的语法说明注意事项,老师讲了这么一点对吧?哎,变量有什么特点呢?哎,这个你以后要给他答上来咯,好VR诶,通过反编译我们可以看到底层代码1234,那么我把这个代码也给同学们好,演示的案例代码也给大家放到这里,大家一看呢,就很清晰了,来,我们写了两个案例,一个案例是。这个啊,写了三个案例啊,第一个案例DEMO,那么这个地方呢,我就干脆直接把它放到这里来啊,放到这里来。好,我我尽量给大家放到一个比较适当的位置啊,适当的位置这是第一个啊,这边呢,我们讲了一个这个第三个案例也给大家放到这里来,好的,这个案例呢,我们是在这个DEMO02里面讲的。好老师呢,就把这个案例呃搁在这个地方来,大家一看应该对应上了,好最后一个呢,我们讲了一下他版编译的这个底层代码,我们做了一个呃说明啊,做了一个说明,那么这个是我们的零三。
23:14
零三呢,我在这儿呃,写了一个案例,然后它对应的对应的这个底层的这个反编译,反编译啊,编译的这个代码呢,是这样子的好。好是哪个呢?就它我就简单的把这个粘过来就行了,好放这。放这好,同学们一一比较就知道,哦,原来是因为你这加了这两个。你一个加了一个班的,一个没加,就对应我们这上面这两个。好,截取一段视频。
我来说两句