Java---关于多态、抽象类、接口超详细解析。

主要内容

  一、多态的引入

  二、抽象类

  三、接口

  四、多态的应用

一. 多态的引入

多态概述

  同一个引用类型,使用不同的实例而执行不同操作,即父类引用指向子类对象

多态的必要条件

  1.一定要有继承关系

   2.一定要有重写

   3.父类引用指向子类对象

多态访问成员的特点

  成员变量
     编译的时候看左边类型,运行的时候看左边类型

   成员方法
     编译的时候看左边类型,运行的时候看右边类型

   静态成员
     编译的时候看左边类型,运行的时候看左边类型
   构造方法

     先执行父类的构造方法,可以帮我们初始化父类继承过来成员,再执行子类

多态的好处

   1.提高了程序的维护性

   2.提高了程序的扩展性

多态的缺点

   1.使用父类引用不能访问子类所特有的功能。

   解决办法:
      使用多态中的转型

   2.多态的转型问题

      分为向上转型和向下转型。

   向上转型(自动转换)
     格式:<父类型> <引用变量名> = new <子类型>();

特点:
  1.子类转为父类,父类的引用指向子类对象类,似于自动进行类型转换。

  2.此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法。

  3.此时通过父类引用变量无法调用子类特有的属性和方法。

向下转型(强制转换)
    格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
特点:
  1.父类转为子类,父类引用转为子类对象,类似于强制类型转换。

  2.在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常。

instanceof关键字
测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据

注意:instanceof通常和向下转型(强制类型转换)结合使用

二. 抽象类

抽象类的引入

  如果说有一个汽车类。汽车有一个run()方法,并且汽车类对应着 两个子类,分别是宝马车类和奔驰车类,这两个子类也相应有自己的run()方法。

  我们思考一个问题,虽然我说过汽车类,但是你知道我说的是什么汽车吗?只有看到了具体的汽车,我们才会明白,这是什么汽车。 也就是说,汽车本身并不是一个具体的,而是一个抽象的事物。只有真正的宝马车,才是具体的汽车。
同理,我们也可以推想,不同的汽车run方法的实现应该是不一样的,所以,我们没必要在汽车类中的run方法给出具体实现,仅仅给出一个声明即可。在Java中,如果一个没有方法体,没有实现的方法定义为抽象方法,一个类中一旦出现抽象方法,该类一定是一个抽象类。

抽象类特点

  1.抽象类和抽象方法一定要使用abstract关键字来声明

  2.抽象类中不一定有抽象方法

  3.没有抽象方法的类有意义吗? – 有意义 不让外界创建对象

  4.抽象类不能实例化

  5.抽象类如果想要实例化怎么办? - 可以利用多态 父类引用指向子类对象,只不过这个父类是一个抽象类而已

  6.如果作为一个抽象类的子类,那么该子类应该具备什么特点?

    a.如果子类不想实现父类的抽象方法,那么子类也可以自动升级为抽象类

    b.如果子类想要实现父类的抽象方法,那么子类就必须实现父类所有的抽象方法

  7.抽象类中可以有抽象方法,成员变量,成员方法,常量,构造方法,静态方法.

     成员变量:可以有,用来给子类继承使用

     成员方法:同上

     常量:同上

     构造方法: 帮助所有子类初始化父类继承过来的成员变量

  抽象类是一个为所有子类服务的类

  8.static final private可以用来修饰抽象方法吗?

     a.static和abstract不能共存: static为了方便调用,abstract为了给子类重写,没有方法体

     b.abstract和final二者构成冲突,final修饰的方法不能被子类重写,abstract修饰的方法就是用来给子类重写,所以冲突

     c.abstract和private二者构成冲突,private修饰的方法不能够被继承,既然不能被继承,就没有重写,而abstract修饰的方法就是用来给子类重写,所以冲突

   9.抽象方法可以使用public 和 protected修饰吗? 可以

   10.综上诉述: 抽象类的所有的抽象方法用来给子类重写

      抽象类的所有非抽象方法用来给子类使用

      抽象类的构造方法用来给子类初始化父类继承过来的成员

      抽象类的成员变量用来给子类使用

      抽象类就是一个彻头彻尾的服务类

三.接口

接口的概述

接口就是抽象方法和常量的集合,接口是一个比抽象类还要抽象的类。

接口的格式

  关键字 接口名 {
      常量;
      抽象方法;
      JDK1.8之后可以有默认方法和静态方法;
   }

接口的特点

  1.接口使用interface关键字来修饰

  2.接口由常量和抽象方法组成

     a.常量: 默认接口中所有的成员变量都是省略 public static final,一般接口的成员变量都是大写

     b.抽象方法:默认接口中所有的成员方法都是省略了 public abstract
      我们建议都写上

  3.接口不能实例化,因为接口是完全抽象的
      如果需要"创建"接口,那么必须使用多态

  4.接口的实现类
      使用implement关键字来完成接口的实现
      接口的实现类特点
     a.如果一个类实现了接口,那么该类就必须实现类接口定义所有的抽象方法
     b.如果一个接口不想实现接口的方法,那么子类必须定义为一个接口

  5.接口是可以扩展功能的 通过多实现

  6.接口是可以多继承的

  7.接口是一种规范

  8.接口是灵活的

  9.类与接口之间的关系

      类和类     单继承   不可以实现
      类和接口    单继承   多实现
      接口和接口  多继承   不可以多实现

   10. 什么时候使用继承,什么时候使用接口?

      当我设计一个非常复杂而又无法实现的类的时候可以使用继承

      当我重新开始编写一些简单的功能或者制定一些标准的时候使用接口

      开发中一般采用面向接口编程,普通类是模板,抽象类是部门模板,部分规范,接口是规范。

   接口和抽象类的区别
在这里插入图片描述

四、多态的应用

多态的三种实现方式

  1.直接使用多态

  2.使用父类作为方法形参实现多态

  3.使用父类作为方法返回值实现多态

多态作为形参

  形式参数
     基本类型

   引用类型

    普通类
   当一个形参希望我们传入的是一个普通类时,我们实际上传入的是该类的对象/匿名对象

     抽象类
  当一个形参希望我们传入的是一个抽象类时,我们实际上传入的是该类的子类对象/子类匿名对象

   接口

   当一个形参希望我们传入的是一个接口时,我们实际上传入的是该类的实现类对象/实现类匿名对象

多态作为返回值

     基本类型

     引用类型

     普通类
   当一个方法的返回值是一个普通的类时,实际上返回的是该类的对象,我们可以使用该类的对象接收

    抽象类
   当一个方法的返回值是一个抽象类时,实际上返回的是该抽象类的子类对象,我们可以使用该抽象类接收

     接口
   当一个方法的返回值是一个接口时,实际上返回的是该接口的实现类对象,我们可以使用接口接收
   注意:

  1.当方法的返回值类型是引用类型的时候,可以使用链式调用。

  2.当方法的参数是引用类型的时候,最好加上非空判断。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值