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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨强 黑马帝   /  2011-11-14 22:18  /  1618 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

抽象类和接口的区别是知道的,但是到底是在什么情况下用抽象类,什么情况下用接口,就搞不清楚了,那位高手给指点指点。

4 个回复

倒序浏览
强子 黑马帝 2011-11-15 13:28:18
沙发
看到这个问题我也迷糊了
去网上查了资料 有个例子写的比较好
卖发动机
行为1:查询发动机的马力,发动机将返回一个表示马力的整数。
public abstract Motor{
    abstract public int getHorsepower();
}

软件完成后 现在发现有一种发动机是电池驱动的 销售部门的人希望知道发动机的充电时间
行为2:查询电驱动发动机的充电时间,发动机将返回一个表示充电时间的整数。
public abstract BatteryPoweredMotor extends Motor{
abstract public int getTimeToRecharge();
}

软件修改完成之后  又新进了一种光驱动发电机 需要一定光能才能运转  客户又要这个需要多少光能的参数
行为3:查询光驱动发动机能够正常运转所需要的最小流明数,发动机返回一个整数。
public abstract SolarPoweredMotor extends Motor{
abstract public int getLumensToOperate();
}

上面的两种发动机偶尔需要检查一下发动机是光驱动还是电驱动,使用instanceof实现
if ( instanceof SolarPoweredMotor){...}
if ( instanceof BatteryPoweredMotor){...}

现在又多了一种发动机  光电双重驱动发动机  
为了增加光电驱动发动机,要定义一个新的SolarBatteryPowered抽象类。如果让SolarBatteryPowered从Motor抽象类派生,SolarBatteryPowered将不支持针对光驱动发动机和电驱动发动机的instanceof操作。也就是说,如果查询一个光电驱动的发动机是光驱动的,还是电驱动的,得到的答案是:都不是。

如果用接口来建立行为模型,就可以避免隐含地规定实现模式。例如,前面的几个行为改用接口定义如下。
  行为1:
代码
public interface Motor(){
public int getHorsepower();
}
行为2:
代码
public interface BatteryPoweredMotor extends Motor(){
public int getTimeToRecharge();
}
行为3:
代码
public interface SolarPoweredMotor extends Motor{
abstract public int getLumensToOperate();
}
  现在光电驱动的发动机可以描述为:
代码
public DualPoweredMotor implements SolarPoweredMotor, BatteryPoweredMotor{}


我写的笼统了一些  也只是一个例子   原文在下面这个链接上   有空看一下吧
http://hibernater.iteye.com/blog/779495
回复 使用道具 举报
很简单  抽象类  别人用它需要继承 那么就是公共属性
    接口  一般都是提供方法  可以多实现   
回复 使用道具 举报
清秋 黑马帝 2011-11-15 17:35:55
板凳
这问题太抽象了。楼上总结很多。
刚看完“Java基础视频教程-day07-15-面向对象(接口举例体现)”里对接口的举例。

个人总结下:
1.当需要实现多继承的时候,必须用接口。因为接口可以用来多实现
2.接口可以实现功能扩展。如视频例子里说,smoking这个方法并不是每个学生的功能,可以用接口表示扩展的功能。而sleep这个方法是每个学生必备的,放在抽象类里
回复 使用道具 举报
在接口和抽象类的选择上,必须遵守这样一个原则:行为模型应该总是通过接口而不是抽象类定义。
在使用接口的同时仍旧可以使用抽象类,不过这时抽象类的作用是实现行为,而不是定义行为。只要实现行为的类遵从接口定义,即使它改变了父抽象类,也不用改变其它代码与之交互的方式。特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。

interface在某些地方和abstract有相似的地方,但是采用哪种方式来声明类主要参照以下两点:

1. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。

2. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。



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