【图灵百科】abstract class 和 interface 有什么区别?
2022-02-07 17:33:09
abstractclass和interface有什么区别?这个问题在Java的基础笔试中很常见。以下是图灵java对这个问题的回答。
包含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面试笔试的问题。希望大家继续关注。