Java基础--抽象类和接口

PART1:抽象类

A:抽象类介绍

使用"abstract"关键字声明的类叫做抽象类。抽象类的作用是:

从多个具有相同特征的子类抽取出相同的特征建立一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

举个栗子:
狗是动物,猫也是动物,狗和猫都会吃、喝、睡。现有如下需求:

  • 创建一个狗对象
  • 创建一个猫对象

分析:狗和猫都会吃、喝、睡。这是它们的共同点,同时它们还都是动物。突然想到,好像动物都会吃喝睡。所以可以定义一个Animal类,类中定义吃、喝、睡三个方法。Dog类和Cat类分别继承Animal类,然后在自己的类中个性化修改吃、喝、睡方法,这样就不用写那么多代码啦。即便以后来了头牛,不怕,直接让它继承Animal类就好咯。

B:抽象类特点

  1. 抽象类和抽象方法必须用 abstract 关键字修饰;

     abstract class Student{				// 抽象类
     	public abstract void eat();			// 抽象方法
     }
    
  2. 抽象类里可以没有抽象方法,有抽象方法的类一定是抽象类或者接口;

  3. 抽象类不能实例化,只能由具体的子类实例化。这属于多态的一种;

  4. 对于抽象类的子类:

    • 要么也是抽象类;
    • 要么重写所有的抽象方法。

C:抽象类的成员特点

  1. 抽象类的成员变量:
    • 既可以是变量,也可以是常量。abstract 不能修饰成员变量。
  2. 抽象类的成员方法:
    • 既可以是抽象的,也可以是非抽象的。
  3. 抽象类成员方法分类:
    • 抽象方法:强制要求子类要重写父类中的抽象方法;
    • 非抽象方法:子类不需要重写直接继承的事情,提高代码的复用性。
  4. 抽象类可以有构造方法,用于子类访问父类数据的初始化。

PART2:接口

A:接口的介绍

从狭义的角度讲就是指java中的"interface",从广义的角度讲就是对外提供规则的都是接口。接口的作用是:

接口中定义多个类的共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常定义的是一组公用方法。

举个栗子:
Animal类中定义了吃、喝、睡三种方法,Dog类和Cat类继承Animal类。现有如下需求:

  • 创建两个对象,一个是普通狗,一个是哮天犬,普通狗会吃喝睡,哮天犬除了吃喝睡之外还会打架。
  • 再有两个对象,一个是普通猫,一个是虹猫,普通猫会吃喝睡,虹猫除了吃喝睡也会打架。

分析:对于普通狗和普通猫好说,父类Animal中已经定义了吃喝睡的方法,普通狗、猫对象对父类中的吃喝睡方法进行针对性重写即可。但是对于打架这个方法呢?可不可以再定义两个类DogSon、CatSon分别继承Dog类、Cat类,然后分别在两个类中写打架的方法?当然可以。但是,这里有一种更好的方法:将打架这个方法声明在接口中,定义两个类DogSon、CatSon分别继承Dog类、Cat类,然后让DogSon、CatSon分别实现这个接口。

B:接口的特点

  1. 接口用关键字 interface 表示:

    interface Inter{} //定义接口Inter

  2. 类实现接口用 implements 表示:

    class Student implements Inter{} // 类Student实现接口Inter

  3. 接口的子类:

    • 可以是抽象类,但是意义不大;
    • 可以是具体类,需要重写接口中所有的抽象方法。(推荐)
  4. 接口不能实例化:只可按照多态的方式实例化。

C:接口的成员特点

  1. 成员变量:只能是常量,并且必须是静态的、公共的。
    • 默认修饰符:public static final
    • 建议手动给出
  2. 成员方法:只能是抽象方法。
    • 默认修饰符:public abstract
    • 建议手动给出
  3. 构造方法:接口没有构造方法。

PART3:抽象类和接口的总结

A:类与类的关系、类与接口的关系,接口与接口的关系

  1. 类与类的关系:
    • 继承关系,只能是单继承,但是可以多层继承。
  2. 类与接口的关系:
    • 实现关系,可以单实现,也可以多实现。并且还可以在继承一个类的同时实现多个接口。

      class Student implements InterA,InterB{} // 类Student实现接口InterA和接口InterB

  3. 接口与接口的关系:
    • 继承关系,可以单继承,也可以多继承。

B:抽象类和接口的对比

  1. 相同点
    • 接口和抽象类都不能被实例化(位于继承树的顶端);
    • 接口和抽象类都可以包含抽象方法(实现接口或者继承抽象类的普通子类都必须实现这些抽象方法)。
  2. 不同点
    • 用法区别:
      • 抽象类:
        • 一个类最多有一个直接父类
        • 成员方法:可以是抽象,也可以是非抽象;
        • 成员变量:既可以是变量,也可以是常量;
        • 构造方法:有。
      • 接口:
        • 一个方法可以实现多个接口
        • 成员变量:只可以是静态常量;
        • 成员方法:只可以是抽象方法;
        • 构造方法:无。
    • 设计理念区别
      • 抽象类:
        • 被继承体现的是"is a"的关系,抽象类中定义的是该继承体系的共性功能。
        • 它所体现的是一种模板式设计。
        • 抽象类作为多个子类的父类,可以被当成系统实现过程中已经实现了部分功能的中间产品,但是这个产品还不能作为最终的产品,还需要进一步的完善。
      • 接口:
        • 被实现体现的是"like a"的关系,接口中定义的是该继承体系的扩展功能。(可以理解为特性功能)
        • 接口作为系统与外界交互的窗口,体现的是一种规范。
        • 接口类似于整个系统的"规则",系统各模块都要遵循接口的标准,因此接口若发生改变,将辐射到整个系统,大部分类都要重写。(不推荐经常改变接口)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值