00:00
好,那么上午的话呢,咱们是讲完这个专题了,叫基本数据类型变量间的自动类型提升啊,这呢叫自动的,那下边呢,我们看这个专题的二杠六哈,基本数据类型变量间呢,叫强制类型转换,它呢属于上一个过程的一个逆运算啊,诶为什么叫逆运算呢?你看咱们前面呢提到了,比如说是一个少的类型的变量,然后我们把它转换成int的话呢,诶自动就上去了,但是现在要是一个int类型呢,你想把它转成是个short,这个时候呢,我们就要用到下边这样一个操作了。这儿呢,就是咱们要讲的这个专题啊,二杠六啊行,那通过咱们这个课件这个维度呢,也能看得到啊打开啊强制转换,这里边就提到了,说将3.14呢,复制到int类型会发生什么呢?我们说编译的就失败了啊,因为不让这样去赋值。那我们如果说就想把啊,比如说这是一个double类型的值,哎,就想把它转成一个容量小的一个类型的变量,行不行啊,这就我们现在要讲的强制类型转换。啊,所以呢,它的一个啊,上面这个过程呢,我们称为呢,叫自动能应提升啊,咱们说容量小的自动的转化成容量大的啊,就好比是呢,大家比如说一开始工作的时候呢,租的一间小房子是吧,或者呢,就是纯粹的一套房子里边这一间了啊,包括现在大家住的话呢,甚至都是一间里边的一个啊好几个人都住是吧?诶当你这个呃,工作好几年以后呢,有机会呢,买一套房子啊显然的这个面积呢就更大了,然后把你这些家具呢,都可以放到你这个大房子里边,是很轻松的一件事情。
01:24
所以呢,诶你把这个东西少的放到这个大的这个房子里边儿呢,诶直接就放进去就可以了,那如果说呢,工作几年之后呢,想去创业。哎,创业的话呢,有极大的概率,实际上呢,都会失败是吧?啊结果创业失败了,把房子也给抵出去了啊,你得需要呢,把你这些东西呢都清走是吧,最后呢,你又租到这个小房子里了,这时候呢,大房子里边这个东西呢有点多,这时候你再想把它放到这个小房子里的时候呢。就得扔点东西了。是吧,就成这样的情况了,哎,那么上面这个呢,就好比是呢,叫自动类型提升。哎,下边这个呢,就是想,呃,好比是呢,叫强制类型转换。
02:00
那就这样一个情况啊,OK,来咱们看一看这个里边呢,涉及到的相关的这个操作该如何呢去实践。新建一个Java文件。啊的一个TEST44啊。啊,CTRLCCTRLSCTRLV啊保存一下。这样子啊。在这儿。好在这儿我们去写了代码,诶那么在前面这个呢,我们写的时候呢,说这个啊说诶词这个呢,是用来测试呢,叫自动音提升的啊,那我们这块呢,对应的啊CTRLC一下。啊,在这我写一句啊,这个呢是四呃,用来测试强制类型转换。哎,这样的一个操作好,那么具体这个转换的话呢,呃,是一个什么样的意思呢?刚才我们其实也举了这个例子了,比如说现在我们一个double类型的一个值,那这个叫第一吧,这个值的话呢,比如说我们就写成这个12了。啊,我就写成是个12了啊,这个呢,其实存在一个叫自动类型提升。
03:03
那这个大家应该都知道啊,12呢是一个整数啊,然后把这个整数呢,我们赋给一个double波形的值了,现在的话呢,我想把这个第一的这个值呢,给它转换成是一个整形的一个值,比如说就像转换成是int类型的,这个呢叫IE直接呢,你要这样写肯定编译就报错了。看一下。嗯,这个我们先去做一个编译。哎,这呢改成是四啊编译好这块呢,其实我们这个第十行说呢,不兼容的类型,从double呢切换成int呢,会损失精度啊,就是不行,这这叫编译失败。哎,这个,哎诶。诶编译失败啊,但是呢,语法上呢是不允许的,但如果说我们就想做这样一个操作怎么办呢?其实也可以,那我们就得这样去写了,在这个第一。啊,它的前面呢,加上一对小括号啊,这个小括号里边呢,指明你要强制转换为的啊数据的类型,那我们想转换成int,那我们就写个int就可以了。
04:07
哎,这样就OK了。那这个时候呢,我们顺便呢,把这个结果呢,给他打印一下。哎,这个时候我们直接打印下这个I2啊就可以了,行,那我们再去做这个编译。哎,没问题啊,然后呢,我们去运行一下。整错了啊。次。好,这时候呢,我们这个12呢,就打出来了。诶,这个呢,就是我们要讲的这样的一个具体的这个操作了啊行,那我们再举个例子,比如说现在我有个long类型的这个L1啊,这个值呢是个123,我想呢,把它转换成是一个少的类型的叫S1啊还是这样写的话呢,仍然是编译不通过。啊,这个大家都能猜得到啊。哎,编译呢是失败的,那需要怎么写呢,我们S2一下啊,直接呢,在你这个L1的前边,哎,指明一个呢,叫做SH。那这样写的话呢,就没有问题。啊,那同样的,我们把这个结果呢,给大家打印一下。
05:00
哎,这个呢,是一个SR啊,保存来做测试。编译。啊运行,哎,这个结果难看也没有问题。好这呢,就我们说的这样的一个场景啊,诶就是我们这样的去使用,我在这呢,写一个这样的一个规则。说呢,这个,呃,如果。啊,需要将容量大的变量的类型转换为。哎,容量小的变量的类型的话啊。哎,需要呢,使用哎强制类型转换。哎,那么第二点强制类型转换。哎,转换啊,需要呢,使用啊叫强转服。哎,这个强转弧呢,就是我们刚才说的这个小括号啊,然后呢,在小括号内。诶,小框内啊指明啊,要转换为的诶数据类型。
06:03
哎,OK啊,这个呢就比较清楚了,行,那这个要说完之后呢,大家你看哈,我这个操作能不能理解啊,这个呢,再来一个这个练习了,这个练习呢是这样子的啊,我现在有个in的形呢,我叫I3啊这个值呢是个12。这个值的话呢,我们想把它转换成是个float类型,哎,我叫F1,实际上呢,直接这样写是不是就行。这就没问题是吧。行啊,这叫自动运行提升吧。嗯。哎,那既然说到这儿了,我顺便问一下,咱们这个打印结果的话呢,这个F1结果是多少。哎,是12还是多少。对,一定要注意哈,这个呢是12.0,哎,这个有个点零啊。来这个我们先看下它。编译啊,运行啊,12.0啊,这个稍微注意一下啊,行,那这呢不是咱们想说的事儿啊,我想说的这个事儿,哎,你说我要是在这个float的F2这块啊,你把I3的转换成它,我在前面能不能加一个float呢?
07:04
哎,这个可不可以呢,就是诶编译能不能过呢。哎,对,这个编译呢,是可以过的。你看是吧,诶如果我们运行的话呢,相应的这个结果你打印也是12.0,只不过呢,就是这个操作本身就可以自动实现了,哎,没有必要特意的加而已,但是你要加了,加了也没关系,是吧?啊这个我们说一下啊也是啊编译。可以通过啊,只不过呢啊可以省略是吧,哎,这一段小括号而已啊。行,这个呢,就是我们想强调的这样的一个问题。啊,大家呢,如果在开发中需要啊,有这样的一个类型的强转的话呢,我们就这样去使用就行,自动类型提升啊,这个容量小的哎,往右边这块走啊,对应的这个关系呢,就是我们前面讲的这个式子啊,从右边啊,从左往右的话呢,这叫自动型提升,自动就实现了,如果从右往左的话呢,叫强制类型转换。啊叫强类型转换好,那么强制类型转换的话呢,刚才我们这个举到一个例子啊,说你把这个大房子东西呢,往小房子这块呢去,呃,转换的时候呢,如果你这个大房子里边东西本身也很少。
08:13
啊,那你这时候呢,放到这个小房子的时候呢,呃,也能盛得下,其实没有任何事儿。但是呢,有可能会出现你这个大房子的东西呢,特别的多,超出了这个啊房间的可这个承载的范围了,你再往这里边儿呢,去塞的时候,是不是可能就得扔点东西是吧,那么这个所谓的扔的东西,其实在我们这个呢,就提到了,可能会出现。哎,精度损失的问题了。哎,那下边呢,我们就来说明一下这个精度损失的问题啊。哎,这个呢,也是我们上面要说的这样一个点,先写到这儿吧,说那个呃,强制力行转换啊。诶,强制类型转换过程中可能导致精度损失。
09:00
好,下边我们来给大家举这个例子啊呃,精度损失的。啊,这个。啊,例子是吧,比如说第一个例子啊,这个呢,其实很好去举啊,比如我们这有个double的,我这个叫嗯。这个咱们叫第二了啊,这个呢叫12.3。明显的你会发现呢,我这带一个点三了,说我现在把这个第二呢,我就想转换成是个int类型,那毫无疑问这个点呢就有问题了。哎,点后边这个啊,这呢,我就写一个in。啊,那么此时呢,如果我们去打印这个S4啊,S4结果是多少。12。嗯,哎,四是,哎看一下。建议。行行,那这个是12行,那我这个要改成12.9呢。22,所以呢,这儿呢,遵循的不是四舍五入了。哎,对,这个呢,就是纯粹呢叫截断。啊,截断你多余的这个数据,哪怕你是点九九那也不行,全部都是截断操作啊。
10:02
好,这是我们说的一种精度损失的场景,OK,然后呢,哎,其实还有一种啊这种场景。啊,这个我们来个举例二啊。比如说啊,我现在有个英特型的,我叫I5,这个值呢是128。哎,我呢想把这个I5呢,转换成是一个少呃BAT类型的。啊,那很显然这个128呢,超出了be的范围了。那你说这时候。会怎么着?对感情会报错了是吧?啊,那实际情况会不会报错呢?看一下。没有。哎,没有啊,诶为什么没有报错呢?其实这时候你想啊,首先啊,你这是个int类型,你转换成bad呢,呃,你直接不写它,那不行啊,那你现在来说就转化成BAT,我使用强转符了,而且写的是BAT,从语法上来讲呢,没有任何问题。哎,既然语法上没问题,它的编译呢,就正常是没有问题的。啊,那这时候大家可能会关心,那到底运行的结果是多少。
11:03
走起,你看。会吧,是不是有点接受不了?啊,这就好比你出去买东西一样,呃,一结账多少钱呢?说128,说你这个我身上最多就127块钱了,要不你给我少一块钱啊,这个买东西的时候说行吧,是吧?啊,127了,可能大家就会想说128,那不行,说要不你来个127是吧。结果发现不是啊,负的128啊,哎,那这个事儿该怎么解释啊?对,这个要解释的话呢,咱们得放到这儿来说了。诶,你得从这个底层这个128它到底是怎么存的啊,这个角度呢去解释啊,咱们先简单的呃说这么两句啊,这儿呢,我呃使用了一个计算器。啊,这个计算器呢,我觉得挺好用的啊,这是我特意的,这是WINDOWS7里边这个计算器,咱WIN10的跟那个WIN7的不太一样啊啊我就特意的把WIN7这个,呃,计算器呢,给他又安装了一下啊好,那么在这呢,有这种好多模式啊,诶咱们呢是编程的模式。
12:08
哎,这呢,咱们对应的是一个int类型是吧,Int类型的你看一共是32位吧。现在咱们有个数量叫128是吧。这个128呢,呃,它底层如果用二进制来表示的话呢,它长这个样子。啊,这个你先暂时知道啊,咱们一会儿讲那个专题的时候再说好,那么我现在呢,要把它强转成是一个BAT啊,你说这个强转操作呢,它是怎么做的呢。你看这是一个字节,这是一个字节,这是一个字节,这不就是四个字节吗?咱们所谓的这个啊,强转实际上呢,是一种截断操作,也就是说呢,我们高位的这些呢,就不要了。啊,这是高位啊。就跟咱们这个小学做运算一样,这是这个第一位。相当于呢,就是我们把这个高位呢,都截断了啊,只留着你这样的一个字节,就是这个数。就他。而对于咱们这个二进制存储数据来讲呢,这个最高位呢,实际上是符号位啊,所以呢,128呢,你看这个零零表示就正数,但是你要截断完以后,这个时候你发现的这个最高位呢,突然变成一了,那就会导致我们这个数呢,瞬间就变成了一个负数,而这个负数恰好是负的128。
13:17
啊,但是至于说你说为什么负128长这样呢,还是那个意思啊,咱们讲到这个专题的时候呢,诶大家就能明白了,到时候咱们给大家说这个事儿啊好了,诶这时候我们就知道呢,这呢也算是一种京都损失的这个场景。OK啊,那么关于这个强制零转化呢,咱们就说完了啊,那么在相应的开发当中啊,你就举个例子啊,你比如说我们这个方法,这个方法呢,这个叫参数啊,也是个变量了,那如果说有一个方法的参数呢,就要求是一个int类型的,但是我们现在呢,拿到的是一个long类型,哎,那既然人家需要int类型,你是个long的,你就必须呢给它强转,强转以后呢,诶附到这儿才行。哎,这呢,就是它的一个具体的应用场景啊,那么换句话说啊,如果说呢,这个啊,回头我们遇到一个方法啊,这个光说的话,还不如我们写一个呢啊比如说啊,啊,我这写一个public啊,咱也叫static,咱也叫个word吧。
14:07
哎,这呢,我写一个方法名,这个方法里边呢,它要求传一个是一个。哎,是不是这个number是吧。好,那么我们再去调用这个方法的时候呢,呃,假设呢,你现在有的是一个。其实这块我们说就我就可以写到这儿了啊,这个呢,实际开发的一个举例啊,好,你比如我现在是一个bad类型,我是一个B2啊,是一个12这个数啊,有可能这个数呢,是来自于用户呢,从前端页面中啊给我们发这个发送过来的,总之呢,这个数呢,拿到了,拿到以后呢,现在我们要是调用这个method的方法的时候呢,你把这个B2往这一放。相当于就把这个数呢,是不是就付给了这个数了。对,那就类似于是我们定了一个number,是拿这个B2呢负的值,这个呢,是不是叫自动的应提升。哎,这就是他的一个应用场景,那如果这里边呢,你做了系列的一个操作,咱这就简单一点啊。
15:00
我就做一个输出吧。诶,加上一个number啊,保存好我们看一下这个效果。愿意。进行好这个你看number这个12呢就打出来了,这个呢就是自动类型提升的一个场景,那那那另外一个情况呢,你可能这块拿到的是一个浪类型的啊,假设呢是这个L。嗯。L几了L2啊好,这个值呢,哎,可能它也是12。我这样写的啊,但是呢,此时呢,你这个method,我要是把这个L2呢,往上一扔,它是不是就报错了。你相当于把这个long类型是不是复制给这个int类型。他就报错了。编译那就挂了,哎,说那个不兼容的类型啊,这呢是在51行啊这个位置。啊,这样的情况好,那要想这个位置不报错。怎么办?哎,对,强制性转化了编一步通过啊。啊,怎么着呢?你在这个。
16:02
啊,L2是吧,在这个前面你调的时候呢,是不是得强转一下。哎,这样就可以了啊,保存。编译,那这时候就过了,那运行,那这不是这个12就也出来了。诶就是这个意思,行,这呢,就我们实际开发当中,诶给大家呢,举了一个场景,那这块呢,大家可能看不太懂,诶说这个方法定义为什么这样写呢,这个呢先不要具体去研究,咱们讲面向对象的时候呢,这个事儿我们就会一点点啊带着大家去剖析。啊,刚开始大家学Java呢,可能会觉得难,难其实就难在呢,第一天上课你就突然遇到了很多你不太熟的东西,这些东西呢,咱们后边呢,慢慢的都会展开来说啊,现在的话呢,你就先诶刻意的记一下啊,像这个事儿的话呢,你也不用练,你就知道呢,诶知道这么个意思就行,后边都还会再讲啊。好,那么关于这块这个知识点呢,咱们就说到这儿了,然后呢,我们再看一看这块的这个课后的练习题。哎,你看这块有这个问题啊。嗯,这块啊,说如下的这个操作呢,能否通过编译啊,先看第一个这呢是少的类型的,这样的写能吗。
17:04
是不是不可以呀?那因为这个我们讲过这个二呢是int类型,那运算完以后呢,应该是int类型,这样就不行了是吧。好,那么接着往下看这个。哎,同样的道理是吧,哎,这个应该是个int类型的吧。哎,所以不行,这个呢。哎,这个是可以的。啊in的类型,然后呢,强转成这个BAT啊可以再过来。好,这呢是叉类型的一个小A,这是它,这是它。这样呢?诶注意这块这个零的话呢,是可以省略的。可以吧?可以是吧。哎,这不是差类型,加上个int类型,结果是个int类型。In的类型呢,再加上一个。Flow的类型,结果呢,是一个flow的类型,把float类型赋给一个double类型。可以。嗯,好,这个。
18:04
这个B上这个SS加B。这个怎么感觉怪怪的是吧?啊。怎么样?不行啊,因为那是一个int类型。没问题是吧,嗯,OK啊行,那这个的话呢,咱们不是上午讲这个知识点的时候呢,也说过这个事了。OK啊。
我来说两句