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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海洋 中级黑马   /  2013-3-24 20:27  /  1687 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海洋 于 2013-3-24 21:04 编辑

什么时候用抽象类,什么时候用接口!

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢!  发表于 2013-3-24 21:02

3 个回复

倒序浏览
面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。
Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序 的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为你结构层次上的顶层。
Java接口和Java抽象类的比较:
1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。
如 果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
(抽象类里的方法有抽象方法和正常方法,可以有方法体,当继承该抽象类后可以重写相应的方法, 一个类只能实现一个抽象类;接口里都是抽象方法没有方法体,实现接口时必须实现所有的抽象方法,一个类可以实现多个接口,接口可以继承接口。)
2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。
在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。
3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
4、结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。
Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。
使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
这个问题很有深度啊,首先可以从他们的区别上看:
共同点是他们都可以实现多态;
不同点在于抽象类和接口的目的和使用方式有所不同,抽象类是为继承而设计的,接口则更多以组合的方式使用。
如果在处理业务中可以抽象出一个通用的处理过程,只是某些局部传递的状态或参数有所不同,这时可以考虑使用抽象类。否则在一般的情况下,我们都优先使用接口和组合的形式,这样使代码之间的耦合度降低。
回复 使用道具 举报
抽象类:
当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体,然后用abstract修饰,形成抽象类。
抽象类的特点:
①抽象方法一定在抽象类中
②抽象方法和抽象类都必须被abstract关键字修饰
③抽象类不可以用new创建对象,因为调用抽象方法没意思
④抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,简历子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。


接口:
可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
接口的特点:
①接口是对外暴露的规则
②接口是程序的功能扩展
③接口可以用来多实现
④类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
⑤接口与接口之间可以有继承关系
接口是不可以创建对象的,因为有抽象方法,需要被子类实现(用implements)子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类。接口可以被多实现,也是对多继承不支持的转换形式。








评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马