黑马程序员:面向对象三大特征之一:多态的介绍
来源:互联网 发布:招plc编程人 编辑:程序博客网 时间:2024/05/17 00:05
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
多态:面向对象的第三个特征,前两个特征为封装、继承
可以理解为事物存在的多种体现形态动物:猫 狗
猫 m = new 猫();
动物 m = new 猫();
1.多态的体现
父类的引用指向了自己的子类对象 Animal a = new Cat(); //类型提升,向上转型
2.多态的前提
必须是类与类之间有关系,要么继承(extends),要么实现(implements)
通常还有一个前提:存在重写
3.多态的好处与弊端
好处:多态的出现提高了程序的扩展性
弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员
4.多态的应用
Animal a = new Cat(); //类型提升,向上转型
//如果想要调用猫的特有方法时,如何操作?
强制将父类的引用,转成子类类型:
Cat c = (Cat)a; //向下转型 与基本数据的强制转化方式一样,千万别出现父类对象转成子类类型
c.catchMouse();
public static void function(Animal a){a.eat();if (a instanceof Cat) //instanceof关键字 a引用的实例。 这整句话的意思:判断a引用的对象是否是Cat对象{Cat c = (Cat)a;c.catchMouse();}else if (a instanceof Dog){Dog d = (Dog)a;d.kanJia();}}
多态中成员函数(非静态)的特点 Fu f = new Zi(); f是引用型变量
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有则编译通过,反之则编译失败
在运行时期:参阅对象所属的类中是否有调用的方法 new Zi()为堆内存中的对象
总结:成员函数在多态调用时,编译看左边,运行看右边
注(面试中可能会遇到):
多态中成员变量的特点是无论编译和运行,都参考左边(引用型变量所属的类)
多态中静态成员函数的特点是无论编译和运行,都参考左边。静态绑定
静态绑定:
静态方法在哪个类就用哪个类中的该静态方法
class Fu{int num = 5;void method1(){System.out.println("fu_method_1");}void method2(){System.out.println("fu_method_2");}static void methodStatic(){System.out.println("fu_method_static");}}class Zi extends Fu{int num = 3;void method1(){System.out.println("zi_method_1~~"+num);}void method3(){System.out.println("zi_method_3");}static void methodStatic(){System.out.println("zi_method_static");}}class Demo{public static void main(String[] args){Fu f = new Zi();f.method1(); //输出zi_method_1~~3 重写了Fu类中的method1方法f.method2(); //输出fu_method_2//f.method3(); 这句语句要写上的话编译就会出错,因为引用型变量f所属的类为Fu,而Fu类中并没有method3方法f.methodStatic(); //fu_method_staticSystem.out.println(f.num); //5}}
静态绑定示例:class Base {static int i;Base() {add(1);System.out.println(i+"Base()");}static void add(int v) {i += v;System.out.println(i+"Base().add");}void print() {System.out.println(i);}}class MyBase extends Base {MyBase() {//super(); 隐式语句add(2); //add方法被静态绑定,所以用MyBase中的add方法}static void add(int v) {i += v * 2;System.out.println(i);}}public class Demo {public static void main(String[] args) {go(new MyBase());// System.out.println();}static void go(Base b) {b.add(8); //是引用b类型的add方法,即Base的add方法// b.print();}}}结果:1Base().add1Base()5MyBase().add13Base().add
多态的应用:主板
/*define board interface standard*/interface PCI{public abstract void open();public abstract void close();}/*create a MainBoard*/class MainBoard{void run(){System.out.println("mainboard run");}void usePCI(PCI p) //PCI p = new NetCard(); 多态的应用{if (p!=null){p.open();p.close();}}}/*create a net card implements pci*/class NetCard implements PCI{public void open(){System.out.println("网卡打开");}public void close(){System.out.println("网卡关闭");}}/*create a sound card implements pci*/class SoundCard implements PCI{public void open(){System.out.println("声卡打开");}public void close(){System.out.println("声卡关闭");}}class MainBoardDemo{public static void main(String[] args){MainBoard m = new MainBoard();m.run();m.usePCI(null);m.usePCI(new NetCard());m.usePCI(new SoundCard());}}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
- 黑马程序员:面向对象三大特征之一:多态的介绍
- 黑马程序员:面向对象三大特征之一:继承的介绍
- 黑马程序员---面向对象的三大特征是什么??
- 黑马程序员------面向对象的三大特征性
- 黑马程序员—面向对象特征之一多态
- 面向对象三大特征之一多态
- 黑马程序员:类,对象,面向对象以及三大特征
- 黑马程序员 Java基础知识总结-面向对象三大特征
- 黑马程序员_面向对象简述及三大特征
- 黑马程序员----面向对象之(二)----三大特征
- 黑马程序员----面向对象三大特征之继承
- 黑马程序员--OC基础--面向对象三大特征
- 黑马程序员(三)面向对象的三大特征封装、继承、多态
- Java学习--面向对象的三大特征之一
- Object-C 面向对象的三大特征之一 封装
- Object-C 面向对象的三大特征之一 继承
- Object-C 面向对象的三大特征之一 多态
- 面向对象的三大特征之一封装
- 开源加密解密库比较
- Python安装、配置图文详解
- java转义符同样的代码在cmd下和eclipse下运行结果不同
- viewDidAppear中一定要调用[super viewDidAppear]
- 百度地图开发BMapManager.init()报错
- 黑马程序员:面向对象三大特征之一:多态的介绍
- 【数据结构之排序2】直接插入排序
- ios 天气接口的获取 json实现
- iperf
- 可执行文件的结构和加载
- 【Java工程师之路】[2-2.2]数据库设计和ER模型
- 一道php笔试题
- 如何执行一个mysql的sql脚本文件
- setbuf关闭流缓冲