多态使用的细节和注意事项

面向对象编程-多态
多态注意事项和细节讨论
com.hspedu.poly_.detail_ 包: PolyDetail.java
多态的前提是:两个对象(类)存在继承关系
多态的向上转型
1)本质:父类的引用指向了子类的对象
2)语法:父类类型 引用名=new子类类型();
3)特点:编译类型看左边,运行类型看右边。
可以调用父类中的所有成员(需遵守访问权限),不能调用子类中特有成员;
最终运行效果看子类的具体实现!

 1         //向上转型:父类的引用指向子类的对象
 2         //语法:父类类型 引用名 = new 子类类型()
 3         Animal animal = new cat();
 4         //看输出结果
 5         /**
 6          * 向上转型调用方法的规则如下
 7          * 1.可以调用父类中的成员(方法和属性),但是要遵循访问权限
 8          * 2.但是不能调用子类的特有的成员
 9          * 3.在编译阶段,能调用哪些成员,由编译类型来决定的
10          * 4.运行时,看animal(引用名) 的运行类型,现在animal的运行类型是子类cat
11          * 所以会先去查找子类cat是否有animal后面调用的对象,如果子类有就输出
12          * 没有就往上转型(父类)查找
13          */
14         animal.eat();//输出猫在吃鱼...
15         animal.cry();//cat cry()小猫在叫唤...
16         animal.run();//在跑步.....
17         animal.Sleep();//在睡觉.....
18 
19     }

 

多态的向下转型
1)语法:子类类型引用名=(子类类型)父类引用;
2)只能强转父类的引用,不能强转父类的对象
3)要求父类的引用必须指向的是当前目标类型的对象
4)当向下转型后,可以调用子类类型中所有的成员

 1         //向下转型的规则:
 2         /**
 3         animal.catchMouse()//出现错误:由于抓老鼠是猫特有的属性,所以向上转型无法调用
 4          * 那该如何去调用抓老鼠这个方法呢?就需要进行向下转型;
 5          * 对猫进行向下转型,把animal这个父类所指向的cat子类向下转换为cat类型
 6          * 1)语法:子类类型 引用名=(子类类型)父类引用;
 7          * 注意:在进行向下转型时,要求父类的引用必须指向当前目标类型的对象
 8          * (这里也就是说:想要把animal这个父类所指向的cat子类向下转换为cat类型的前提)
 9          * (前提是之前的animal这个父类引用名指向的是cat)
10          */
11         cat cat01 = (cat) animal;
12         cat01.catchMouse();//结果输出猫抓老鼠;

 

属性没有重写的说法,属性的值看编译类型

instance  Of 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型【举
例说明】

 

 1 package com.polymorhic;
 2 
 3 public class dome {
 4     public static void main(String[] args) {
 5 
 6         BB bb = new BB();
 7         System.out.println(bb instanceof BB);//true
 8         System.out.println(bb instanceof AA);//true
 9 
10 //        AA aa = new AA();
11 //        System.out.println(aa instanceof  BB);//flase
12 //        System.out.println(aa instanceof AA);//true
13         //aa编译类型是AA.运行类型是BB
14         AA aa = new BB();
15         System.out.println(aa instanceof AA);//true
16         System.out.println(aa instanceof BB);//true
17 
18     }
19 }
20 
21 class  AA{}
22 class BB extends AA{}

 

posted @ 2022-03-07 17:46  捞月亮的渔夫  阅读(71)  评论(0)    收藏  举报