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中引入默认和静态方法的概念来弥补抽象类和接口之间的缺口。
现在我们可以在接口中提供默认实现方法,不会强制执行类以实现它。