一、多态性的概念

  多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物。

二、多态的使用

  (1)多态一般用于方法参数或者方法返回值,特别当一个方法中功能是人和狗共有的,这时候利用多态性,将参数设为父类,就可以少写一个方法,而且对于代码来说也比较容易拓展。下面举个例子:

class Animal{

    public void skill(){
System.out.println("动物拥有属于自己的技巧。。。");
}
} class Person extends Animal{
@Override
public void skill(){
System.out.println("人拥有属于自己的技巧。。。");
}
} class Dog extends Animal{
@Override
public void skill(){
System.out.println("狗拥有属于自己的技巧。。。");
}
} public class Polymorphism { public static void main(String[] args) {
Person person = new Person();
Dog dog = new Dog();
//不使用多态性
System.out.println("======不使用多态性======");
person.skill();
dog.skill();
//使用多态性
System.out.println("======使用多态性======");
animalSkill(person);
animalSkill(dog);
} public static void animalSkill(Animal animal){
animal.skill();
}
}

运行结果:

======不使用多态性======
人拥有属于自己的技巧。。。
狗拥有属于自己的技巧。。。
======使用多态性======
人拥有属于自己的技巧。。。
狗拥有属于自己的技巧。。。

  通过结果我们可以看出使用多态的优势,就是当你的子类越来越多的时候,不使用多态的话,代码拓展起来很麻烦,如果使用多态的话,只要是这个类的子类都可以调用,完成相应的功能。

  (2)多态的向上转型:首先我们来说一下多态的向上转型,从上面的例子我们可以看出,animalSkill()方法的参数是Animal类,它是Person类和Dog类的父类,这个时候就相当于向上转型,向上转型是自动将Person类和Dog类转为Animal类的,向上转型在平常的日常开发中是经常使用的。

Animal animal1 = new Person();
Animal animal2 = new Dog();

  (3)多态的向下转型:多态的向下转型这个操作是需要我们自己手动强转的,所以这个操作就比较危险,因为父类有好多子类,是不能随便强转为任意子类的,否则在运行时会报类转化异常的错误。

public class Polymorphism {

    public static void main(String[] args) {
Animal animal = new Animal();
Person person = (Person) animal;
person.skill();
} }

运行结果:

Exception in thread "main" java.lang.ClassCastException: cn.edu.nyist.Animal cannot be cast to cn.edu.nyist.Person

  造成这种现象的原因是因为父类会有很多的子类,是不能强制转换为任意子类的,所以这里推荐先将该子类向上转型为父类,然后再将该父类向下转型为该子类

public class Polymorphism {

    public static void main(String[] args) {
Animal animal = new Person();
Person person = (Person) animal;
person.skill();
} }

运行结果:

人拥有属于自己的技巧。。。

  (3)instanceof关键字的使用:这个关键字主要是用来解决类转化一场这个错误的,它主要是判断一个实例是否属于对应的类或者父类的实例,属于的话返回true,不属于返回false

  

public class Polymorphism {

    public static void main(String[] args) {
Animal animal = new Person();
if (animal instanceof Person){
System.out.println("向下转型成功");
Person person = (Person) animal;
person.skill();
}else {
System.out.println("向下转型失败");
}
} }

运行结果:

向下转型成功
人拥有属于自己的技巧。。。

  所以以后在将一个类进行向下转型的时候,首先使用instanceof关键字判断该实例是否为对应类或对应类的父类的实例,是的话,再进行向下转型,否则就不进行转型,这样程序就不会出错了。

最新文章

  1. C#代码示例_定义类
  2. 架构模式对象与关系结构模式之:标识域(Identity Field)
  3. [转]C#将image中的显示的图片转换成二进制
  4. C# 常用加密处理
  5. 每天一个小算法(Heapsort)
  6. Reactor模式,或者叫反应器模式
  7. Shell 获取当前时间
  8. ES6 JavaScript Promise的感性认知
  9. 搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境
  10. File对象的常用方法
  11. forEach( ) map( ) for( in ) for ( of )
  12. TP5.0实现无限极回复功能
  13. 201521123002 《Java程序设计》第6周学习总结
  14. BZOJ1258: [CQOI2007]三角形tri
  15. Python_语法和界面设计
  16. GP工具环境变量名称列表
  17. zip&ftp命令
  18. CRM WEB UI 02搜索跳转到详细界面
  19. Ubuntu 16.04 安装搜狗输入法
  20. 一次dns缓存引发的慘案

热门文章

  1. Learn day6 模块pickle\json\random\os\zipfile\面对对象(类的封装 操作 __init__)
  2. python机器学习实现K-近邻算法(KNN)
  3. Git clone 克隆Github上的仓库,速度慢?
  4. Antisymmetry
  5. 解决nginx中js修改不生效的问题
  6. 手写Koa.js源码
  7. KOA2 笔记
  8. python数据分析 Numpy基础 数组和矢量计算
  9. 虚拟机中安装Centos 7
  10. 你还再为下载jar包慢而烦恼吗?Maven配置阿里云镜像