00:00
集中精力听啊,分开讲,分开学就不好了,继续玩,听各位啊,集中精力没讲完的啊,向下转型有风险吗?我们来分析一下各位。注意各位啊,注意听课啊,集中精力向下转型有没有风险,比如说我写代码注意看啊。这样的animal,嗯嗯,Animal什么呢?现在假如说是A6吧,这已经是A5了啊,A6 a6等于啥呢?等于new一个bird,好,我们答一个问题,这个没毛病吧,来编译一下Java c编译没有任何毛病,Java去运行也不会出问题,是不是好,你看没问题吧,那么接下来。就是说表面上A6是一个什么animal运行的时候实际上是一只鸟儿。一只鸟儿啊,哎,一只鸟儿,那么这块呢,我们向下转型,比如说我写A6,然后前边加一个小括号,这个括号注意啊。
01:12
我给他什么?然后我用KY来接收。然后让Y去抓老鼠,大家思考一下这个程序编译上有没有问题。然后你再分析运行上有没有问题。向下转型有风险吗?Animal a6等于new一个bird。底层实际上是个鸟。非得在鸟,你非得把鸟转成一个猫,让让它去抓老鼠,这个有没有问题,各位你就分析这个程序编译和运行期哪个会出问题,你分析这个程序啊,就分析这个程序,分析以下程序。
02:04
编译的时候和运行的时候有什么区别?或者说分析一下程序编译报错还是运行报错,编译报错还是运行报错。编译出问题,语法错误。语法错误,这证明你还是没有听进去啊同学你这你咋回事呢,没听进去,我说一下来编译器是不是检测到A6啊。对不对。各位好好思考一下,编译器是不是检测到A6 a6编译器只能认为A6是个什么类型,是个animal,对吗?Animal和K之间。有没有集成关系,有没有,有吧,有继承关系,能不能向下转型,能不能,能不能,能不能,各位好,能转型是吧,那么编译器是不是同意了。
03:02
因为编译器只能检测出A6的类型是animal啊,编译器不知道底层是个鸟啊,编译器知道A6这个引用,这个变量是个animal类型,Animal和cat之间存在继承关系,所以它能不能这样代码,代码能不能这样写,可以这样写对不对?哎,可以这样写,注意啊,所以你还是不会分析啊,你还是没有听明白上面这这些东西到到底在讲什么啊,来编译器,编译器检测到什么A6这个引用啊,是什么呢?是animal类型。啊,R animal和K之间存在继承关系,所以可以向下转型啊,编译没毛病啊没毛病,编译没毛病,但是运行的时候会不会出问题。编译没你编一下,你看走你看走走编译走吧,你看没报错,你看是吧,很正常是吧编译,但运行呢,那就有问题了,运行阶段多内存实际创建的对象是是一个什么对象,是一个破的对象。
04:14
啊波的对象,那么在实际运行过程中啊,拿着波的对象转换成K对象。就不行了,因为bird和K之间没有继承关系,大家思考一下,大家看这里我K是我K,我的是我的bird,我bird和K之间没有继承关系,对吧,充其量说我的bird是。继承animal,你的继承了animal,但是K和bird之间并没有任何继承关系,所以这个时候你在运行的时候是不是就会出现一个异常是吧?所以大家看啊,Java c编译通过之后,我们Java运行非常非常重要的异常将伴随您的一生,这个一场太经典了,注意啊,TEST01走。
05:16
这个异常和空指针异常的分量,一样的重量,一样的重量,各位看怎么说的和class bird cannot。不能,不能,Cast是什么意思?Cast是转换成class。看见了吧,说你的鸟转换不成猫。这个异常您必须得记住,您必须得记住啊,这个异常太经典了啊,运行时出现异常,这个异常和空指针异常一样,非常重要,也非常重点,也非常经典吧啊,非常重要也非常经典啊,叫Java class,叫类型转换,Class类是转换类转换异常,类型转换异常啊,那么大家注意啊,再回顾1LANGUAGE pointerion是空指针啊,这个也非常重要啊,非常重要,那么刚才我在这里讲的是什么呢?就是说向下转型有没有风险?
06:36
大家看向下转型有没有风险,有啊。你看。这是你运气好,是不是编译和运行都没问题,是因为你恰好你A5啊,是一个animal animal和cat之间有继承关系,并且你实际上就是一个猫,你就是一个猫,我转成猫没有任何问题,这是你运气好,你运气差的时候,你后台new的new的一个对象你都不知道的啥,你只知道它的类型是一个animal类型,于是乎你拿着animal转成cat,你编译你看就没问题。
07:05
是不是啊,编译没问题,意思是强转都有风险,那当然强转都有风险了,强制类型转换它都存在风险的。啊,强制类型转换都存在风险。啊,那么怎么解决这个风险呢?你看这个程序啊,编译没问题,是不是在运行,你看出错了吧,是不是出错了,第130行说你有问题,一百三一百三一百三一百三,这这有问题,这个有问题。好,这个程序我就注释掉了,各位啊,注释掉了,那么怎么避免这种异常的发生。怎么避免class异常的发生?好各位啊,咱们中间先不休息啊,我们这个呢,先把这个问题解决一下,然后我们再休息好吧。怎么避免class class exception的发生?我在这里需要给大家讲一个运算符。
08:01
来新的内容啊,新的内容。运算符之前见过,叫instance of instance of运算符终于到这个instance of了啊,New运算符是用来new对象的,Instance of来干什么的呢?注意,第一,Instance of运算符可以在运行阶段动态判断,注意啊,我说慢点啊,可以在运行阶段。动态判断引用。指向的对象的类型。第二。Instance of的语法是。括号开始,括号结束啊,引用instance of类型第三第三啊,Instance of运算符的运算结果是,运算结果只能是true或false。
09:13
第四。假设啊。C。C吧,C啊,Instance of k。为处。代表啥?假设以instance of cat为false表示什么?我把这个讲清楚你就理解了。注意啊,前面这个C是个引用,各位啊,C是个引用啊,C是一个引用。C变量保存了内存地址指向了堆中的对象,注意听课啊,C是一个引用,是一个变量,这个变量里边保存了一个内地指向那个对象,如果整个这个括号里边的这个执行结果为true的话,就表示什么呢?就表示你C啊,这个变量里边保存那个内存地地址指向的那个对象,它是一个cat类型。
10:20
听明白了吗?听明白了吗?就是如果这个结果为true的话,就表示什么,表示C引用指向的堆内存中的Java对象是一只。是一个K。如果这个结果返回false的话。就表示C引用指向的堆内存中的Java对象不是一个cat运行阶段动态判断啊。
11:00
Instance of在运行阶段动态判断的啊。运行阶段动态判断有这样的一个功效,有这样的功效,那么请同学们告诉我,这行代码我们是不是要做线下转型?A6转成K,我问你是不是应该先判断一下A6是一个K的时候,我们是不是才去写这个代码。对对,是这个意思。就你外边套个衣服就行了。如果这个为初。我们就走这个代码。如果这个结果为false,我们这个代码就不走了。对吧,如果什么呢?各位如果这个A6。
12:00
他instance instance of,它是一个KA6啊。它是一个K,注意语法,各位我讲的比较快啊,它的语法是什么?是引用,你看这个空格啊,前面有个引用,这个A6是个引用。然后instance of这个关键字要写对,全部小写啊,然后空格后边有一个。这个是个类型。如果A6是一个猫。妥了,我就把它转成猫,那这句话没毛病啊,没毛病啊,很顺利啊,就是说如果A6是如果,就是如果A6是一只。或者是cat。再进行强制类型转换。各位以后啊,大家记住了,记住了,但凡是但凡。
13:03
向下转型。不管你写到哪,都要加这个判断。注意啊,程序员要养成一个好习惯,任何时候、任何地点,对什么对类型进行向下转型时。一定要使用instance of运算符进行判断。啊,这是一个好习惯啊,这是一个好习惯,这是Java规范中要求的,这样可以很好的避免。Class。对,可以避免这个,可以避免这个啊,所以这块呢,我们再去编译,我们再运行,发现我们程序可以编译,可以运行,为什么?因为这行代码没执行,为什么这行代码没执行,因为这个条件不成立。
14:09
为什么这个条件不成立,你可以输出一下。嗯。FOX。False false就表示A1。啊,A6它不是一个K。哎,有,有道理啊,A6确实不是个cat啊。A6是啥呀,鸟啊?对吧,A6是个鸟啊,是不是它不是个cat,所以是。啊,那么这个呢,就是关于向下转型,各位,那么这个案例最主要是给大家讲一个,就是关于多态的基础语法这块有向上转型,也有向下转型,你现在还不理解多肽有什么用啊。
15:05
因为我毕竟还没有讲嘛,是不是,哎,我只是讲了多它的基础语法,当然在这里呢,我也讲了很多东西啊,比如说编译阶段你是怎么着,对不对,运行阶段你怎么着,编译期我们叫静态绑定,运行阶段叫动态绑定。是不是那向上,诶对了各位,我问大家个问题啊,向上转型风险吗。向下转型,它存在风险哈。你看强制强制类型转换,它是不是存在风险呀。那你说。我这个向上转型有没有什么风险?会不会存在什么风险?有没有风险,各位?这个代码有没有风险?这不负类型引用吗?指向子类型对象吗?对吧。这向上转型啊,向下转型不是A5强转吗?这叫向下转型啊。
16:02
负类型转成什么子类型,这不向下转型强转吗?哎,编译过了就没有,所以它不存在风险,它不存在风险啊,不存,因为所有的在在编译器编译阶段就能检查出它的错误。对,就能检测出来animal和cat之间有继承关系的。啊,有错误,会在编译时报错。非常好啊,非常好,我觉得这块的内容呢,呃,是一个很重要的一个语法啊,就是Java中它允许什么呀,负类型的引用指向子类型对象允许向上转,也允许向下向下转,但向下转型的时候你要注意。什么时候做线下转型?各位还记得我刚才所说的吗?做线下转型的原因是啥?是为了调什么?是为了调这个方法,结果这个方法在负类里边没有,是不是这个方法是子类特有的?我在这写一下啊,叫子类特有的方法。才需要强制类型转换。
17:01
啊,子类特有的方法才需要强制转换,或者叫向下转型,如果不是特有的方法,那你没必要。没必要。因为你要用animal去调它的话,底层对象如果是K,它自然会调到K上的move,它不会去调什么呀,Animal上的方法。这就是编译期绑定这个运行期可以绑定动态绑定什么呀,此类对象上的方法,这叫多态啊多套,但是我们要。调用的是这个方法,正好是什么呢?我们子类当中特有的这个开mouse方法在负类里边没有,那此时此刻我们需要做线下转型,向下转型就必须得注意一点,就是我们有一个异常可能会发生,叫class cast exception。为了避免这个异常,我们一定要养成一个好的习惯,而这个习惯就是进行instance of关键字运算符的一个判断,如果它是一个猫,我们就转。对吧,如果是一个猫我们就转啊。
我来说两句