java三大特性之多态的认识,以及多态的实际应用(一)

简介: java三大特性之多态的认识,以及多态的实际应用(一)

首先,什么是多态?

我们应该从什么角度来理解多态?其实,我们不妨把多态理解成一种事物的多种存在形态,


比如,猫和狗都属于动物的子类,可以想象成为动物,而动物又可以变成猫和狗。

多态是将子类对象当作__父类__对象来看待,也就是子类对象可以放入父类中 引用。


为了充分理解多态,我们可以从以下这几个方面来理解多态。


第一、从多态的体现方面:我们使用多态的时候,创建的是父类的引用,开辟的是子类的空间,由于没有开辟父类的空间,所以是父类的引用指向子类对象,并不是真正的父类自己创建了对象,而且父类对象的引用还可以作为函数参数来接收子类对象哦!


第二、多态实现的前提:必须是类与类之间要有关系,要么继承,要么实现,存在覆盖,其实就是有抽象函数。


第三、从多态的好处:大大提高程序的可拓展性


第四、多态的应用:1.父类对象的引用指向子类对象,其实本质上是一个向上转型,就像int转成double一样,儿子穿了一身爸爸的衣服,扮成了爸爸。2.但变成了爸爸之后,只能使用爸爸特有的技能,儿子怎么能够使用自己本身的技能呢?这时候就需要向下转型,脱下伪装,将父类对象的引用强转成子类类型,就可以使用子类特有的技能了。


第五、多态的弊端:提高了拓展性,但是只能使用父类的引用访问父类的成员。


多态的三个用法:

  • 1, 对象类型不变,
  • 2, 只能对引用调用其引用类型中声明的方法
  • 3, 在运行时,会根据对象的实际类型找子类覆盖之后的方法

下面程序可以很好的解释什么是多态:

一个A类,定义了m1和m2方法

A类的子类B类,覆盖了m2(),添加了m3方法

多态就是 可以把B类对象放入A类的引用里面,就是把子类放入父类引用,A a =new B();

通过这个引用a能调用m1和m2方法,不能调用m3方法,因为A类中没有调用m3,

a. m2是会调用B类中的m2,B类中的m2重写了A类中的m2,所以找的就是B类覆盖之后的m2.


为便于理解程序已加详细注释说明:

   package d11;
    class duot{
      public static void main(String[] args) {
        /*多态的使用
        Animal类,定义了eat()和sleep()方法,
        Animal的子类Dog类,覆盖了sleep类,添加了shout()方法
        多态就是 可以把(dog类)对象放入(Animal类)的引用里面,
        就是把子类放入父类引用,Animal a =new Dog();
        通过这个引用a能调用eat()和sleep()方法,不能调用shout()方法,因为Animal类中没有调用shout(),
        a.sleep()是会调用dog类中的sleep(),dog类中的sleep()重写了Animal类中的sleep,
        所以a.sleep()找的就是dog类覆盖之后的sleep().   */
        Animal a =new Dog();
        a.eat();//This is a eat()
        //a.shout();//不能调用shout方法,会报错,Animal类中没有调用shout方法;
        a.sleep();//sleep 3 hours
          /*类型转换
          子类引用赋值给父类引用,可以直接赋值。
          父类引用赋值给子类引用,必须_强制类型转换,
          保证编译通过,但是运行时可能发生 类型转换异常。
           */
          //(编译时不出错,运行时可能发生类型转换异常)
          //这个强制类型转换其实是给编译器看的,使他不理会这个异常,
          //因为Animal类中并不一定装的是这个dog对象。只是可能,
          //如果换成Animal a =new Cat();则就会编译不报错运行报错类型转换异常
          Dog d =(Dog)a;//引用间的赋值;需要强制类型转换,
          d.shout();//这时候就能调用shout方法了,
          //instanceof关键字
          /*Instanceof   是一个二元运算符组成一个布尔表达式;
          使用方法: 引用   instanceof  类名  
          就是判断该引用所指向的对象 和后边的这个类名是否兼容;
          可以把instanceof形象的比喻为  是不是    是就是真,不是就是假;
           */ //例:a里面装的是一个狗
          System.out.println(a instanceof Dog);//true    a是一个狗
          System.out.println(a instanceof Cat);//false  a不是一个猫
          System.out.println(a instanceof Animal);//true  a是一个动物
          //instanceof关键字可以规避上面的风险,先判断a里面装的是不是狗 
          //是去做强转,绝对不会出错,否则不强转;
          //所以上面程序可以改为:
          if (a instanceof Dog) {
            Dog d =(Dog)a;
            d.shout();
          }
      }
    }
    class Animal{
      public void eat(){
        System.out.println("This is a eat()");
      }
      public void sleep(){
        System.out.println("sleep 6 hours");
      }
    }
    class Dog extends Animal{
      public void shout(){
        System.out.println("Wang Wang !!!");
      }
      public void sleep(){
        System.out.println("sleep 3 hours");
      }
    }
    //测试类型强转,和instanceof关键字,
    class Cat extends Animal{
    }

其中程序中用到了instanceof关键字,Instanceof 是一个二元运算符组成一个布尔表达式;

可以把instanceof形象的比喻为 是不是 是就是真,不是就是假;


在强制类型转换之前可以用instanceof判断,从而规避类型转换异常的发生;


这里简单说明一下我对多态的认识,下一篇简要阐述一下多态的2种常见用法!


目录
相关文章
|
11天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
21天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
14天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
28 4
|
14天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
28 3
|
22天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
37 3
|
22天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
40 2
|
IDE Java 关系型数据库
Java14发布,16大新特性,代码更加简洁明快
Java14发布,16大新特性,代码更加简洁明快
321 0
Java14发布,16大新特性,代码更加简洁明快
|
6天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
5天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
5天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####