区别1:定义关键字不同
接口使用关键字 interface 来定义。 抽象类使用关键字 abstract 来定义。
区别2:继承或实现的关键字不同
接口使用 implements 关键字定义其具体实现。 抽象类使用 extends 关键字实现继承。
区别3:子类扩展的数量不同
接口的实现类可以有多个,而抽象类的子类,只能继承一个抽象类
区别4:属性访问控制符不同
接口中属性的访问控制符只能是 public,接口中的属性默认是 public static final 修饰的。
抽象类中的属性访问控制符无限制,可为任意控制符
区别5:方法控制符不同
接口中方法的默认控制符是 public,并且不能定义为其他控制符,
抽象类中的方法控制符无限制,其中抽象方法不能使用 private 修饰,
区别6:方法实现不同
接口中普通方法不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现,
static 或 default 方法如果没有方法实现就会报错,而普通方法如果有方法实现就会报错。
抽象类中普通方法可以有方法实现,抽象方法不能有方法实现,
区别7:静态代码块使用不同
接口中不能使用静态代码块,抽象类中可以使用静态代码块,
接口中可以有public static final 修饰的成员变量
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
抽象方法需要被实现,不能被声明为静态,private,final修饰
① 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
② 设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
1.抽象类的使用场景
既想约束子类具有共同的行为(但不再乎其如何实现),又想拥有缺省的方法,又能拥有实例变量
如:模板方法设计模式,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现。
2.接口的应用场景
① 约束多个实现类具有统一的行为,但是不在乎每个实现类如何具体实现
② 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
③ 实现类需要具备很多不同的功能,但各个功能之间可能没有任何联系。
④ 使用接口的引用调用具体实现类中实现的方法(多态)
网友评论