不请自来~
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的标准,各个数据库厂商都争着实现,咱自己编个啥语言出个接口,看人家理不理。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有