黑马程序员_Java基础篇(三)——抽象类和接口的对比
2014-10-07 16:34
330 查看
------- android培训、java培训、期待与您交流!
----------
一)概述:
1、抽象类(abstract class):一般仅用于被子类继承。
当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义,而不抽取功能主体。也就是说,我们在从下往上看继承这个体系结构时,位于上层的类要比下层更具有通用性,也就是说更加抽象,即最上层的祖先(即超类)最具通用性。这时只讲上层的类作为遗传(或者说派生)下层类的基本的类,而不考虑特定的实例对象。
2、接口(interface):用来建立类与类之间关联的标准
接口可理解为一种特殊的抽象类(但不是),当抽象类中的方法全为抽象的
(即不包含任何非抽象方法),可通过接口表示。
二)联系:
1.其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象。
2、抽象类和接口都必须被一个类(子类)复写里面的全部抽象方法。
3、接口和抽象类都不可创建对象,因为其中含有抽象方法,需要被子类实现后,
对接口中抽象方法全覆盖后,子类才可以实现实例化。
三)具体区别:
-->实现
子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。
子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
-->构造器
抽象类可以有构造器;接口不能有构造器
-->与正常Java类的区别
除了你不能实例化抽象类之外,它和普通Java类没有任何区别
接口是完全不同的类型
-->访问修饰符
抽象方法可以有public、protected和default这些修饰符
接口方法默认修饰符是public。不可以使用其它修饰符。
-->main方法
抽象方法可以有main方法并且我们可以运行它
接口没有main方法,因此我们不能运行它。
-->多继承
抽象方法可以继承一个类和实现多个接口
接口只可以继承一个或多个其它接口
-->速度
抽象类比接口速度要快
接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
-->添加新方法
如果往抽象类中添加新的方法,可以给它提供默认的实现。因此不需要改变现在的代码。
如果往接口中添加方法,那么就必须改变实现该接口的类。
四)什么时候使用抽象类和接口:
如果拥有一些方法并且想让它们中的一些有默认实现,那么就使用抽象类。
如果想实现多重继承,那么必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此就可以使用接口来解决它。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
五)Java8中的默认方法和静态方法:
Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。默认方法和Trait有些类似,但是目标不一样。默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法),看看下面的例子:
接口Defaulable使用default关键字声明了一个默认方法notRequired(),类DefaultableImpl实现了Defaulable接口,没有对默认方法做任何修改。另外一个类OverridableImpl重写类默认实现,提供了自己的实现方法。
Java 8 的另外一个有意思的新特性是接口里可以声明静态方法,并且可以实现。例子如下:
补充:抽象类的一个用途是“模板方法设计模式”。(待续。。。)
----------
一)概述:
1、抽象类(abstract class):一般仅用于被子类继承。
当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义,而不抽取功能主体。也就是说,我们在从下往上看继承这个体系结构时,位于上层的类要比下层更具有通用性,也就是说更加抽象,即最上层的祖先(即超类)最具通用性。这时只讲上层的类作为遗传(或者说派生)下层类的基本的类,而不考虑特定的实例对象。
2、接口(interface):用来建立类与类之间关联的标准
接口可理解为一种特殊的抽象类(但不是),当抽象类中的方法全为抽象的
(即不包含任何非抽象方法),可通过接口表示。
二)联系:
1.其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象。
2、抽象类和接口都必须被一个类(子类)复写里面的全部抽象方法。
3、接口和抽象类都不可创建对象,因为其中含有抽象方法,需要被子类实现后,
对接口中抽象方法全覆盖后,子类才可以实现实例化。
三)具体区别:
-->实现
子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。
子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
-->构造器
抽象类可以有构造器;接口不能有构造器
-->与正常Java类的区别
除了你不能实例化抽象类之外,它和普通Java类没有任何区别
接口是完全不同的类型
-->访问修饰符
抽象方法可以有public、protected和default这些修饰符
接口方法默认修饰符是public。不可以使用其它修饰符。
-->main方法
抽象方法可以有main方法并且我们可以运行它
接口没有main方法,因此我们不能运行它。
-->多继承
抽象方法可以继承一个类和实现多个接口
接口只可以继承一个或多个其它接口
-->速度
抽象类比接口速度要快
接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
-->添加新方法
如果往抽象类中添加新的方法,可以给它提供默认的实现。因此不需要改变现在的代码。
如果往接口中添加方法,那么就必须改变实现该接口的类。
四)什么时候使用抽象类和接口:
如果拥有一些方法并且想让它们中的一些有默认实现,那么就使用抽象类。
如果想实现多重继承,那么必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此就可以使用接口来解决它。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
五)Java8中的默认方法和静态方法:
Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。默认方法和Trait有些类似,但是目标不一样。默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法),看看下面的例子:
private interface Defaulable { // Interfaces now allow default methods, the implementer may or may not implement (override) them. default String notRequired() { return "Default implementation"; } } private static class DefaultableImpl implements Defaulable { } private static class OverridableImpl implements Defaulable { @Override public String notRequired() { return "Overridden implementation"; } }
接口Defaulable使用default关键字声明了一个默认方法notRequired(),类DefaultableImpl实现了Defaulable接口,没有对默认方法做任何修改。另外一个类OverridableImpl重写类默认实现,提供了自己的实现方法。
Java 8 的另外一个有意思的新特性是接口里可以声明静态方法,并且可以实现。例子如下:
private interface DefaulableFactory { // Interfaces now allow static methods static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get(); } }
补充:抽象类的一个用途是“模板方法设计模式”。(待续。。。)
相关文章推荐
- 黑马程序员_JAVA基础_抽象类与接口的关系
- 黑马程序员-java学习继承之抽象类、多态和接口
- 黑马程序员—Java面向对象(抽象类、模板方法设计模式、接口、多态、内部类)
- 黑马程序员——Java基础--接口和抽象类的区别
- 黑马程序员 Java基础<三>---> 抽象类、与接口
- 【黑马程序员】java中--------------抽象类(abstract)接口(interface)
- JAVA与C++对比 --– 虚函数、抽象函数、抽象类、接口
- 黑马程序员_java的继承性- 继承-final关键字-抽象类-接口-多态-异常-包-多线程-
- 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类
- 黑马程序员_java的面向对象(对第七课继承..抽象类..接口及fianl应用总结)
- JAVA – 虚函数、抽象函数、抽象类、接口_对比C++
- 黑马程序员--03.Java面向对象--06.【final关键字】【抽象类】【接口】
- 黑马程序员—JAVA基础之继承、抽象类、接口
- java_抽象类和接口(黑马程序员)
- 黑马程序员_java接口与抽象类总结
- 黑马程序员_JAVA笔记07——面向对象3(继承、final、抽象类、接口)
- 黑马程序员--Java基础学习笔记之抽象类和接口、内存结构分析、Java APIs
- 黑马程序员_Java基础_抽象类,模板设计模式,接口,内部类,多态
- 黑马程序员—java基础学习--抽象类(abstract)、接口(interface)、多态
- 黑马程序员 Java基础 面向对象:继承、final关键字、抽象类、模版方法模式、接口、多态、Object类