黑马程序员:面向对象三大特征之一:多态的介绍

来源:互联网 发布:招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
原创粉丝点击