Java 里的继承的意义是什么

即使是 java 语言的初学者,也对 java 的三大特性稍有了解,封装、继承、多态。

虽然我在《Java编程思想 第1章 对象导论》一文中整体上说过这三者的一些思想,但是一些分支深入探讨的东西还是想在这里写一写。

继承的概念无需多言,那么我们应该使用继承来做些什么呢?也就是本文要探讨的话题:继承的意义是什么。我认为,继承的意义只有一个:为了多态

我在一些项目中看过这样的代码:所有实体都继承一个父类,暂且叫做父实体好了。大家都知道,实体都是没有什么操作的嘛,无非就是字段。所以它这里是把一些常见的字段都写在这个父实体里面了,比如说:id、createTime等。这样,所有的子实体都可以省掉这部分的”重复字段“。

这样的做法貌似很聪明,因为很多人学习继承的时候都有人告诉你,继承可以节省很多重复性的代码。上述的做法是这样的一个活用的典型。

毋庸置疑,继承确实可以节省很多重复性的代码,但这并不是继承存在的意义所在。节省代码的方式起码有两个,继承和组合,我在《Java编程思想 第7章 复用类》中写过相关的文字,当然主要都是Java编程思想的笔记而已。

《Java编程思想 第7章 复用类》里面提到的:

组合比继承常用得多;

        应该慎用继承技术,多用组合。因为组合的方式比继承灵活得多。

        那么应该何时使用继承更加适合呢?下面是判断依据:

                是否需要从新类向基类进行向上转型?

                1)如果必须向上转型,则继承是必须的;

                2)如果不需要,则应好好考虑继承与组合的取舍。        

通常是当你需要使用到多态时才有使用继承的必要性,因为继承相比组合要重量级得多,能开小车为什么要开大货柜?

在上面的例子里,创建父实体的方式完全是多余的。我的理由有三个:

    1、就是上面说的继承使用的必要性。实体没有使用多态的必要,自然就没有使用继承的必要——你的子实体对象永远不需要向上转型成父实体的对象。

    2、肯定还有人说,即使没有这个必要,但是集成父实体确实节省了代码,而这种节省是组合做不到的——我也觉得是做不到的。那我为什么还要说没必要呢?因为根本没必要节省这样的代码。这样的继承情况节省了代码的同时牺牲了子实体的直观性,在你对父实体不够熟悉的情况下,你可能经常需要点进父实体中查看。

    3、实体的主要信息就是字段而不是方法(都是那些生成的set、get方法),而创建一个类,在Java里的意义就是创建一个新的数据类型,继承的所有子类跟父类都可以认为是同一种数据类型,子类只是更加细分的类型但是隶属于父类(就像Java里面的工具类:Number类是数字类,其他的诸如Integer、Double类等都继承于Number类)。这也是为什么他们可以实现向上、向下转型的原因。——这时候回来看实体类,是不是所有的实体都存在着某些共性呢?也就是可以抽象出一个父类,统一所有的实体类都是同一种数据类型:实体类型?咋一看,还真有。但是,一个类,会定义两样东西:自身描述(属性,对外界的抽象)和行为描述(方法,提供给使用者的操作入口)。而实体中的方法定义几乎可以忽略,可认为就是一堆的字段。这些字段每个子实体都是不一样的,虽然他们都有一些相同的字段。既然存在着大量的不同字段,也就是说自身描述差异非常大。那么为什么还要把他们归为同一类呢?

就上述例子而言,创建父实体类的行为是多余的。

同时我们讨论了使用继承主要是用来做什么的:从父类(一种数据类型)派生出子类(细分的数据类型);继承的特性提供了多态的作用。

这是我认为的继承的意义。如果不清楚继承的实际作用,那么所有对继承的使用都变成了东施效颦。效得好,就是西施,效得不好,就变成了东施。

转载于:https://my.oschina.net/watsonos/blog/1031128

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值