标签:
在面向对象的概念中,所有的对象都是通过类来描述。但是,反过来,不是所有的类都是用来描述对象的(把类具体化)。如果一个类没有包含足够的信息来描述一个具体的对象,那么这个类就是抽象类。
比如,我们进行一个图形编辑软件的开发,就会发现问题域中存在圆,三角形这样一些具体的概念,它们是不同的,但是它们又都属于形状这样一个概念。形状这个概念在问题域中是不存在的,它就是一个抽象的概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方法。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。
abstract class Demo{
abstract void method1();
abstract void method2();
void method3();
}
abstract demo
interface Demo{
void method1();
void method2();
void method3();
}
interface demo
abstract class在java语言中体现了一种继承关系,父类与派生类概念本质上是相同的,存在“is-a”的关系。对于interface而言,并不要求insterface的实现者与insterface定义在概念本质上是一致的,仅仅是实现了insterface定义的契约而已,关系更类似与“like-a”。
示例: 一个门,有固有的行为方法,open和close,同时还包含报警器的行为方法,alarm。 所以,对问题域的理解是,AlarmDoor在概念本质上是Door,同时具有报警功能。设计也就显而易见了,abstract class在java语言中表示继承关系,而继承关系本质上是“is-a”关系。所以对于Door这个概念,我们应该使用abstract class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以,报警概念可以通过interface定义。代码如下:
abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}
class AlarmDoor extends Door implements Alarm{
void open(){//implements}
void close(){//implements}
void alarm(){//implements}
}
Animal a=null; a=new Dog();
。参考资料:
java中abstract class 和 interface 的解释和他们的异同点(转)
标签:
原文地址:http://www.cnblogs.com/shitoujizu/p/4521043.html