父类引用指向子类对象是什么意思 痛定思痛。 2022-05-16 12:45 203阅读 0赞 在java的多态中,经常会看到父类的引用对象指向子类的对象,一开始很迷茫,因为按照之前所学的知识,父类的引用对象指向自身对象或者子类的引用对象指向自身对象都不难理解,因此为了方便理解,下面举了一个例子:水杯和水壶的比喻。 ![1196131-20170723113247434-1166606947.png][] 下面的一段代码来实现这个比喻: ![复制代码][copycode.gif] 1 public class Kettle { 2 public Kettle(){ 3 System.out.println("水壶容量有2升"); 4 } 5 } 6 7 public class Cup extends Kettle { 8 public Cup(){ 9 System.out.println("水杯容量为0.5升"); 10 } 11 } 12 13 public class Test { 14 public static void main(String[] args) { 15 Kettle k = new Kettle(); //父类的引用对象指向自身:把2升水倒入到水壶中,不会溢出 16 Cup c = new Cup();//子类的引用对象指向自身:把0.5升的水倒入到水杯中,不会溢出 17 Kettle k1 = new Cup(); //父类的引用对象指向子类:把0.5升的水倒入到水壶中,不会溢出 18 Kettle k2 = (Kettle)c; //父类的引用对象指向子类中继承父类的那一部分对象:把水杯中的0.5升水倒入到水壶中,不会溢出 19 Cup c2 = (Cup)k; //子类的引用对象指向父类对象,报错,不能转换类型:水壶里面的水不能倒入到水杯中,会溢出 20 Cup c3 = (Cup)k2;//相当于Cup c3 = (Cup)(Kettle)c,子类的引用对象指向子类中继承父类的那一部分对象:把水壶中0.5升的水倒入到水杯中,不会溢出 21 } 22 } ![复制代码][copycode.gif] 上面的代码运行结果如下: ![复制代码][copycode.gif] 1 水壶容量有2升 2 水壶容量有2升 3 水杯容量为0.5升 4 水壶容量有2升 5 水杯容量为0.5升 6 Exception in thread "main" java.lang.ClassCastException: mycom.Kettle cannot be cast to mycom.Cup 7 at mycom.Test.main(Test.java:9) ![复制代码][copycode.gif] 其中报错的哪一行就是Cup c2 = (Cup)k,由于无法转换类型。 下面来改写一下代码:方法的引用操作 ![复制代码][copycode.gif] 1 public class Kettle { 2 public void holeWater(){ 3 System.out.println("水壶有装水的功能"); 4 } 5 } 6 7 public class Cup extends Kettle { 8 public void holeWater(){ 9 System.out.println("水杯也有装水的功能"); 10 } 11 public void drinkWater(){ 12 System.out.println("水杯可以拿来喝水的功能"); 13 } 14 } 15 16 17 public class Test { 18 public static void main(String[] args) { 19 Kettle k = new Cup(); //父类的引用对象指向子类 20 k.holeWater(); 21 k.darinkWater(); //报错 22 } 23 } ![复制代码][copycode.gif] 首先,要实现多态,必须有三个条件:父类引用、子类对象、方法覆盖,在上面的程序中,k调用holeWater方法可以正常编译,因为满足三个条件,而后面的drinkWater方法由于在父类中没有,因此在调用时,会报错,没有满足“方法覆盖"的条件,多态实际上是一种机制,在编译时刻,会生成一张虚拟表,来记录所有覆盖的方法,没有被覆盖的方法是不会记录到这张表的.若一个父类引用调用了没有覆盖的子类方法,那么是不符合该表的,那么编译时刻就会报错. 在执行程序的时候,虚拟机会去这张虚拟表中找覆盖的方法,比如引用中实际上存的是一个子类对象引用,那么就会去找子类中的相应的覆盖的方法来执行。 综上所述,用父类的引用对象指向子类对象,可以隐藏各个对象不同的细节,专注于共同的属性,这就是[面向对象][Link 1]的思想。 [1196131-20170723113247434-1166606947.png]: /images/20220516/c1124795b81d40e7b81133e225ef9252.png [copycode.gif]: /images/20220516/6b70e39ac59f477ab97f7e35001d853c.png [Link 1]: https://www.baidu.com/s?wd=%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YYuyckrHmdrHf3nvm3P1Ih0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHDLPWmLPjn4nWnLn1Tsrjfkrf
相关 多态应用:父类引用子类对象的常见问题 在Java等面向对象编程语言中,多态是一种重要的特性。当父类引用子类对象时,可能会遇到以下几个问题: 1. **类型不匹配**: 当父类引用子类对象时,如果子类对象不是 布满荆棘的人生/ 2024年09月19日 04:15/ 0 赞/ 3 阅读
相关 多态实现挑战:在Java中,如何保证父类引用指向子类实例? 在Java中,通过以下方式可以保证父类引用指向子类实例: 1. **继承(Inheritance)**: 父类(Superclass)定义了一些方法和属性,并将它们声明 妖狐艹你老母/ 2024年09月10日 08:48/ 0 赞/ 20 阅读
相关 父类类型的引用指向子类的对象 父类类型的引用指向子类的对象,注意以下几点: 一、该引用只能调用父类中定义的方法和变量; 二、如果子类中重写了父类中的一个非静态方法,那么在调用这个方法的时候,将会调用 秒速五厘米/ 2024年03月31日 10:15/ 0 赞/ 47 阅读
相关 【C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 ) 文章目录 一、public 公有继承 - 示例分析 1、类型兼容性原则 2、类型兼容性原则应用场景 二、类型兼容性原则 - 示例分析 青旅半醒/ 2024年03月26日 23:56/ 0 赞/ 44 阅读
相关 父类引用指向子类对象 // // Father.h // OC基础学习 // // Created by 麦子 on 15/6/7. // C 待我称王封你为后i/ 2022年08月05日 05:10/ 0 赞/ 156 阅读
相关 父类引用指向子类对象 父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。 Animal ゞ 浴缸里的玫瑰/ 2022年08月05日 05:04/ 0 赞/ 148 阅读
相关 父类引用指向子类对象是什么意思 在java的多态中,经常会看到父类的引用对象指向子类的对象,一开始很迷茫,因为按照之前所学的知识,父类的引用对象指向自身对象或者子类的引用对象指向自身对象都不难理解,因此为 痛定思痛。/ 2022年05月16日 12:45/ 0 赞/ 204 阅读
相关 父类引用指向子类对象 最近学习装饰者模式的时候经常用到这个概念: 假如我们有一个父类Coffee 还有一个它的子类Suger那么我们将 Coffee coffee=new suger()就叫做父类 灰太狼/ 2022年05月09日 08:40/ 0 赞/ 230 阅读
相关 向上转型:父类的引用指向子类的对象 package 向上转型; /\向上转型:子类的对象赋值给父类的引用(父类的引用所指向的属性是父类的属性) ,如此就可调用父类类的方法,而不可以调用自身的方法,但如果父 蔚落/ 2022年04月16日 00:44/ 0 赞/ 176 阅读
还没有评论,来说两句吧...