Java为什么要区分extends和implements?

段槿年


不请自来~

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开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


这是一个非常好的问题,在Java的学习和认知过程中,好的问题能让学习者迅速掌握Java语言的脉络从而建立Java编程思维。

那么Java为什么要区分extends和implements呢?在我看来有以下几点原因:

第一,定位不同。extends的定位是“扩展”(类扩展类、接口扩展接口),而implments的定位是“实现”(类实现接口)。在Java中,扩展是同一类事务之间的关系,而实现则是实体和抽象之间的关系。但是这里面有一个例外,那就是“抽象类”,抽象类也称为“半抽象”,其实抽象类采用implments在逻辑上也是能讲得通的,但是Java为抽象类赋予的定义是“类”而不是“接口”,所以这也就能说得通了。

第二,用法不同。extends可以用于类与类之间,也可以用于接口与接口之间,但是extends用于类之间与用于接口之间是不同的。extends用于类之间更倾向于继承,而用于接口之间更倾向于扩展,继承只能是单继承,而扩展则可以多扩展。implements则是类与接口之间的应用(实体与抽象之间的应用),一个类可以同时实现多个接口而不影响结构的清晰性。

第三,表现不同的面向对象思想。Java当中extends与implements与多态的关系非常密切,可以说没有这两个关键字就没有多态。但是这两个关键字体现的却是不同的面向对象思想,一个强调拿来主义,另一个则强调按标准办事(抽象也往往称为标准)。

其实extends与implements之间也有相同的地方,比如都是对体系结构的表述,也都可以完成属性的传递等。

我在头条上写了关于Java学习的系列文章,如果大家感兴趣的话,可以关注我的头条号并查看,如果有关于Java编程方面的问题,也可以咨询我,谢谢!


IT人刘俊明


这个问题涉及到面向对象的三个基本概念(继承,多态,封装)中的继承和多态。请听我慢慢道来。

继承

究其本质继承有两个目的。

  • 统一接口使子类可以被重载,这是通过抽象类(Abstract)实现的。在讲到多态的时候,再详细说说接口的应用。
  • 由父类保证子类的一致性,这是通过extends实现的。教科书上喜欢用猫狗继承了动物的共性来解释子类继承父类的概念。我倒认为这个说法容易导致混乱。讲一个真实的事例,我需要对同一组数据做两种输出报表,一个是网页而另一个是Excel报,重要的事情是保证这两个报表的数据一致。因此需要把数据部分做成父类,输出部分做成两个子类。可我的程序员只考虑了报表这一共通属性,反其道而行之,做出来的程序Bug无数致使项目一度失控。

多态

多态的目的是实例化时可灵活加载不同的类而无需变更接口。这是面向对象程序语言的一大特色。多态有两种实现方法。

  • 定义抽象类通过多个子类的继承实现多态。这个方法的好处是可以保证子类处理的一致性。这一点在上面已经解释过了。这样的重载被限制在单一的父类上,有些不够灵活。
  • 定义interface通过多个类的implements实现多态。这个方法可以最大限度地把多态的特性发挥出来。需要注意的是,虽然类的接口相同但处理是完全独立的。

两个实现重载的方法各有利弊,可根据需要灵活运用。

小结

概括起来,extends实现了继承,implements实现了多态,对Java来说两个语句都很重要,不可或缺。通过运用继承和多态这两个特性,以Java为代表的面向对象的程序语言可以实现程序架构的继承(抽象工厂模式是个典型的例子),在构建大型系统方面展现了巨大的优势。

对设计模式有兴趣的小伙伴可以提出问题,我有很多故事可以分享哦。


日冲信息 黄


作为一个C#的程序员我来解释下。

其实在C#领域是可以extends多个类的这点和java不同,但是依旧有implements。

所以说这个设计是为了多继承是很片面的,因为Cs能做的继承多个类Java设计者肯定也可以做到。

言归正传。一般说继承,主要是抽象类和实体类。类的特点就是,有属性,有方法,可以把功能抛给子类实现也可以自己提供通用属性和方法给子类服务。也就是说,所有的子类都具备了父类的特征,都是需要借助父类帮助才能实现功能的类,父亲给了子女呵护,但是同时,也有父亲强加给子女的东西。一开始父亲只是满足孩子的想法,后来父亲一想,天冷了,要穿秋裤。然后给在子女未知的情况下买了一堆秋裤。甭管你喜不喜欢,你必须穿着就对了。

我对接口的理解就是说明与目录,我要干某件事,但是我不知道步骤,于是接口告诉我你需要准备什么就行了。我一看能接受,就去做了,自己砍柴,自己挑水,虽然辛苦,但是怎么做的都是我掌握的。忽然,有一天目录上突然添了一项,穿秋裤,添加人告诉我,要么你穿秋裤,要么你换其他秘籍试试?要么你随便应付下,不过后果自负。不管怎么说,你给个交代。选择权完全在子类手上,你可以和大家一样,也可以做不一样的烟火,你只要应付完接口交代你做的事,没有什么能控制你的。

码了那么多,好像跑题了?算了,就这样吧。


小汐vivi


首先先理解这两个关键字,

extends是类继承类 接口继承接口的关键字

implement是类实现接口的关键字

java中很重要的一个思想多态就涉及这两个关键字 从多态入手

多态的前提是:

1 继承(实现父接口)

2重写

3向上转型

如果父类是实体类 那么子类就使用extends 继承父类 因为没有抽象方法

如果父类是接口 那么子类就使用implement实现父类 实现父类中的所有抽象方法

我是一个在校大学生 可能讲的不是太明白,见谅😂


好名字都让猪起了27


如果题主是学java编程,这样的问题并不好(原因后面解释)。如果是挑战java规范,答案就简单了,者就是一种设计。

java语言诞生于面向对象编程理论与实践都相对成熟的年代。java语言开发者改良了对象多重继承思想,代之以可以扩展(extends)的接口(interface)。接口的方法缺省条件下是抽象的(aberstract)。

一个类(class)可以实现(implements)0到多个接口,但是只能扩展(extends)一个类。你觉得(implements)和(extends)的语义上有重叠吗?

说这个问题不好的原因是,只有上来就试图通过调试代码来学习java语言,才会遇到题主的问题吧?最简单的java语法介绍都会说到本文前边的语法特点吧?


井151276607


我发现,编程语言中的很多东西其实是为了防止学渣挖坑。为了引导学渣少挖坑多铺路,java平台推出特殊的抽象类(接口),要求开发者继承(实现)特殊的抽象类(接口)时必须重写所定义的方法。


分享到:


相關文章: