在java中,接口与抽象类的区别在校招面试时会被经常问的,理论上的知识作为面试经典大家也都背的很好,但是前几天我面试诺瓦科技的时候,面试官给我来了这么一个问题,“在工作中,什么时候要用接口,什么时候要用抽象类”。这一下把我问懵了。

于是乎我面试完查了一些资料,还咨询了其他人这个问题怎么回答,终归是没有一个特定的答案,更多的时候两者确实可以互相替换,只能说是有了几年工作经验后慢慢感觉吧。

接下来我先来从查阅到的资料中找出接口和抽象类不能替换的地方写吧。

接口中全都是抽象的,抽象的东西就是用来限制、规范的,而抽象类中的抽象方法也是这样的作用,抽象类中的非抽象方法就是可选的,而不是用来限制的。两者最大的区别我认为在于多继承。接口是可以实现多继承的,而抽象类不可以。

举个例子来说明吧

定义一个汽车抽象类,是一个笼统的概念

public abstract class Car {
}

然后现在有使用汽油的汽车

public abstract class GasCar extends Car{
}

还有使用电的汽车

public abstract class EleCar extends Car{
}

现在又来了一种油电混合的车,现在发现这种车继承之前的哪一个抽象类都不行,除非直接继承Car这个类,但是这样有浪费了汽油车和电车里的内容,导致代码要重写。

接下来使用接口来看看怎么用

public interface Car {
}

也定义一个汽油车接口

public interface GasCar extends Car{
}

再来一个电车接口

public interface EleCar extends Car{
}

现在定义油电混合的车,可以直接从汽油车和电车两个接口中实现两者的所有抽象方法

public class GasEleCar implements GasCar, EleCar{
}

这里确实可以体现出接口与抽象类的不同之处了,可能还有其它的地方会有接口和抽象类的限制,可以在评论里一起探讨