Java中抽象类和接口之间的区别
时间:2020-02-23 14:34:03 来源:igfitidea点击:
"抽象类和接口之间有什么区别"。
"你什么时候会使用 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扩展通用servlet时,它提供服务()方法
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); }
}
抽象类VS接口
| 参数 | 抽象类 | 接口 |
|---|---|---|
| 默认方法实现 | 它可以具有默认方法实现 | 接口是纯abstraction.it根本无法实现但在Java 8中,我们可以在接口中具有默认方法。 |
| 实现 | 子类使用扩展关键字扩展一个抽象类,他们需要在抽象类中提供所有已声明的方法,除非子类也是一个抽象类 子类使用实现关键字实现接口,应该为接口中声明的所有方法提供实现 | |
| 构造函数 | 抽象类可以具有构造函数 | 接口不能具有构造函数 |
| 与普通Java类不同 抽象类与Java类几乎相同,除非我们无法实例化。 | 接口完全不同类型 | |
| 访问修改器 | 抽象类方法可以公开,受保护,私有和默认修改器 | 接口方法默认公共。我们无法使用任何其他访问修饰符 |
| main()方法 | 抽象类可以有主要方法,所以我们可以运行它 | 接口没有主要方法,所以我们无法运行它。 |
| 多重继承 | 抽象类可以扩展另一个类,可以实现一个或者多个接口。 | 接口可以扩展到一个或者多个接口 |
| 速度 | 它比接口更快 | 接口有点慢,因为它需要一些时间才能在类中找到实现的方法 |
| 添加新方法 | 如果向抽象类添加新方法,则可以提供默认实现。 | 所以你不需要更改当前代码 |
何时使用抽象类和接口
- 如果我们有很多方法并希望其中一些中的默认实现,那么就会使用抽象类
- 如果要实现多个继承,那么我们必须使用接口。
由于Java不支持多重继承,子类无法扩展多个类,但我们可以实现多个接口,以便我们可以使用接口。
- 如果基本合同继续变化,那么我们应该使用
abstract class。因为如果基础合同继续变化,我们仍然使用interface,我们必须更改所有在每次合同更改时实现该接口的类。
在Java 8中引入默认和静态方法
Oracle尝试通过在Interface.so中引入默认和静态方法的概念来弥补抽象类和接口之间的缺口。
现在我们可以在接口中提供默认实现方法,不会强制执行类以实现它。

