【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧。

很多常见的面试问题如“抽象类和接口有什么区别”,“你在什么时候用抽象类什么时候用接口”。所以在这篇文章里面,我们会讨论一下这个话题。

在开始讨论它们的区别之前,我们先看看它们的介绍。

Abstract class 抽象类

抽象类被用来抽象出子类的共同特征。它是不能被实例化的,它只能被子类继承作为超类使用。抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to create template  for its sub classes down the hierarchy.)。

来用JDK的自带GenericServlet类举一个例子:

  public abstract class GenericServlet implements  Servlet, ServletConfig,Serializable{    
       // 抽象方法   
        abstract  void service(ServletRequest req, ServletResponse res) ; 
        void init()     {
             // 方法的实现      
         }  
           // 其它Servlet的关联方法   
    }

当HttpServlet继承了 Generic servlet, 它要提供service() 方法的实现(因为父类service()方法是抽象方法,子类必须实现):

  public class HttpServlet extends GenericServlet
  {
           void service(ServletRequest req, ServletResponse res)
           {
               // 实现
           }
    
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            {
                // 实现
            }
    
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            {
                // 实现
            }
    
    // HttpServlet其它关联方法
  }

Interface 接口

一个接口是一系列抽象方法的集合。当一个类实现一个接口,就会因此继承到这个接口里面的抽象方法。所以它就像签了一个合约,你实现了这个接口就相当于同意了这个合约,你就需要去使用它的方法。当然,这只是一个模式,它自身是不能做任何事情的。

来看一个Externalizable 接口的例子:

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); }
}

Abstract class vs Interface 抽象类和接口的区别

比较参数 抽象类 接口
默认方法实现 可以有默认的方法实现 接口是单纯的抽象,没有实现
实现
子类使用 extends 关键字去集成一个抽象类,需要在子类里面对抽象类声明的所有抽象方法提供实现方法,如果子类也是抽象类则不需要。


子类使用 implements 关键字去实现接口,需要在子类里面对接口声明的所有方法提供实现方法。

构造器 抽象类可以有构造器 接口不能有构造器
和普通java类的区别
抽象类大部分和普通java类一样除了不能实例化它。


接口是完全不同的类型

访问修饰符
抽象类可以有public protected private和default修饰符


接口方法默认都是public,不能使用其他修饰符。

Main() 方法
抽象类可以有main() 方法,所以我们可以执行它


接口不能有main()方法,所以我们不能执行它

多重继承
抽象类可以集成一个其他的类和实现一个或多个接口


接口只能继承一个或多个接口

速度 比接口快
接口相对较慢,它要用一定时间去找类里面的实现方法

增加新的方法
如果想要给抽象类增加新的方法,你可以对它提供默认的实现,因此你不需要去改变你当前的代码


If you add new method to interface, you have to change the classes which are implementing that interface

如果你要对接口增加新的方法,你需要去修改实现了该接口的类。

什么时候使用抽象类和接口:

  • 如果你需要大量的方法并且希望它们当中某些方法有默认实现,那么选择抽象类最好不过
  • 如果你想要实现多重继承,那就需要使用接口。因为java本身是不支持多重继承的,子类不能够继承多于一个父类,但是可以实现多个接口,因此你可以使用接口来间接达到多重继承。
  • 如果你的基本抽象内容经常改变,那么你应该使用抽象类,因为如果你的基本抽象内容经常改变而且使用接口的话,那么你就必须要连带把实现了这个接口的其它类都一并修改。

java 8里面的default和static方法介绍

Oracle 一直试图在接口中引进default和static方法的概念用以弥补抽象类和接口之间的间隙。所以现在我们可以在接口中提供方法的default实现而不强迫子类去实现它。我将会再下一个post里谈谈这个新东西。

相关链接:Difference between Abstract Class and Interface in java from our JCG partner Arpit Mandliya at the Java frameworks and design patterns for beginners blog.

【翻译】JAVA中抽象类和接口的区别,布布扣,bubuko.com

时间: 2024-10-14 04:39:49

【翻译】JAVA中抽象类和接口的区别的相关文章

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象

Java中抽象类和接口的区别(读书笔记)

Java的抽象类和接口 抽象类和接口是两个容易混淆的概念,但有一句话能很好地将这两者区分开来,即抽象类是事物的抽象,而接口是行为的抽象.抽象类抽象出来的是一类事物,事物中包含了一些固有的属性和行为,而接口更多的是提供固有属性行为之外的延伸行为.打个比方,可以把动物看成为抽象类,类中有一些固有属性,如身高体重,还有一些共有行为,如吃饭和睡觉,所有的动物都遵循着这些属性和行为.除此之外,有些动物还能飞,但并不是所有的动物都具有飞行这种能力,此时飞行只是事物的延伸功能,相当于一个接口. 一.抽象类 抽

Java中抽象类和接口的区别(abstract class VS interface)

前言:本文解决的问题 什么是抽象类 抽象类的应用场景 接口可以有方法实现吗 接口和抽象类的区别 1 什么是抽象类 在声明时含有关键字abstract就是抽象类,抽象类它可以看作具体类的一个模板,继承它的子类可以从抽象类中共享一些方法(可能是不完整的)和属性. A class which is declared with the abstract keyword is known as an abstract class in Java. It can have abstract and non-

详细解析Java中抽象类和接口的区别

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意. 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.

[转]详细解析Java中抽象类和接口的区别

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解.对于设计意图的理解是否正确.合理

详解Java中抽象类与接口的区别

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.本

Java中抽象类和接口的区别

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.本

详细解析Java中抽象类和接口的区别(转)

转自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的

(转)详细解析Java中抽象类和接口的区别

原文地址:https://zhuanlan.zhihu.com/p/50989401 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别