A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-9 14:18  /  1884 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是我总结的关于抽象类和接口的异同及作用。希望对大家有所帮助。
一、概述:
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、一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。


1 个回复

倒序浏览
抽象类可以定义变量、非抽象方法以及抽象方法(必须有一个抽象方法)这句话错了吧。抽象类可以没有抽象方法啊。这莫老的帖子都被我挖出来了。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马