【图灵百科】abstract class 和 interface 有什么区别?

发布时间:2022-02-07 17:33:09

  abstractclass和interface有什么区别?这个问题在Java的基础笔试中很常见。以下是图灵java对这个问题的回答。

abstractclass和interface有什么区别?

  包含abstract修饰符的class是一个抽象abstract类无法创建的实例对象。abstract方法的类别必须定义为abstractclass,abstractclass类别中的方法不需要抽象。abstractclass类别中的抽象方法必须在特定的子类中实现,因此不能有抽象结构方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,则子类也必须定义为abstract类型。

  接口(interface)可以说是抽象的特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为publicabstract类型,接口中的成员变量类型默认为publicstaticfinal。

  以下是两者的语法差异:

  1.抽象类可以有结构方法,接口中不能有结构方法。

  2.抽象类中可以有普通成员变量,界面中没有普通成员变量。

  3.普通的非抽象方法可以包含在抽象类中,接口中的所有方法都必须是抽象的,没有普通的非抽象方法。

  4.抽象类中抽象方法的访问类型可以是public、protected和(默认类型,虽然eclipse下没有错误,但不应),但接口中的抽象方法只能是public类型,默认为publicabstract类型。

  5.静态方法可包含在抽象类中,静态方法不能包含在接口中。

  6.静态成员变量可以包含在抽象类和接口中。静态成员变量在抽象类中的访问类型可以是任意的,但接口中定义的变量只能是publicstaticfinal类型,默认为publicstaticfinal类型。

  7.一个类可以实现多个接口,但只能继承一个抽象类。

  接下来说说两者在应用上的区别:

  界面更多的是在系统架构设计方法中发挥作用,主要用于定义模块之间的通信合同。抽象类在代码实现中发挥作用,可以实现代码的重用。例如,模板方法设计模式是抽象类的典型应用。假设项目的所有Servlet类别都应以相同的方式进行权限判断,记录访问日志和处理异常,则可以定义抽象基类,使所有Servlet继承抽象基类,在抽象基类的Service方法中完成权限判断,记录访问日志和处理异常代码,只完成各子类别的业务逻辑代码。伪代码如下:

  publicabstractclassbaservextenshtpservet。

  {

  publicfinalvoidservice(Htpservetrestrequest,

  Httpservetresponseresponse)throws。

  IOExcetion,Servletexception。

  {

  记录访问日志。

  判断权限。

  (有权)

  {

  try

  {

  doservice(request,response);

  }

  Excetpione)

  {

  记录异常信息。

  }

  }

  }

  protetedabstractvoiddoservetrequest。

  Httpservetresponseresponse)throws。

  IOExcetion,Servletexception;

  //注意将访问权限定义为protected,既专业又严谨,因为它是专门用于子类的。

  }

  publiclaservet1extendsbaservet。

  {

  protedoiddoservice(Htpservetrequestrequest,

  Httpservetresponseresponse)throws。

  IOExcetion,Servletexception。

  {

  本Servlet只处理具体的业务逻辑代码。

  }

  }

  如果父类方法中间的代码不确定,则留给子类干,模板设计模式。

  通过这篇文章,你掌握了abstractclass和interface的区别吗?图灵java将继续分享Java面试笔试的问题。希望大家继续关注。

上一篇 【图灵百科】数据库系统MongoDB详解
下一篇 【图灵百科】什么是微服务?微服务优缺点分析
标签: Java基础  Java面试题