抽象类和接口的相同点
抽象类和接口都是一种抽象的概念,他们都不能实例化他们的类,只能够通过子类的继承实现他们的方法。
不同点
抽象:
定义:抽象方法:这个方法没有具体的实现;
抽象类:不能完全代表一个具体的对象。(
注意:
1> 使用 abstract 修饰;
2> 抽象类不能进行实例化,但普通类可以;
3> 抽象类中不一定包含抽象方法,但包含抽象方法的类一定是抽象类;
4> 抽象类中可以定义普通的成员变量和成员方法;
5> 抽象类存在的最大意义就是为了被继承,且多了一层编译器的校验;
6> 普通类继承抽象类后要重写抽象类中的抽象方法;
7> 抽象类A继承抽象类B后不需要重写,但当普通类C再继承抽象类A后,要重写所有没被重写的抽象方法;
8> 要满足重写的要求(如static和private不能被重写);
9> final关键字不可能和abstract同时作用在一个类或方法上;
10> 抽象类当中可以存在构造方法,在子类实例化时,会帮助父类的成员进行初始化
接口:
定义:对公共行为的规范标准,是一种引用数据类型。相当于抽象类的进一步抽象。
注意:
1> 使用 interface 定义;
2> 接口中不能有实现的方法,但是静态方法和被default修饰的方法可以实现;
3> 接口中的成员方法默认是public abstract修饰的;
4> 接口中的成员变量默认是public static final 修饰的;
5> 不能通过关键字new来实例化;
6> 类和接口之间使用implement进行关联;
7> 类实现接口后要重写接口中的抽象方法;
8> 接口中存在default方法时可重写可不重写,具体看业务需求;
9> 不论是接口还是抽象类,都有向上转型;
10> 子类实现接口方法时,这个方法一定要public修饰;
11> 接口中没有构造方法和代码块;
12> 当一个类不想实现接口当中的方法时,这个类可以被定义为抽象类;
13> 接口的修饰符可以为abstract、public,不能为protected、private、final。
那么其实这是最基本的内容,当然如果是大厂的话还会问一个问题:
什么时候使用接口和抽象类
除了语法上面的区别,还有语义上的区别。这也可以作为什么情况下区分两者
我个人认为抽象类是描述一种类似概念情况下使用:比如动物,植物等抽象的一种概念的时候使用。大家既定的一种概念我们会使用。
接口的使用我认为在形容一种特征的时候使用。比如飞,跑等。
举个简单的例子:你不会让叫这个行为一个抽象类,把他作为接口会更合适。