抽象类abstract和接口interface的区别与深入思考

在以前的编程过程中,经常对abstract和interface混淆,相信很多初学者都有这样的困惑,也问过很多经验丰富的程序员,他们也不能清楚地说出个所以然来。经过自己的思考,想到了一种比较形象的方式来区别和深入理解abstract和interface的概念。

abstract和interface的区别不仅仅是一种程序上的区别,更是一种设计思想的区别。

一、前提知识:abstract是一种继承关系,一个类只能使用一次继承关系;interface其实也是一种特殊的abstract class,但是一个类可以实现多个interface。

二、现实场景:现有一辆车car,它具有基本的开车driver和停车stop动作,Car是一个抽象的概念,他可以实例化为轿车、卡车等,我们可以用abstract和interface两种方法去定义这辆车car。

abstract class Car{
    abstarct void driver();
    abstarct void stop();
}
interface Car{
    void driver();
    void stop();
}
    如果要实现卡车类struck,我们可以通过两种方法实现:1.extends Car,2.interface Car;两种方法看起来都可以实现,现在我们需要在struck类上添加一个GPS功能,应该如何实现?当然我们可以在abstract Car 和 interface Car中添加方法,如下:

abstract class Car{
    abstract void driver();
    abstract void stop();
    abstract void GPS();
}

interface Car{
    void driver();
    void stop();
    void GPS();
}
然后两种方式去实现:

class Struck extends Car{
    void driver(){};
    void stop(){};
    void GPS(){};
}
class Struck implements Car{
    void driver(){};
    void stop(){};
    void GPS(){};
}
这两种方法都可以实现在struck中添加GPS功能,但是我们深究一下,其本质是一样的吗?

三、分析本质:1.GPS与Car的关系——Car在这里有两个主要动作:driver和stop,而GPS是struck需要添加的功能,GPS并不是Car的基本属性一部分,GPS应该是一种另外的个体,所以GPS与Car是不同的范畴。

2.两个不同概念的实现——GPS和Car两个不同概念,现在需要在struck中集中表现出来,我们可以有一下方式:A.继承extends——(再定义一个abstract class GPS)因为一个类只能单一继承,要struck继承Car和GPS显然是行不通的,所以继承的方法不行;B.接口implements——(再定义一个interface GPS)struck可以实现GPS和Car两个接口,这种方法可以实现;C.继承与接口extends+implements——Struck可通过extends一个GPS(或者Car)在implements一个Car(GPS)实现,这种方法可行。

3.比较实现方法——在这里,我们需要理解清楚一个问题:卡车Struck到底是Car还是GPS,这里的答案很清晰,必然是Car。我们知道,继承关系extends是一种“is-a"的关系,那么卡车Struck是Car的一种,也是”is-a"关系,所以Struck与Car之间的关系应该是继承extends的关系,我们应该用abstract class来完成。

另外,Struck与GPS不是一种“is-a"关系,Struck只是具有GPS的功能,所以Struck不能使用继承的方法去完成GPS的功能,但是我们可以通过interface方式来实现。

abstract class Car{
    abstract void driver();
    abstract void stop();
}
interface GPS{
    void GPS();
}
Struck实现:

class Struck extends Car implements GPS{
    void driver(){};
    void stop(){};
    void GPS();
}
abstract和interface虽然在用法上很接近,但是我们可以通过本质来观察到其实两者之间是具有很大的差别。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值