一、抽象类(abstract)
-
抽象类概念
抽象类是对一种事物的抽象,即对类抽象。由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类,抽象类必须在类前用 abstract 关键字修饰。
作用:为了被子类继承,为子类提供了同一的方法入口;封装子类的重复内容public abstract class Animal { public abstract void eat(); }
-
规则
1、抽象方法必须是public或protected,(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。抽象方法没有方法体。
2、抽象类不能创建对象,编译不通过,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。可以通过一个子类继承抽象类,实现抽象类的方法,然后创建子类的实例。抽象类不能实例化是一个java的语法规范
3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。
二、接口
-
接口的概念
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类 -
语法结构
定义接口
Public interface 接口名{
抽象的方法
}
实现接口
Public class 实现类 implements 接口1,接口2{
实现接口中的所有方法
} -
规则
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法 -
优点
使用接口解决多继承
使用接口为外部类添加功能
以面向对象的角度考虑,将一个类与身自来的特征和行为和依赖于外部的可选的特征和行为分离,让类尽可能的单纯,即解耦 -
特点
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承
三、抽象类和接口的异同
- 相同点
都不能实例化
接口的实现类或抽象类的子类都只能实现了接口或抽象类中的方法后才能被实例化。 - 不同点
接口是实现implements,抽象类是继承extends;一个类只能继承一个抽象类,一个了可以实现多个接口
接口不能实现接口,抽象类可以实现抽象类
接口被用于实现比较常用的功能,便于日后维护或添加删除方法;抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改
四、两者的选择
抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类的父类之间存在有逻辑结上的层次结构时,推荐实用抽象类;而接口多使用于不同类之间,定义不同的类之间的通信规则,所以当希望支持差别比较较大的两个或更多个对象之间的特定交互行为时,应该使用接口。
五、最后
接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态的main方法。