什么是抽象类:
- 抽象类的方法只有声明没有实现,需要被abstract关键字修饰。
- 抽象方法必须定义在抽象类中,该类也必须被abstract关键字修饰。
- 除了抽象方法之外,抽象类还可以包含具体数据和具体方法。
- 类即使不含抽象方法,也可以将类声明为抽象类。
- 抽象类不能被实例化。也就是说,如果将一个类声明为abstract,就不能创建这个类的对象。
抽象方法充当着占位的角色,它们的具体实现在子类中。扩展抽象类可以有两种选择:
- 1.在抽象类中定义部分抽象类方法或不定义抽象方法,这样也就必须将子类也标记为抽象类。
- 2.定义全部的抽象方法,这样一来,子类就不是抽象类了。
抽象类必须有其子类覆盖了所有的抽象方法后,才可以被实例化,否则这个子类还是是个抽象类。
什么是接口:
- 接口主要用来描述类具有什么功能,而并不给出每个功能的具体实现。使用interface关键字来定义
- 一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。
- 在java中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
- 接口中所有的方法自动地属于public
- 接口可以有很多方法,在接口中还可以定义常量。
- 接口不能含有实例域,提供实例域和方法实现的任务应由实现接口的那个类来完成。
为了让类实现一个接口,通常需要下面两个步骤:- 1.将类声明为实现给定的接口。需要使用关键字implements
- 2.对接口中的所有方法进行定义。
接口和抽象类的区别:
- 1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以 有非抽象的方法
- 2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
- 3. 一个类可以实现多个接口,但多只能实现一个抽象类
- 4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
- 5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。