也工作了很长时间了,可是一直搞不太懂接口和抽象类的区别和联系到底是怎么回事,面试的时候感觉好多公司都爱问这个问题,请大牛们给分析一下。
解决方案 »
- JSTL如何 返回参数a,在相应的action中如何接受这个参数a??
- mule的配置文件
- hibernate和struts结合出现错误,请各位朋友帮忙看下!
- 【求助】关于struts标签 logic:iterator的问题
- Hibernate+c3p0数据库连接池的一点问题
- eclipse3.2.2是不是不支持jdk6.0
- 怎样将一个dom4j的document对象,格式化后,输出为String
- 在jsp页面里,有很多button,text等,能通过循环(js代码)或其他的方法获得type="text"?
- j2ee在web服务中作用是什么
- 为什么的的的鼠标监听器没反应啊!!!求大神解·····
- 面试准备要介绍的项目,求教
- spring3.2+hibernate4.1最少的jar包应该是哪些?
接口是can do something,是种契约,仅代表,实现它的类的实例,(除了出Exception的情况)一定能完成某(些)个任务。但是具体如何完成,你不知道,你也不需要知道也不应该关心抽象类是is something/has some properties。抽象类当然也能完成一些任务,但是,他除了完成这(些)个任务以外,还被强制规定死了,有些其他的属性,而且,很多时候,想换个方式完成这(些)个任务,因为已经在“体制内”,实在是很难很难。举个例子(下面说道的概念,仅在这个例子的范围内有效,换个应用,可能完全颠覆)
“能飞的”是个接口,所有实现这个接口的类的实例,除了特例,都能飞起来
public interface Flyable {
public void fly();
}而“鸟”这个概念,显然,除了能飞,还有些固定的属性,比如翅膀,喙什么的:public abstract class Bird // 上面还可能有Animal之类的父类,这里省略
implements Flyable // 这里可能还有其他接口,比如“会吃东西”,“会叫”...
{
private Wing wings; // 翅膀
private Beak beak; // 喙
// 其他是鸟都会有的“属性”。当然有些属性,应当是在Animal这个层级的 public void fly() {
wings.vibrate(); // 默认的实现方式,扇动翅膀
}
// 其他功能
}public class Sparrow extends Bird {
// 麻雀自己的一些特性
}public abstract class WaterBird implements Swimmable {
// 水禽都能游泳,在这里“能游泳”也是接口,而水禽成了“抽象类”
// 水禽的一些特性
}public class Swan extends WaterBird {
// 天鹅自己的一些特性
public void fly() {
if (water.getLength() < 100) {
throw new FieldTooSmallException(); // 天鹅需要长距离助跑
}
runOnTheWater();
wing.vibrate();
}
}// 少数的例外
public class Ostrich extends Bird {
public void fly() {
throw new UnsupportedOperationException("鸵鸟不会飞!");
}
}
回到Flyable这个接口,不是所有Flyable都是Bird,至少还有public abstract class Insect // 上面还可能有Animal之类的父类,这里省略
implements Flyable // 这里可能还有其他接口,比如“会吃东西”,“会叫”... private Wing wings; // 翅膀
// 头胸腹,6条腿...
}
// 蝙蝠是哺乳动物,哺乳动物不能飞,但是它能,刚好和鸵鸟相反
public class Bat extends Mammal implements Flyable // 可能还有其他接口
{
// 蝙蝠的特性
public void fly() {
// 蝙蝠那个就不能叫翅膀了...
}
}public abstract class Aircraft implements Flyable // 可能还有其他父类、接口,比如是“机器”(类),“能加油”(接口)
{
....
}但愿上面的例子,能够让你在决定用接口还是抽象类的时候有所助益。
实在想不明白,优先定义接口,用到其功能的地方,一律使用接口类型。然后,再提供一个通用的“抽象类”,提供一系列“模板方法”,实现这个接口的功能。
例子恰当+条理清晰。
haha~~~
time to close your post, OP.
接口是特殊的抽象类,详见我的日志:http://blog.csdn.net/fonyer/article/details/8961268