旁白:这个面试题经常被问到,我这里从四个方面来总结。虽然面试的时候可能没有那么的时间全部说完,但我觉得概念和设计目的应该要说清楚;因为从这两点就能看出你对两者的理解深度。
1.概念的不同
接口:是对行为的抽象,是抽象方法的集合。实现接口的类必须遵循契约模式,也就是必须实现
接口中的方法。
抽象类:是用于抽取子类通用特性的。是被用来创建继承层级里子类的模板,因此它不能被实
例化,只能作为父类被子类继承。
2.使用原则
接口使用最典型的例子是策路模式,不同场景下使用不同的策略,对行为的抽象。
抽象类使用最典型的例子是模板模式,是抽取不同类的通用代码构成父类,一是方便子类复用,二是子类可以重写父类实现自己的逻辑。
3.各有特点
接口特点:
- 接口本身没有构造函数,因此不能实例化;
- 类可以实现多个接口,抽象类也可以,接口本身也可以继承其他接口;
- 接口内部方法默认为 public访问级别,不能用fina关键字修饰方法;
- 接口中只能包含抽象方法,默认省略 public abstract修饰字,不能包含其他任何已经实现的方法;但idk1.8后,接口中可以包static方法和 default方法。【这里可以思考下为什么要这么设计?】
- 接口中的成员变量都是 public static finals类型的;对于基本类型,实现类中则不能改变值,对于引用对象,实现类则指向同一个对象,但对象中的内容可以改变。【这里可以思考下为什么要设计成静态不可変类型的成员变量?】
public interface eat{
void food(); // 前面省掉了默认的 public abstract
abstract void foodType(); // 默认省掉public
}
抽象类特点:
- 抽象类可以有构造函数,但本身不能实例化;定义为抽象类;
- 含有抽象方法的类一定是抽象类,但抽象类中不ー定含有抽象方法;
- 抽象方法需要用abstracte关键字来修饰,且不能用 private关键字来修饰,因为抽象方法需要被子类重写;
public abstract class Ainmal{
abstract void run(); // 默认default修饰符 除了private 其他修饰符都可以
public void breath(String organ){ // 实例方法
System.out.println("用" + organ + "呼吸...");
}
}
4.设计目的不同
抽象类是对事物的抽象,即对类的抽象;而接口是对行为的抽象。抽象类是对整个类进行抽象,包括属性和行为,但是接口只是对行为(方法)进行抽象。举个例子:飞机和鸟都会飞,但飞机和鸟是不同的事物,分别抽象为 Airplane类和Bird类;会飞是一种纯粹的行为或者方法,不可能把飞抽象成一个类,因此可以把会飞声明为一个接口Flyinterface, Airplane类和Bird类根据情况实现接口中会飞的方法。然后对于不同种类的飞机,如战斗机,民用机,无人机等继承 Airplane类,不同种类的鸟,如喜鹊,乌鸦,燕子等继承Bird类。所以,继承是一个“是不是”的关系,而接口实现是一个“有没有”的关系。无人机是不是飞机,乌鸦是不是鸟,“是”则是继承,飞机有没有飞这个能力,鸟有没有飞这个能力,“有”则是实现。
PS:如果想了解到更多关于Java、C、CPP等语言方面的特性知识;分布式开发zk的使用;mysql数据库的特性等;欢迎关注我们的公众号。
PS:内容丰富全面,共同进度!欢迎你的关注!