00:00
好,那这个说完以后,为了让大家更好的去理解我们刚才说的这个向下转型,包括说这个ince这个关键字,我下边呢,出一个这个练习练习,或者说呢,我们再见一下这样的几种情况,就是方便大家去对上面这个内容呢,进行一个更好的理解,我们呢,可能会出现这样的一些问题啊,比如说像这种问题一的这种情况。问题一的情况,我们可以这样来写,就是让他这个编译通过,运营时候呢,不通过编译时通过,然后这个运行时呢,不通过,这个我们看会出现什么情况,比如说咱们刚才呢,我们就new,我再重新举个例子哈,我new了一个woman new了一个woman,我把这个woman呢付给一个person。P3了,P3有没有没有行,然后呢,我们这个P3,我们现在呢,给他去想强转成一个慢这个我写个M。
01:11
M1有了,M2 m2也有了,诶没有吧,那M3,然后这个时候的话呢,我们肯定是要加上一个这个慢的,像这个像这种情况话呢,我们是不是编译就过了,编译过了,但是运行时候呢,命时候过不了,就是此时呢,咱们这个woman和这个慢呢,是不是他俩之间没有任何关系啊啊我们执行这肯定就挂了,行这个呢,我们就class卡except这个很好理解了,这个呢就是编译过运行不一定过,编译时候呢,主要看的这个语法上呢,你看这个类型是不是都能够通得过去,这个呢是可以通得过去的。没有问题,这呢是第一种情况,大家写的时候呢,要小心这个咱们出于这种情况呢,说要加个CE了啊,然后再来一个问题二,问题二的话呢,我们这个叫编译通过运行的时候呢,也通过看看能不能理解,我现在呢有一个你什么呢,有个man woman都可以有个woman吧。
02:16
我把这个woman呢,我付给一个object没问题,都太清,然后呢,我把这个object呢,我给一个person o不OK。编译运行可以吧,可以吧,可以的。可以的。首先没报错,大家呢,脑子里边你浮现这样个图,我这呢是叫woman,呃,这个woman的上面一层呢,其实是一个person了,Person再上一层呢,咱们是这个object,我现在new了一个woman,我把这个woman呢付个object向上转型吧,或者叫多性,没问题,我转成object以后,我现在把这个object呢再强转成个person。
03:11
肯定可以呀,我强转成woman都没问题呢,我为我我强转成person是不是更可以呀?你你本身都是个女人,我能够强转成个woman,那你是个女人,她就一定是一个人呐,所以我强转成person也一定是OK的。能理解这个事儿吧。这个去体会一下这个事儿这样理解,那你看这个啊,我在上面再举个例子,我new一个person,我一个person,我把它声明成一个person。这叫P4,然后呢,我这呢,再把这个强转成一个慢,这个行不行,反正是编译过了,运行能过吗。
04:01
不让过。又挂了102号挂了。为啥对我knew的是一个person啊,你这时候knew的可是person啊,你person的话呢,怎么new的person怎么可能会去给它强转成子类呢?你想想,如果要是强转成了,如果要行啊,编译过了,运行假设也过了,那我问你,我要M4,我去调这个叫is smoking,嗯,或者我调这个叫earn money,你运行都过了,你你是不是调earn money也该过呀?那你有这个功能吗?没有,包括你这个属性,你person有吗?没有啊,我内存中我用了个person,我哪加载过你子类那些属性啊。对吧,所以想想也不合适,也就是说呢,咱们其实呢,通过这样两个字例子,大家也看到了,我们呢,这个要想你这个向下转型能行啊,要能行,你一定不是拗的这个对象。
05:05
你一定要么你用的就是它的对象,所以你再给他转回来了,要么你用的就是这个的下边的这个子类的对象。想想对,你用的是他这对象,我转上去了,我再给你转回来,那肯定可以,我用的是你这个类的子类的对象,我转上去了再转回来也可以,你用了一个父类对象,负类对象呢,根本就没有你这个子类特有的功能,你给它下下爪,那不肯定就错了吗?这个体会一下这个事儿,所以这样呢也是不行的。距离。句例体会一下,那这呢是我们说的这个编译运行都通过,这个是可以的啊,咱们在开发中呢,是可以这样写的,问题二。问题三问题三,编译不过运行过。
06:02
啊,不对,说反了哈,编译过运行不过编译过,运行也过,还差一个编译也不过,编译不过,那运行就别想了,那编译都不过,我直接扭了一个。Woman。我就比较生猛的直接给他就付给骂了,我这肯定不行,咱们这种呢,你右边往左边附呢,右边这个的new的东西必须得是这个的子类对你才能附,那现在呢,这个麦和woman是不是没有任何子负类关系啊对,那你这个负肯定不对,就相当于我要个man,你负了一个另外一个类型的对象了,还不是子类,那绝对不可以,就说了叫type missmash类型不匹配,它俩没有任何关系,这个,那再或者呢,就比如说我这呢,声明的是个字符串,然后你右边给我扭了一个date日期,Date呢,我们现在导一包。
07:06
这个date呢,跟我们这个string呢,也是没有任何关系,就像这里边的man和woman一样,那所以呢也叫type mismatch,所以这个呢也是错误的。哎,就编译就不过。也就是说呢,我们能够去赋值,再次体会一下这个等号它的意思,这叫赋值符号了,就是右边呢跟左边类型是一样的,或者你右边呢,左边一个子类,这都是可以的,对于我们这个引用数据类型来讲。那实际上像我们刚才看到这个不对,我们呢倒是有办法呢,让它骗过编译器,让他骗过编译器是很简单的,那你就是把你new的这个date,你呢先把它转化成是它的一个父类,比如说是object。转换成负了以后呢,然后呢,你再给它整成一个string。
08:00
这上写错了,就是上面这个事呢,编译不过,但是下边这个事的话呢,编译是能过,咱运行过不了,因为我们把这个编译器给骗过去了。我们把这个new date呢,我先付给一个object,这是一个多态了,然后呢,我们再通过这种线下转型呢,给你转换成string编译器呢,认为OK,语法上没问题,但是呢,实际执行的时候呢,仍然是错误的,但是这个呢,其实你骗过他也没有任何意义,反正变,反正运行也过不了,这就没啥意思了,总之呢,就是通过这个呢,大家体会一下,不相关的两个类呢,是不可以复制的。好,这就说清楚了,那关于这个呃,强转这个事儿的话呢,我们又提到了这样的几个问题啊,大家呢,再去体会一下,那么至此的话呢,在咱们关于这个多态性的这个知识层面的内容,就算是完事,就是我们昨天讲的一部分是核心的一个内容,下面呢讲的是另外一个事儿,或者呢,再换一个角度来说,昨天讲的呢,是向上转型,今天呢,讲的是向下转型,我们再开发中用的更多的呢,那一定是向上转型,向下转型呢,用的其实很少。
09:06
用的很少,我们一般用的话呢,也都是用这个父类中声明的那些功能,我只用父类中声明的那些功能,然后真正运行的时候呢,是你子类重写的,那不就意味着是多肽吗?所以昨天讲的呢,那绝对是从开发角度来讲,这个呢是占到90%以上的使用率,而这个呢,剩下10%可能都不到,我们才会去考虑向下转型,用的很少,比较少,但是呢,知识上来讲,大家也得会啊,那就好比是昨咱们昨天呢,这不也讲了一下这个就这个这个举例就这animal animal的话呢,咱们在这里边,这不生命animal,所以我里边调呢,都是负类种生命的功能,你要说想体现体会一下我们这个of的使用,那你可以在下边呢,你再去判断一下,说如果呢,你发现这个animal啊,你叫instance of是一个dog,你要发现它是一个狗,那你这块你就给他转一下。
10:04
啊,我们这个animal你就转化成是一个狗,转化成狗以后呢,你就可以掉这个狗所特有的这个方法了,狗特有的方法啊,狗也没定义特有方法了,那你可以定义一个,比如说狗特有的方法是啥呀。叫叫已经写了看门看门看门怎么写,写一个我室道,这是纯纯那个汉式的英语是吧?行,就这样忍了,这个就要看门行,这个呢是狗所特有的这个功能,当你强转以后,我们就可以呢在这去掉了说地点叫哎哎,Watch到。这样就能掉了,但是一般呢,我们开发中用这样的功能都很少,咱们要用通常都是你父类中有的,那其实呢,就是体验为多态性的这个使用了啊,这种用的比较少,那当然呢,你要想用的话也可以用,我们这块也确实这样掉了,执行的话呢,也能够出来,这不就开门了,行,知道这个事儿就可以了。
我来说两句