一些受欢迎的访谈问题是“抽象类和接口之间有什么区别”,“什么时候使用抽象类以及什么时候使用接口”。 因此,在本文中,我们将讨论这个主题。
在探讨它们之间的差异之前,让我们先介绍一下它们。
抽象类
创建抽象类以捕获子类的共同特征。 它不能被实例化,只能被其子类用作超类。 抽象类用于在层次结构中为其子类创建模板。
让我们以JDK类GenericServlet为例:
public abstract class GenericServlet implements Servlet, ServletConfig,Serializable{
// abstract method abstract void service(ServletRequest req, ServletResponse res) ; void init() {// Its implementation } // other method related to Servlet
}
当HttpServlet扩展Generic servlet时,它提供service()方法的实现:
public class HttpServlet extends GenericServlet
{void service(ServletRequest req, ServletResponse res){// implementation
}protected void doGet(HttpServletRequest req, HttpServletResponse resp)
{// Implementation
}protected void doPost(HttpServletRequest req, HttpServletResponse resp)
{// Implementation
}// some other methods related to HttpServlet
}
接口
接口是抽象方法的集合。 一个类实现一个接口,从而继承该接口的抽象方法。 因此,这是签订合同的方式,您同意如果实现此接口,则必须使用其方法。 它只是一种模式,它本身不能做任何事情。
让我们以外部化接口为例:
public interface Externalizable
extends Serializable
{void writeExternal(ObjectOutput out)throws IOException;void readExternal(ObjectInput in)throws IOException,ClassNotFoundException;
}
实现此接口时,必须实现以上两种方法:
public class Employee implements Externalizable{ int employeeId;String employeeName;@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException { employeeId=in.readInt();employeeName=(String) in.readObject();} @Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeInt(employeeId);out.writeObject(employeeName); }
}
抽象类与接口
何时使用Abstract类和接口:
- 如果您有很多方法,并且想要其中的一些默认实现,那么请使用抽象类
- 如果要实现多重继承,则必须使用接口。 由于Java不支持多重继承,因此子类不能扩展一个以上的类,但是您可以实现多个接口,因此可以为此使用接口。
- 如果您的基本合同一直在变化,那么您应该使用抽象类,就像您在不断更改基本合同并使用接口一样,那么您必须更改实现该接口的所有类。
Java 8中默认方法和静态方法的介绍
Oracle试图通过在接口中引入默认方法和静态方法的概念来弥合抽象类和接口之间的鸿沟。 因此,现在我们可以在接口中提供方法的默认实现,而不会强制使用类来实现该方法。 我将在下一篇文章中讨论这个主题。
翻译自: https://www.javacodegeeks.com/2014/06/difference-between-abstract-class-and-interface-in-java.html