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