抽象类是什么

  • 关键字:abstract
  • 抽象类:是指被abstract修饰的类
    • public abstract class TestAbstract {}
  • 抽象方法:是一种特殊的方法,被abstract修饰,充当着占位的角色,具体实现在子类中完成
  • 可参考的抽象类:AbstractMap

抽象类的相关知识

  • 构造对象:
    • 不能被实例化,即不能创建对象
    • new AbstractMap()是非法的
  • 变量与方法:
    • 抽象方法不能被private修饰(需要被子类继承并实现)
    • 可以不包含抽象方法
    • 其他与普通的类一致
  • 对象变量:
    • 抽象类的对象变量只能引用非抽象类的子类
    • AbstractMap map = new HashMap();
  • 其他注意:
    • 若一个类继承于一个抽象类,并且它没有实现超类的抽象方法,那么这个类也需要被定义为abstract类(若继承了抽象类,也不一定需要实现它的抽象方法)
    • 若一个类继承于一个抽象类,并且实现了超类所有的抽象方法,那么这个类就不需要被定义为abstrace类了
    • 是可以被其他类继承的

接口是什么

  • 关键字:interface
  • 接口:是指被interface修饰的类,它的设计初衷是对某一类型为的抽象
    • public interface TestInterface {}
  • 可参考的接口:Map
  • 实现接口的关键字:implements
    • public class Test implements TestInterface {}
    • 表示要让 Test 类遵循 TestInterface 接口(需要实现接口的方法)

接口的相关知识点

  • 构造对象:
    • 不能被实例化,即不能创建对象
  • 变量与方法:
    • 变量被隐式地指定为public static final,并且只能被其修饰
    • 方法被隐式地指定为public abstract,并且只能被其修饰
    • 所有方法都必须是抽象方法
    • 不能含有静态代码块以及静态方法
  • 对象变量:
    • 接口的对象变量只能引用非抽象类的子类
    • Map map = new HashMap();
  • 其他注意:
    • 当某个非抽象类遵循(或实现)某个接口,就必须实现接口的所有方法
    • 一个类可以同时实现多个接口
    • 是可以被其他类继承的

抽象类与接口的差异

  • 变量与方法:
    • 方法修饰:抽象类中除了抽象方法不能被private修饰,其他普通方法与普通类一致;而接口中的方法只能被public abstrace修饰
    • 变量修饰:抽象类中的变量与普通类一致;而接口中的变量就只能被public static final修饰
  • 继承抽象类与实现接口:
    • 一个类只能继承一个抽象类
    • 一个类能够实现多个接口
  • 一个类继承了抽象类与实现了接口:
    • 继承了抽象类,不一定需要实现抽象类中的所有抽象方法 (子类就需要定义为abstract类)
    • 实现了接口,就必须实现接口中定义的所有抽象方法 (除非这个类是抽象类)

使用场景分析

  • 抽象类的核心为共性提取并抽象,更多的使用场景是:将多个类的共有的域和方法抽象为一个抽象类,又根据各自的不同,定义一些抽象方法,然后让这些类继承于这个抽象类,并实现各个类中个性化的方法;
  • 接口的核心为行为提取并抽象,更多的使用场景是:将多个类中共有的某些行为提取出来,定义为接口,然后再让这些类实现这个接口,在各个类中实现个性化方法;
  • 因此,如果是针对某一行为的提取,则直接使用接口即可;否则,如果是针对共性提取,则直接使用抽象类即可;核心目的还是面向对象来开发

参考