Java学习——面向对象之多态

来源:互联网 发布:宝山行知外国语学校 编辑:程序博客网 时间:2024/05/16 09:07

前言

前面给小伙伴们分享的是面向对象的封装、继承,这里给大家分享是Java面向对象三个特性最后一个多态。什么是多态呢?

多态

父类的引用指向子类的对象。他们一定存在继承关系。只有方法具有多态特征,属性没有多态。

实现多态的条件

  • 要有继承;
  • 要有重写;
  • 父类的引用指向子类的对象。向上转型。

实现多态的技术

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所有引用对象的实际类型,根据其实的类型调用其相应的方法。

多态的作用

消除类型之间的耦合关系。

多态的好处

  • 可替换性(substitutability):多态对已存在代码具有可替换性。
  • 可扩充性(extensibility):增加新的子类不影响已存在的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
  • 接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同的接口,有子类来完善或者覆盖它而实现的。
  • 灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。
  • 简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

Java中多态的分类:

在Java中,多态大致分为以下几种情况:

  1. person为父类,student为子类。那么:person p=new student();
  2. fliable为接口,bird为实现接口的类,那么:fliable f=new bird();
  3. fliable为抽象类,bird为继承fliable的类,那么:fliablef=new bird();

多态时需要说明p声明为父类的引用,但他实际为子类引用。但是他只能调用父类中的方法。如果子类中的方法覆盖了父类方法,那么将调用父类方法(虚方法调用)。接口多态也是同样的,也许你会问,如果f要调用自己的方法,那岂不是出错了?其实这里也是方法的覆盖,因为实现接口的子类肯定会实现接口中的方法, 所以此种情况下调用的是bird中的方法。但是如果bird有一个方法在接口中没有定义,那么f不能调用。

多态的注意事项

//左边            //右边Animal c = new Cat();

1.编译器看左边:在编译的时候不管你右边是什么类,只有左边的Animal类能编译通过就不会报错。在编译器去调用方法时,所有方法必须在Animal中声明中,否则找不到方法,编译失败。

2.运行期看右边:实际调用的过程中,系统会根据你右边是否有该方法,而去执行。如果没有则执行左边的父类方法。

instanceOf关键字

用来判断,instanceOf左边对象是否属于右边类或子类的实例。
根据类层次一般分出上下,最上面的是祖先类Object类一层一层往下,向上转型是默认的。
instanceOf一般用于向下转型。
实例对象instanceOf某个类名

举例说明

//使用多态来创建了一只猫Animal cat = new Cat();//判断是否是动物if(cat instanceOf Animal){    System.out.println("猫是一只动物");}   

在判断父类的引用指向子类的实例时,我们可以进行强制类型转换。

Animal amin =new Cat();if(anim instanceOf Cat){    //强制类型装换,向下转型    Cat cat = (Cat)anim;}

当对不具有相同类型的对象进行强制类型转换时,Java运行将会抛出java.lang.ClassCastException的异常。