extends和implements都是Java最基础的知识点,本来没有必要回答这个问题,但是看了一下别人的答案,基本上还是讲基本的概念,念书谁不会啊,都没有讲到两者的真正作用,特别是implements,偶给大家分享分享偶的体会。
解耦
implements的重要作用之一,就是为了解耦。这是什么意思呢,给大家举个例子。
由于Java的多态,接口的调用者,只需要调用接口就好了,具体接口中的功能,就让接口的实现者去实现好了。这样的好处是,避免接口的调用方直接参与接口逻辑的实现,避免调用方和实现方的关系过于紧密(修改或增加实现方的时候,还需要修改调用方的代码),这就是解耦。要注意:
如果一个接口就一个实现的话,没有必要过度设计,只会加大代码的复杂程度(不过需求未来的变化,是预测不到的)。
只有一个实现的话,也会存在迁移的问题,比如现在使用的Oracle数据库,准备迁移到Mysql数据库上,使用面向接口编程的话,只修改数据库相关的实现即可。
接口的实现不是new出来的。
举个例子(可能不是非常恰当,主要为了理解),这幅图大家应该很常见吧,这个是的登录页面:
QQ、微信都是第三方登录,那么应该设计好接口,QQ登录是一个实现,微信登录是一个实现;如果未来支持微博登录的话,那么就在增加一个实现。然后通过工厂模式获得对应的实现类,而不是直接在代码中写:if(登录方式选择QQ){实现}。
设计和实现分离
implements另外一个重要的作用,就是让设计和实现分离。制定好标准,可以让调用方和实现方各做各的,互不影响;也可以让不同的实现方,都用一个标准来实现,避免调用方的改动。
用JDBC举例,很容易理解(使用Mysql举例):
大家只看这一句:DriverManager.getConnection(URL,user,password);
JDBC连接Mysql和其他数据库的实现细节肯定不一样,如果都让java实现的话,每一种数据库都要兼容,这是不可能的。
如果完全让每个数据库的实现方写,mysql的连接方法名叫getConnect,DB2自己写的时候叫getCon,谁也不服谁,都觉得自己是最优的,这时候调用方就麻烦了。
Java(最早是sun公司)一看不行,偶给你们规定好吧,都叫getConnection,你们就按照偶的写,偶提供接口,你们实现。
于是,当通过JDBC连接Mysql的时候,需要引入mysql的jar包,可以看到其中的代码都是实现了java.sql.Driver:
另外说两点
一流的公司做标准,这句话好理解了吧。
软件生态圈很重要,一方面的意思就是:Java做的牛了,出个JDBC的标准,各个数据库厂商都争着实现,咱自己编个啥语言出个接口,看人家理不理。