基础 | Java的接口与抽象类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingbeichen/article/details/83588742

在Java中,四大基本特性的「抽象性」是通过两种方式来体现的,包括接口和抽象类。两者看似相同,实则有很多不同之处,面试中也经常会被问到 「谈谈对接口与抽象类的理解?接口与抽象类有什么区别?两者分别在什么场景中使用?」 等问题,在此做一个系统的梳理与总结,建议重点关注。


谈谈对接口与抽象类的理解?

接口是对行为的抽象,其可以含有属性和方法。

  • 属性被隐式指定为public static final的,即全局常量。
  • 方法被隐式执行为public abstract的,即抽象方法。

也就是说,接口中的所有方法都必须为抽象方法,不能有具体实现。所以说,接口是对行为的抽象。

抽象类是对类(一类事物)的抽象,《Java编程思想》一书中将抽象类定义为包含抽象方法的类,但准确来说,包含抽象方法的类一定是抽象类,但抽象类不一定有抽象方法,只要用abstract修饰即可为抽象类,但个人认为没有抽象方法的抽象类并没有实际意义吧?

抽象类可以含有属性、方法和构造器。

  • 方法可以是普通方法也可以是抽象方法,若为抽象方法则必须为public或protected的,缺省情况下默认为public的,因为抽象方法需要被子类继承和实现。
  • 构造器虽然有,但因为抽象类含有无具体实现的方法,所以抽象类不能进行实例化。

接口与抽象类的区别 见下一题。


接口与抽象类有什么区别?

语法层面上的区别:

  • 成员变量:抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是常量,即public static final修饰的。
  • 成员方法:抽象类中的成员方法可以是抽象的也可以是普通的(有具体实现的),而接口中的成员方法只能是public static修饰的。
  • 静态结构:抽象类中可以有静态代码块和静态方法,而接口中不能有静态代码块和静态方法。
  • 构造方法:抽象类中可以有构造器,而接口中没有,但两者都不能进行实例化,但可以定义抽象类和接口类型的引用。
  • 继承与实现:一个类只能继承一个抽象类,而一个类却可以实现多个接口。

设计层面上的区别:

  • 抽象类是对类(一类事物)的抽象,而接口是对行为的抽象。再具体一点说,抽象类是对一类事物整体(包括属性和行为)进行抽象,而接口是对类的局部(仅对行为)进行抽象。如飞机、鸟和飞行而言,应分别将其设计为类、类和接口。
  • 抽象类作为很多子类的父类,是一种模板式设计,而接口作为一种行为规范,是一种辐射式设计。如果需要添加新的方法,抽象类作为模板,可以直接添加带具体实现的方法而无需改变子类,而接口作为规范,规范改变(添加行为),遵守规范的子类都必须进行相应的改动。

接口与抽象类分别在什么场景中使用?

问题同「你在项目中哪些地方使用过接口和抽象类?具体是怎么使用的?」

建议阅读「门与警报」的例子。

门都有打开和关闭两个行为,此时若需要门具备警报行为,应该如何实现呢?

其实,门的打开和关闭属于门本身固有的行为,而警报功能属于门非固有的行为(附加行为)。最佳解决方案是,将门设计为一个抽象类,包括打开和关闭两种行为,而将警报设计为一个接口,包括警报行为,进而设计一个警报门继承抽象类并实现警报接口即可。


扩展面试题

问:接口与抽象类哪个更为抽象?

答:接口,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法,故接口比抽象类更为抽象。


推荐阅读


欢迎关注

Java名企面试吧,每天10点24分,我们不见不散!

丙子先生的宗旨是,每天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。

能力有限,欢迎指教!

猜你喜欢

转载自blog.csdn.net/bingbeichen/article/details/83588742
今日推荐