你什么时候用abstract class ,什么时候用interface ”。所以在这篇文章中,我们将讨论这个话题。
在讨论它们之间的差异之前,让我们先来看看它的介绍。
抽象类
Abstract classes是为了捕捉子类的共同特征而创建的。它不能被实例化,它只能被它的子类用作超类。抽象类用于为其子类在层次结构中创建模板。让我们以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
}
界面:
接口是抽象方法的集合。一个类实现了一个接口,从而继承abstract methods 了接口的。所以它是一种签订合同,你同意如果你实现了这个接口,那么你必须使用它的方法。它只是一个模式,它本身不能做任何事情。 让我们以可外部化接口为例。
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;
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException { employeeId=in.readInt();
employeeName=(String) in.readObject();
} @Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(employeeId);
out.writeObject(employeeName); }
}
抽象类与接口
范围 |
抽象类 |
界面 |
默认方法实现 |
它可以有默认的方法实现 |
接口是纯抽象的。它根本不能有实现,但在 java 8 中,你可以在接口中有默认方法。 |
执行 |
子类使用extends关键字来扩展抽象类,它们需要提供抽象类中所有声明方法的实现,除非子类也是抽象类 |
子类使用implements关键字来实现接口,并且应该为接口中声明的所有方法提供实现 |
构造函数 |
抽象类可以有构造函数 |
接口不能有构造函数 |
不同于普通的java类 |
抽象类与 java 类几乎相同,只是不能实例化它。 |
接口是完全不同的类型 |
访问修饰符 |
抽象类方法可以有 public、protected、private 和 default 修饰符 |
接口方法默认是公共的。您不能使用任何其他访问修饰符 |
Main() 方法 |
抽象类可以有 main 方法,所以我们可以运行它 |
接口没有 main 方法,所以我们不能运行它。 |
多重继承 |
抽象类可以扩展另一个类,并且可以实现一个或多个接口。 |
接口只能扩展到一个或多个接口 |
速度 |
它比界面更快 |
接口有点慢,因为在类中找到实现的方法需要一些时间 |
添加新方法 |
如果向抽象类添加新方法,则可以提供它的默认实现。所以你不需要改变你当前的代码 |
如果向接口添加新方法,则必须更改实现该接口的类 |
何时使用抽象类和接口
-
如果您有很多方法并且想要其中一些方法的默认实现,那么请使用抽象类
-
如果要实现多重继承,则必须使用接口。由于Java不支持多重继承,因此子类不能扩展多个类,但您可以实现多个接口,因此可以使用接口。
-
如果您的基本合同不断变化,那么您应该使用
abstract class . 因为如果您的基本合同不断变化并且您仍然使用interface ,那么每次合同更改时,您都必须更改实现该接口的所有类。
java 8中默认和静态方法的介绍
Oracle 试图通过在接口中引入默认方法和静态方法的概念来弥合抽象类和接口之间的鸿沟。所以现在我们可以在接口中提供方法的默认实现,而不会强制类来实现它。我将在下一篇文章中介绍这些主题。
|