抽象类是什么
- 关键字: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
修饰
- 方法修饰:抽象类中除了抽象方法不能被private修饰,其他普通方法与普通类一致;而接口中的方法只能被
- 继承抽象类与实现接口:
- 一个类只能继承一个抽象类
- 一个类能够实现多个接口
- 一个类继承了抽象类与实现了接口:
- 继承了抽象类,不一定需要实现抽象类中的所有抽象方法 (子类就需要定义为abstract类)
- 实现了接口,就必须实现接口中定义的所有抽象方法 (除非这个类是抽象类)
使用场景分析
- 抽象类的核心为共性提取并抽象,更多的使用场景是:将多个类的共有的域和方法抽象为一个抽象类,又根据各自的不同,定义一些抽象方法,然后让这些类继承于这个抽象类,并实现各个类中个性化的方法;
- 接口的核心为行为提取并抽象,更多的使用场景是:将多个类中共有的某些行为提取出来,定义为接口,然后再让这些类实现这个接口,在各个类中实现个性化方法;
- 因此,如果是针对某一行为的提取,则直接使用接口即可;否则,如果是针对共性提取,则直接使用抽象类即可;核心目的还是面向对象来开发