黑马程序员_日记5_Java多态
来源:互联网 发布:执行方案范文知乎 编辑:程序博客网 时间:2024/05/17 07:59
——- android培训、java培训、期待与您交流! ———-
Java多态
一、多态的概念
多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
二、多态的体现
- 父类的引用指向了自己的子类对象。
- 父类的引用也可以接收自己的子类对象。
- instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)
- 千万不要出现这样的操作,就是将父类对象转成子类类型。我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。
示例如下:
class Cat extends Animal{ public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); }}class Dog extends Animal{ public void eat() { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); }}class Pig extends Animal{ public void eat() { System.out.println("饲料"); } public void gongDi() { System.out.println("拱地"); }}//-----------------------------------------class DuoTaiDemo2 { public static void main(String[] args) { //Animal a = new Cat();//类型提升。 向上转型。 //a.eat(); //如果想要调用猫的特有方法时,如何操作? //强制将父类的引用。转成子类类型。向下转型。 ///Cat c = (Cat)a; //c.catchMouse(); Animal a = new Animal(); Cat c = (Cat)a; function(new Dog()); function(new Cat()); } public static void function(Animal a)//Animal a = new Cat(); { a.eat(); /* if(a instanceof Animal) { System.out.println("haha"); } else */ if(a instanceof Cat) { Cat c = (Cat)a; c.catchMouse(); } else if(a instanceof Dog) { Dog c = (Dog)a; c.kanJia(); } }}
三、多态的前提
- 必须是类与类之间有关系。要么继承,要么实现。
- 通常还有一个前提:存在覆盖。
四、多态的好处
- 多态的出现大大的提高程序的扩展性。
五、多态的弊端
- 虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
六、多态的特点
在多态中成员函数的特点:
- 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
- 在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
六、多态的应用
需求:
电脑运行实例,
电脑运行基于主板。
如图所示,设计一个PCI接口,让网卡,声卡等设备实现PCI,利用多态就可以满足需求,提高了主板的可扩展性!
interface PCI{ public void open(); public void close();}class MainBoard{ public void run() { System.out.println("mainboard run "); } public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。 { if(p!=null) { p.open(); p.close(); } }}class NetCard implements PCI{ public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); method(); }}class SoundCard implements PCI{ public void open() { System.out.println("SoundCard open"); } public void close() { System.out.println("SoundCard close"); }}/*class MainBoard{ public void run() { System.out.println("mainboard run"); } public void useNetCard(NetCard c) { c.open(); c.close(); }}class NetCard{ public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); }}*/class DuoTaiDemo5 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); }}
0 0
- 黑马程序员_日记5_Java多态
- 黑马程序员_Java学习日记26_高新技术5
- 黑马程序员_java学习日记_数组
- 黑马程序员_java学习日记_集合
- 黑马程序员_日记10_Java包
- 黑马程序员_java学习日记_Java高新技术_枚举
- 黑马程序员_java学习日记_Java高新技术_反射(一)
- 黑马程序员_java学习日记_Java高新技术_反射(二)
- 黑马程序员_java学习日记_Java高新技术_泛型
- 黑马程序员_java学习日记_Java高新技术_反射
- 黑马程序员_java学习日记_Java高新技术_枚举
- 黑马程序员_java学习日记_Java高新技术_网络编程
- 黑马程序员_学习日记_Java基础_多线程
- 黑马程序员_java学习日记_网络编程
- 黑马程序员_java学习日记_交通灯管理系统
- 黑马程序员_java学习日记_面向对象
- 黑马程序员_java学习日记_交通管理系统
- 黑马程序员_java学习日记_银行调度系统
- A Bug's Life-HDU-1829
- Linux Shell 文件重定向
- 动态代理(Proxy)
- 可执行文件(ELF)格式的理解
- Add Two Numbers
- 黑马程序员_日记5_Java多态
- 每天一个面向对象陷阱,一个算法,一个小看法
- 可执行程序的组成
- 利用WebSphere Edge Server构建冷轧系统负载均衡
- UVa 806 - Spatial Structures(DFS)
- Delphi IDHTTP用法详解
- OpenCL-- 统计给定单词在文本中出现次数
- C语言 编写程序数一下1到100的所有整数中出现多少次数字9
- leetcode #1 Two Sum