1 二者表达的概念不同。抽象类是一类事物的高度聚合,与子类的关系属于“是”的关系;而接口是定义行为规范,所以对于实现接口的子类来讲,相对于接口来讲,是“行为须要按照接口来完成”。spa
2 抽象类在定义类型方法的时候,能够给出方法的实现部分,也能够不给出;而对于接口来讲,其中所定义的方法都不能给出实现部分。继承
3 继承类对于二者所涉及方法的实现是不一样的。继承类对于抽象类所定义的抽象方法,能够不用重写,也就是说,能够延用抽象类的方法;而对于接口类所定义的方法或者属性来讲,在继承类中必需要给出相应的方法和属性实现。
4 在抽象类中,新增一个方法的话,继承类中能够不用做任何处理;而对于接口来讲,则须要修改继承类,提供新定义的方法。
以下给出二者的简单对比表格。接口
参数 | 抽象类 | 接口 |
默认的方法实现 | 它能够有默认的方法实现 | 接口彻底是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。若是子类不是抽象类的话,它须要提供抽象类中全部声明的方法的实现。 | 子类使用关键字implements来实现接口。它须要提供接口中全部声明的方法的实现 |
构造器 | 抽象类能够有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类以外,它和普通Java类没有任何区别 | 接口是彻底不一样的类型 |
访问修饰符 | 抽象方法能够有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可使用其它修饰符。 |
main方法 | 抽象方法能够有main方法而且咱们能够运行它 | 接口没有main方法,所以咱们不能运行它。 |
多继承 | 抽象方法能够继承一个类和实现多个接口 | 接口只能够继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,由于它须要时间去寻找在类中实现的方法。 |
添加新方法 | 若是你往抽象类中添加新的方法,你能够给它提供默认的实现。所以你不须要改变你如今的代码。 | 若是你往接口中添加方法,那么你必须改变实现该接口的类。 |
Oracle已经开始尝试向接口中引入默认方法和静态方法,以此来减小抽象类和接口之间的差别。如今,咱们能够为接口提供默认实现的方法了而且不用强制子类来实现它。这类内容我将在下篇博客进行阐述。博客