面试抽象类和接口的区别
相同点:
1、都是抽象的,不能被实例化
2、当一个非抽象类实现接口或者抽象类的时候,必须将接口和抽象类中所有的抽象方法全部实现
不同点:
1、接口(行为)是完全抽象的,接口侧重于封装,抽象侧重于提取共性,进行约束
抽象类是半抽象的,提取共性 ,提取共同点
2、实现接口的关键字为 implements,继承抽象类的关键字为 extends,接口和接口支持多继承,类和类之间支持单继承,一个类也可以实现多个接口,但一个类只能继承一个抽象类
3、接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
4、抽象类有构造方法,接口没有构造方法
5、接口是完全抽象的,所以接口中随便写一个变量就是常量(public static final),随便定义一个方法都是抽象方法public abstract(只是省去了前面的修饰符)
而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法、可以被定义为pirvate,protected和public,抽象类中的抽象方法·(其前有abstract修饰)不能用private,static,synchronized和native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号{}。所以,当功能需要累积时,使用抽象类;不需要累积时,使用接口。
6、接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
7、接口可以使用多态--面向接口编程
8、接口有没有默认方法?有!可以为接口方法提供一个默认实现。 必须用 default 修饰符标记这样一个方法。当然, 这并没有太大用处, 因为Comparable接口 的每一个实际实现都要覆盖这个方法。
接口方法的冲突
1、 一个类实现两个接口,两个接口的方法都一样可以吗?可以!
但是如果两个方法的名称一样,但是两个方法的参数不一样可以吗? 可以,就是方法的重载,再重载一个带参数方法就行了 但是如果两个方法的名称一样,但是两个方法的返回值类型不一样可以吗? 不可以!
2、如果先在一个接口中将一个方法定义为默认方法, 然后又在超类中定义了同样的方法, 会发生什么情况?
超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。