Java OOP之多态

来源:互联网 发布:淘宝网抓绒布料 编辑:程序博客网 时间:2024/06/05 03:10

面向对象三大特性 : 继承、封装、多态。

什么是多态? 可以理解成 对象的多种形态。(细胞的分化其实就是一种多态)

在Java语言中,我觉得可以从下面两个方法来理解多态的概念。(班门弄斧下^_^)

一、引用多态

1)父类的引用可以指向本类
2)父类的引用可以指向子类对象

注意 : 不能使用子类的引用指向父类对象。

        //父类的引用可以指向本类的对象        Animal obj = new Animal();        //父类的引用可以指向子类的对象        Animal obj1 = new Dog();        // 这是错误的,不能使用子类的引用指向父类对象        //Dog obj2 = new Animal();

二、方法多态

1) 创建本类对象时,调用的方法为本类方法
2)创建子类对象时,调用的方法为子类重写的方法或者继承的方法(非静态)。

注意 : 父类的引用不能调用子类独有的方法。如果想调用子类独有的方法,要先判断是否可以转化成子类引用。详见这里

描述一个场景 :
创建一个Animal类,并定义个eat()方法,在该方法中输出”动物具有吃的能力”;
创建一个Animal的子类Dog类,重写eat()方法,在该方法中输出”狗是啃骨头的” 还有playDog()方法
创建一个Animal的子类 Cat类

        //父类的引用可以指向本类的对象        Animal obj = new Animal();        //父类的引用可以指向子类的对象        Animal obj1 = new Dog();        // 父类的引用可以指向子类的对象        Animal obj2 = new Cat();        // 这是错误的,不能使用子类的引用指向父类对象        //Dog obj2 = new Animal();        // 创建本类对象时,调用的方法为本类方法        obj.eat();        // 创建子类对象时,调用的方法为子类重写的方法或者继承的方法        obj1.eat();        obj2.eat();      // 下面这个也是错误的 引用变量 在编译阶段 只能调用 其编译阶段时类型所具备的方法,但是在运行时则执行它运行时方法      //obj1.playDog();

输出结果:

动物具有吃的能力狗是啃骨头的动物具有吃的能力

备注: 继承是实现多态的基础

注意 : 对象的属性不具备多态性。也就是说,当父类和子类的属性出现同名时,用父类引用指向子类对象时,用父类引用访问成员属性,得到的是父类的属性值。

最后一点 : 如果是静态方法,那么直接调用引用类型的方法(作为了解)进一步解释下,也作为笔记吧,在Java中,方法区分为静态和非静态。静态区的成员(方法和变量) 跟类是静态绑定的,也就是说只能通过类名去访问。而在非静态区,是动态的(this、super)去调用方法的。总结出来就一句话 : 多态中,静态参考引用所属即可

demo地址: http://download.csdn.net/download/qq_18505715/9847912

原创粉丝点击