java abstract与interface解析


abstract 定义

在面向对象的概念中,所有的对象都是通过类来描述。但是,反过来,不是所有的类都是用来描述对象的(把类具体化)。如果一个类没有包含足够的信息来描述一个具体的对象,那么这个类就是抽象类。

比如,我们进行一个图形编辑软件的开发,就会发现问题域中存在圆,三角形这样一些具体的概念,它们是不同的,但是它们又都属于形状这样一个概念。形状这个概念在问题域中是不存在的,它就是一个抽象的概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

在面向对象领域,抽象类主要进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方法。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。

abstract与interface的语义分析

abstract class Demo{

    abstract void method1();

    abstract void method2();

    void method3();

 }

abstract demo

interface Demo{

    void method1();

    void method2();

    void method3();

 }

interface demo

  1. abstract class可以有自己的数据成员,也可以有非abstract的成员方法。 interface class中只能有静态的不能被修改的数据成员(必须是statci final的, 不过一般不在interface中定义数据成员),并且所有的方法都是abstract的。
  2. abstract class表示的是一种继承关系,一个类只能使用一次继承关系,一个类却可以实现多个interface。
  3. 在abstract class的定义中,我们可以赋予方法的默认行为。但是在insterface class的定义中,方法不能拥有默认行为。

从设计层面分析abstract class与interface的区别

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}

}

abstract class 总结

  1. abstract class通常包含一个或者多个抽象方法,抽象方法不提供实现。好处允许方法的定义与实现分离。
  2. 包含抽象方法的类必须声明为抽象类abstract class
  3. abstract class的所有子类都必须为超类提供具体实现。子类如果没有实现抽类的抽象方法,会产生编译错误,除非子类也声明为抽象方法。抽象类存在的意义是用来被继承。
  4. abstract class声明了类层次结构中各个类的共同属性和行为,由于不能继承构造函数,因此构造函数不能声明为抽象方法。
  5. abstract class不能实例化抽象类的对象,但是能够声明抽象类型的变量,这种变量用于引用子类的对象。例如,Animal a=null; a=new Dog();
  6. abstract关键字不能应用于static,private,final,方法,因为这些方法不能被重写,因此不能在子类中实现。

interface 总结

  1. 接口以interface开始,并包含一组默认为public的抽象方法。
  2. 接口可以包含变量,默认static final,必须被赋予初始值。
  3. 实现接口就必须实现其中的所有方法。
  4. 如果一个类没有实现任何接口方法,则它是抽象类,必须以abstract声明该类。
  5. 实现接口相当于与编译器达成一个协议,“我将实现该接口制定的所有方法”。

接口与抽象类的优缺点对比

  1. 一个子类如果implements一个接口,就必须实现接口的所有方法(不管是否需要);而继承一个抽象类只需实现需要的方法即可,这是抽象类的一个优点。
  2. 如果一个接口中的方法名改变了,那么所有实现该接口的子类将无法通过编译,因为它们所实现的方法已经不存在,这是接口的一个缺点;而抽象类中的某一个非抽象方法改变了,就不存在这个问题,只是为子类添加了一个新方法而已。
  3. 抽象类的巨大缺点是,一个子类只能继承一个超类。

参考资料:

java中abstract class 和 interface 的解释和他们的异同点(转)

abstract java 关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值