【基础】Java抽象类与接口的区别与使用场合_Amos-Chen的博客-CSDN博客
接口用来定义契约行为,也可作为两个系统间的契约进行交互。
而抽象类主要用来为子类定义默认行为,也就是说所有的继承子类都需要运行相同的功能。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法,抽象类和普通类的区别:
其他方面,抽象类和普通没有区别,一般抽象类用于继承中提高扩展性。
接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。
从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
Java8 之后 在接口中可以使用default和static关键字来修饰接口中定义的普通方法
- public interface Interface {
- default String getName(){
- return "zhangsan";
- }
-
- static String getName2(){
- return "zhangsan";
- }
- }
抽象类在设计上的主要目标之一是复用,子类作为父类的子集,从而可以复用父类的某些逻辑,包括属性(或者说状态)和行为。个人觉得抽象类不是一个很必要的东东。只有当开发者特别在意代码质量与架构设计、希望尽量少地向下级用户暴露封装好的信息时,抽象类才能起到关键的作用。
单单从语法角度来看,java8以后,接口和抽象类越来越像了!但是当我们思考一个抽象方法该放在抽象类还是接口中时,那么只要简单判断这个抽象方法是否会被子类用多态来调用,就可以简单分类。牢记文章中的实例,不同的门,开门的方式是不同的,所以门应该设计为抽象类而不是接口!