Skip to content

Commit f6f1362

Browse files
committed
resolve pic problem in 多态
1 parent 3bb0926 commit f6f1362

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

docs/java/basic/1、面向对象基础.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,9 +452,10 @@ java里的多态主要表现在两个方面:
452452

453453
  这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:
454454

455-
![img](https://images2015.cnblogs.com/blog/1189312/201707/1189312-20170701155536086-1897896282.png)
455+
![img](https://cdn.mianshigee.com/upload/note/thumbnails/202202211611552259.png)
456456

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)
458459

459460
  这里我们必须深刻理解引用多态的意义,才能更好记忆这种多态的特性。为什么子类的引用不能用来指向父类的对象呢?我在这里通俗给大家讲解一下:就以上面的例子来说,我们能说“狗是一种动物”,但是不能说“动物是一种狗”,狗和动物是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!!
460461

@@ -482,23 +483,23 @@ java里的多态主要表现在两个方面:
482483

483484
  就以上述的父类Animal和一个子类Dog来说明,当父类的引用可以指向子类的对象时,就是**向上类型转换**。如:
484485

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)
486487

487488
  **2. 向下类型转换(强制类型转换),是大类型转换到小类型(有风险,可能出现数据溢出)。**
488489

489490
  将上述代码再加上一行,我们再次将父类转换为子类引用,那么会出现错误,编译器不允许我们直接这么做****虽然我们知道这个父类引用指向的就是子类对象,但是编译器认为这种转换是存在风险的****如:
490491

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)
492493

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)
494495

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)
496497

497498
  其实这就是上面所说的子类的引用指向父类的对象,而强制转换类型也不能转换!!
498499

499500
  还有一种情况是父类的引用指向**其他子类的对象**,则不能通过强制转为**该子类的对象**。如:
500501

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)
502503

503504
  这是因为我们在编译的时候进行了强制类型转换,编译时的类型是我们强制转换的类型,所以编译器不会报错,而当我们运行的时候,程序给animal开辟的是Dog类型的内存空间,这与Cat类型内存空间不匹配,所以无法正常转换。这两种情况出错的本质是一样的,所以我们在使用强制类型转换的时候要特别注意这两种错误!!下面有个更安全的方式来实现向下类型转换。。。。
504505

@@ -508,7 +509,7 @@ java里的多态主要表现在两个方面:
508509

509510
  我们来使用instanceof运算符来规避上面的错误,代码修改如下:
510511

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)
512513

513514
  利用if语句和instanceof运算符来判断两个对象的类型是否一致。
514515

0 commit comments

Comments
 (0)