abstract class和interface在Java语言中都是用来进行抽象类定义的
Interface ,给外界的接口,按照规定办事;
Abstract ,内部继承关系;
interface 就是一组操作的集合,它定义了一个行为集但不作任何具体的实现,这样的话,具体的操作 都可以放在实现类中去,
体现设计与实现分离的设计思想。
在面向对象的概念中,所有的对象都是通过类来描绘,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
抽象概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
=====================================================================================================================
使用abstract class的方式定义Demo抽象类的方式如下:
abstract class Demo {
abstract void method1();
abstract void method2();
…
}
使用interface的方式定义Demo抽象类的方式如下:
interface Demo {
void method1();
void method2();
…
}
====================================================================================================================
从编程层面看abstract class和interface
abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系
一个类却可以实现多个interface
在abstract class的定义中,我们可以赋予方法的默认行为
在interface的定义中,方法却不能拥有默认行为
======================================================================================================================
例如要设计一个形状类MShape,从此类可以派生 方形、圆形、三角形等子类。我们就可以将MShape这个父类设计为abstract类。
比如,子类都有 color 属性,因此可以把 color 这个数据成员,以及给 color 赋值的method均设计在父类中,
这样就不用在每个子类中设计相同的代码来处理 color 这个属性。
而如果想计算几何形状的面积,由于各个几何形状的面积计算方式都不相同,所以把计算面积的method的处理放在父类中就不合适,
但由于每个几何形状都需要用到这个method,因此可以在父类中只声明计算面积的method "area()",而把具体的处理放在子类中定义。
即把area()设计为抽象类。
以下是程序代码:
//abstract类 MShape
abstract class MShape
{
protected String color; //数据成员
public void setColor(String mcolor) //一般方法,定义了具体的处理
{
color=mcolor;
}
abstract void area(); //抽象方法,没有定义具体的处理
}
//方形类
class RectShape extends MShape
{
int width,height,rectarea;
public RectShape(int w,int h)
{
width=w;
height=h;
}
public void area() //计算面积
{
rectarea=width*height;
}
}
//使用
public class myapp
{
public static void main(String args[])
{
RectShape rect=new RectShape(3,6);
rect.setColor("Red");
rect.area();
System.out.print("color="+rect.color+", area="+rect.rectarea);
}
}
由此可见,在abstract中不仅可以定义一般的方法(即可以进行具体处理的方法),还可以象interface一样定义抽象方法。
而在interface中只能定义抽象方法。