参考
java抽象类和抽象方法
Android开发:抽象类(abstract class)和接口(Interface)的区别
Java基础篇(一):接口与抽象类
java抽象类和接口的区别,使用场景
如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们本质上又都属于这样一个概念:形状,形状这个概念在问题领域是不存在的,所以形状就是一个圆形、三角形的抽象类。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。
你可以直接使用普通类来实现同样的逻辑,但是,让具体的实现方法和类抽象化,你可以清晰的告诉使用者这个类不能直接使用,它应该作为基类,然后让子类来实现抽象方法。(模板方法设计模式)
抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由 抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract。
在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没 有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是 abstract的,而这个子类也必须是抽象的,即声明为abstract。
abstract class Animal//定义抽象类
{
String str;
Animal(String s)//定义抽象类的一般方法
{
str=s;
}
abstract void eat();//定义抽象方法
}
class Horse extends Animal//定义继承Animal的子类
{
String str;
Horse(String s)
{
super(s);//调用父类的构造方法
}
void eat()//重写父类的抽象方法
{
System.out.println("马吃草料!");
}
}
抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据(即final static,但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。
从设计的层面来看,我觉得抽象类与接口有如下几个不同点:
- 抽象层次不同。可以这样理解,抽象类是对类的抽象,接口是对行为的抽象。抽象类对是类整体进行抽象,包括属性、行为,而接口是对类局部(行为)进行抽象。
- 跨域不同。抽象类所跨域的是具有相似特点的类,而接口可以跨域不同的类。抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。