下面是我总结的关于抽象类和接口的异同及作用。希望对大家有所帮助。
一、概述: 1、抽象类(abstractclass):------->一般仅用于被子类继承。 当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义,而不抽取功能主体。就是说,我们在从下往上看继承的体系结构时,位于上层的类要比下层更具有通用性,也就是说更加抽象,即最上层的祖先(即超类)最具通用性。这时只讲上层的类作为遗传(或者说派生)下层类的基本的类,而不考虑特定的实例对象。 2、接口(interface):------->用来建立类与类之间关联的标准 接口可理解为一种特殊的抽象类(但不是),当抽象类中的方法全为抽象的(即不包含任何非抽象方法),可通过接口表示。 具体代码请查看:http://blog.csdn.net/shengfeixiang/article/details/8572749
二、区别和联系 一)区别: 1、与类间关系不同: 抽象类是一种被子类继承(extends)的关系,而接口和类是一种实现(implements)关系,接口和接口是继承(extends)关系。 注:a.子类只能继承一个抽象类。b.一个类却可以实现多个接口。c.接口可以继承多个接口。 2、定义特点不同: a.抽象类可以定义变量、非抽象方法以及抽象方法(必须有一个抽象方法) 变量:private、public、final、static等等修饰符 抽象方法:abstract(必须有)、public、static等等修饰符 b.接口可以定义常量、抽象方法 常量:public staticfinal(都是存在的,如果没有会默认加上),赋值后,不可再次赋值 方法:public abstract 3、权限不同: a.抽象类可以有私有变量或方法,子类继承抽象父类必须复写全部的抽象方法 b.接口是公开(public)的,里面不能有私有变量或方法,因为接口是对外暴露的,是提供给外界使用的;实现接口必须重写接口中的全部抽象方法 4、成员不同: a.抽象类中可以有自己的成员,也可以由非抽象的成员方法。 b.接口中只能有静态的不能被修改的成员变量(即常量),而且所有成员方法皆为抽象的。 5、变量类型不同: a.抽象类中的变量默认是friendly型的,即包内的任何类都可以访问它,而包外的任何类都不能访问它(包括包外继承了此类的子类),其值可以在子类中重新定义,也可重新赋值。 (具体参看:http://blog.csdn.net/johnstrive/article/details/5880357) b.接口中定义的变量是默认的public static final,且必须进行初始化即赋初值,并不可改变。 6、设计理念不同: a.抽象类表示的是:"si-a"的关系 b.接口表示的是:"like-a"的关系 (组合是"has-a"的关系) 二)联系: 1.其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象。 2、抽象类和接口都必须被一个类(子类)复写里面的全部抽象方法。 3、接口和抽象类都不可创建对象,因为其中含有抽象方法,需要被子类实现后, 对接口中抽象方法全覆盖后,子类才可以实现实例化。 注: 1、设计接口的目的就是为了实现C++中的多重继承,不过java团队设计的一样更有趣的东西来实现这个功能,那就是内部类(inner class) (具体总结参看:http://blog.csdn.net/shengfeixiang/article/details/8577470)。 2、一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。
|