Fork me on GitHub

Java 抽象类和接口

抽象类

关键字: abstract

抽象类特点:

  1. 方法只有声明没有实现时, 该方法就是抽象方法, 需要被 abstract 修饰,
    抽象方法必须定义在抽象类中, 该类必须也被 abstract 修饰
  2. 抽象类不可以被实例化. 因为抽象方法没有方法体, 调用抽象方法没有意义
  3. 抽象类的子类必须覆盖父类的所有抽象方法后, 该子类才可以实例化

抽象类的细节

  1. 抽象类不可以被实例化, 但是有构造函数. 用于给子类对象进行初始化.
  2. 抽象类中可以不定义抽象方法, 但是很少见. 目的就是不让该类创建对象. AWT 的适配器对象就是这种类.
    通常这个类的方法有方法体, 但是却没有内容.
abstract class Demo
{
    void show1()
    {}

    void show2()
    {}
}
  1. 抽象关键字不可以和下列关键字共存:
    • private, 抽象类中的方法需要被子类覆盖, 私有之后, 找不到该方法, 无法达到覆盖的目的
    • static, 静态修饰的内容可以直接用类名调用, 但是抽象方法没有方法体, 调用之后, 没有意义
    • final, 被 final 修饰的类不能被继承, 方法不可以被覆盖
  2. 抽象类和一般类的异同点:
    • 相同点
      • 抽象类和一般类都是用来描述事物的, 都在内部定义了成员
    • 不同点
      • 一般类有足够的信息描述事物
        抽象类描述事物的信息有可能不足
      • 一般类中不能定义抽象方法, 只能定义非抽象方法
        抽象类中可定义抽象方法, 同时也可定义非抽象方法
      • 一般类可以被实例化
        抽象类不可以被实例化
  3. 抽象类一定是个父类. 因为需要子类覆盖其方法后才可以对子类进行实例化

接口 (interface)

格式: interface {}

当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一中形式定义和表示, 就是接口(interface)

// 抽象类
abstract class AbsDemo
{
    abstract void show1();
    abstract void show2();
}

// 接口
interface Demo
{
    public abstract void show1();
    public abstract void show2();
}

备注:

  1. 定义接口使用的关键字不是 class, 是 interface
  2. 接口编译后, 仍然是 .class 文件

接口中常见成员: 全局常量和抽象方法. 这些成员的修饰符是固定的

  • 成员常量: public static final
  • 成员函数: public abstract
  • 接口中的成员都是 public 的

接口的出现将 "多继承" 通过另一种形式体现出来, 即"多实现"

  • 类与类之间是单继承关系
  • 类与接口之间是实现关系 (implements), 而且类可以继承一个类的同时实现多个接口
  • 接口与接口之间可以有继承关系, 而且接口可以多继承.
    因为接口没有方法体, 多继承在类中无法实现, 是因为同名方法体在调用时, 产生不确定性.
interface CC
{
    public abstract void show();
}

interface MM
{
    public abstract void method();
}

interface QQ extends CC,MM
{
    public abstract void function();
}

class WW implements QQ
{
    // 需要覆盖 3 个方法
    public void show(){}

    public void method(){}

    public void function(){}
}

接口的特点

  1. 接口是对外暴露的规则
  2. 接口是程序的功能扩展
  3. 接口的实现降低耦合性
  4. 接口可以用来多实现

接口和抽象类的异同点

  • 相同点
    • 都是不断向上抽取而来的
  • 不同的
    • 抽象类需要被继承, 而且只能单继承
      接口需要被实现, 而且可以多实现
    • 抽象类中可以定义抽象方法和非抽象方法, 子类继承后, 可以直接使用非抽象方法
      接口中只能定义抽象方法, 必须全由子类去实现
    • 抽象类的继承是 is a 关系, 是在定义该体系的基本共性内容
      接口的实现是 like a 关系, 是在定义该体系的额外功能

类与对象的关系

类与接口的关系


参考资料

posted @ 2017-08-27 17:10  小a的软件思考  阅读(296)  评论(0编辑  收藏  举报