@@ -452,9 +452,10 @@ java里的多态主要表现在两个方面:
452
452
453
453
这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:
454
454
455
- ![ img] ( https://images2015.cnblogs .com/blog/1189312/201707/1189312-20170701155536086-1897896282 .png )
455
+ ![ img] ( https://cdn.mianshigee .com/upload/note/thumbnails/202202211611552259 .png )
456
456
457
- 注意:我们不能使用一个子类的引用来指向父类的对象,如:![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701155839586-923083573.png ) 。
457
+ 注意:我们不能使用一个子类的引用来指向父类的对象,如:
458
+ ![ img] ( https://cdn.mianshigee.com/upload/note/thumbnails/202202211611556958.png ) 。
458
459
459
460
这里我们必须深刻理解引用多态的意义,才能更好记忆这种多态的特性。为什么子类的引用不能用来指向父类的对象呢?我在这里通俗给大家讲解一下:就以上面的例子来说,我们能说“狗是一种动物”,但是不能说“动物是一种狗”,狗和动物是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!!
460
461
@@ -482,23 +483,23 @@ java里的多态主要表现在两个方面:
482
483
483
484
就以上述的父类Animal和一个子类Dog来说明,当父类的引用可以指向子类的对象时,就是** 向上类型转换** 。如:
484
485
485
- ![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701162630508-961507659. png )
486
+ ![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2MjYzMDUwOC05NjE1MDc2NTkucG5n?x-oss-process=image/format, png )
486
487
487
488
** 2. 向下类型转换(强制类型转换),是大类型转换到小类型(有风险,可能出现数据溢出)。**
488
489
489
490
将上述代码再加上一行,我们再次将父类转换为子类引用,那么会出现错误,编译器不允许我们直接这么做** ,** 虽然我们知道这个父类引用指向的就是子类对象,但是编译器认为这种转换是存在风险的** 。** 如:
490
491
491
- ![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701162926477-3857975. png )
492
+ ![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2MjkyNjQ3Ny0zODU3OTc1LnBuZw?x-oss-process=image/format, png )
492
493
493
- 那么我们该怎么解决这个问题呢,我们可以在animal前加上(Dog)来强制类型转换。如:![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701163408383-2003626729. png )
494
+ 那么我们该怎么解决这个问题呢,我们可以在animal前加上(Dog)来强制类型转换。如:![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2NDIyOTg5OS0xMDU1MTkwNzc0LnBuZw?x-oss-process=image/format, png )
494
495
495
- 但是如果父类引用没有指向** 该子类的对象** ,则不能向下类型转换,虽然编译器不会报错,但是运行的时候程序会出错,如:![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701164229899-1055190774. png )
496
+ 但是如果父类引用没有指向** 该子类的对象** ,则不能向下类型转换,虽然编译器不会报错,但是运行的时候程序会出错,如:![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2NTEzMzI4OS03MTc0MzkzNjAucG5n?x-oss-process=image/format, png )
496
497
497
498
其实这就是上面所说的子类的引用指向父类的对象,而强制转换类型也不能转换!!
498
499
499
500
还有一种情况是父类的引用指向** 其他子类的对象** ,则不能通过强制转为** 该子类的对象** 。如:
500
501
501
- ![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701165133289-717439360. png )
502
+ ![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2NTEzMzI4OS03MTc0MzkzNjAucG5n?x-oss-process=image/format, png )
502
503
503
504
这是因为我们在编译的时候进行了强制类型转换,编译时的类型是我们强制转换的类型,所以编译器不会报错,而当我们运行的时候,程序给animal开辟的是Dog类型的内存空间,这与Cat类型内存空间不匹配,所以无法正常转换。这两种情况出错的本质是一样的,所以我们在使用强制类型转换的时候要特别注意这两种错误!!下面有个更安全的方式来实现向下类型转换。。。。
504
505
@@ -508,7 +509,7 @@ java里的多态主要表现在两个方面:
508
509
509
510
我们来使用instanceof运算符来规避上面的错误,代码修改如下:
510
511
511
- ![ img] ( https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701165626571-501228254. png )
512
+ ![ img] ( https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvMTE4OTMxMi8yMDE3MDcvMTE4OTMxMi0yMDE3MDcwMTE2NTYyNjU3MS01MDEyMjgyNTQucG5n?x-oss-process=image/format, png )
512
513
513
514
利用if语句和instanceof运算符来判断两个对象的类型是否一致。
514
515
0 commit comments