java抽象类重载_Java关于方法重载,多态,抽象这一系列怎么学?

概念上其实很简单,明晰没有歧义性,找本Think in Java的书或任何一本讲OOP的书都可以看明白。

程序设计语言一路走来,程序设计方法一路发展,在解决什么问题呢?

其实解决问题主要是可维护性和重用性。

首先一个软件项目,可能从最初的需求分析,到设计,到实现,再到发布后的不断围护,可能长达十年,十年内可能需要增加各种功能特性,来满足不断出现的需求。而这期间,可能换了许多次程序员,可能代码不断修改,那么怎么让代码在这种条件下能够继续稳定运行呢,而不是改一下,出现很多Bug,然后修正一个Bug有很多新Bug出现,代码规模越来越大,越来越复杂,如果没有好的办法就会濒于失控的边缘?

软件可维护性的一个重要特性是可读性,如果后面的程序员看不懂前面写的代码,维护又从何说起?软件可维护性还要依赖可扩展性,也就是说通过扩展,而不是修改已有代码的方式支持新的功能,可维护性还依赖可复用性,相同或近似的逻辑如果只在一处代码中写,比在多处都写要容易维护的多。

首先提出的一个办法是结构化编程,结构的意思是代码像一颗树的结构似的,大代码块套小的,此外没有更多节点间的跳转,也就是去除goto语句,代之以三种程序结构的组合:顺序,分支,循环。这样像面条似的来回跳转的代码就没有了。

后来又提出函数,也就是把可能需要重复使用的代码块,起一个名字,把这个代码使用的变量作为参数传给这个带明字的代码块,然后,把修改的变量作为返回值,或输出参数返回。这样多次使用时只要把实参赋给形参就好,每次调用可以带不同的实参。相同的逻辑在一个函数里修改就好。

后来提出了模块,把若干相关联的函数和静态变量作为一个模块,物理上可能是一个库,在C/C++中可以include一个模块的头文件,就可以使用这个模块的函数,在打运行文件时,把库link到一起,或者作为动态链接库(DLL)。

再后来,就提出了面向对象的方法,把变量和函数绑定在一起,限制成员变量和成员函数的可见性,代码的封装程度更高了。

面向对象的方法论,其实是想以我们认识现实世界的方法来认识我们的代码,比如说,有个体-类别的关系(实例/对象,与类/类型),有个性和共性的关系(子类与父类),有组成关系(类与成员变量)和包含关系,通过这些方法就可以增加代码的可读性。

面向对象方法提出了松耦合和高内聚的原则,也就是模块之间的依赖越少越好,依赖少数发布出来的特性,而非内部实现细节,每个模块对外向外是一个满足特定规格的黑盒子,就像(数字)集成电路那样,只要说明管脚上的电气特性就好,比如什么电压范围是0,什么电压范围是1,哪个是接地,哪个是电源,哪些是输入,哪些是输出,同步还是异步,时钟信号怎样等等。

面向对象程序设计的专家认为软件也能像硬件那样,不是由分立元件组成,而是由集成电路组成。

面向对象方法还提出了SOLID原则,包括单一责任原则,开闭原则,里氏替换原则,接口隔离原则,依赖反转原则。

这些原则都是为了增加代码的复用性,可扩展性,最终达到可维护性。

就像研究物理需要抽象一样,通过一个抽象的模型,可以去除无关细节研究一类现象,软件代码如果想复用,也需要进行抽象,来满足一类需求。

比如,在屏幕上画一个圆吧,可能有实心圆,也可能有空心圆,圆的边框可能是粗的,细的,实线,虚线,可能是不同颜色,可能有阴影。我们要把其中的共性抽取出来,有以下属性:背景色,边框颜色,边框粗细,边框风格,阴影与否,那么就可以在多种圆中复用这部分代码,我们可以有一个draw方法,还可以通过继承方法开发自己的子子类编写自己的draw方法,先调用父类的方法画圆,再在圆里画填充纹理等。那要画太阳,汽车,盘子,也可以通过组合的方法把圆和直线或曲线组合起来,而不需要重新写一份画圆的代码,这样当修改圆的画法时,只需要修改一份,而不是在太阳,汽车,盘子里分别修改。

为了以后更好的重用代码,还要将稳定的特性和易变的特性分离开,稳定的特性在父类里实现,易变的方法可以提供方法让子类去实现。这样的好处是增加或修改需求时,可以写一个新类从父类继承,然后通过工厂类或依赖注入的方式用新类,或者替代旧类,或者作为另外的选项。

面向对象程序设计,还把面向对象从编码阶段,推到前面的需求分析和设计阶段,提出了建模语言UML,关于如何提高代码的重用性,专家还提出了设计模式的概念,后来提出了重构的概念,即以稳定可控的方式调整代码结构,来增加代码的重用性,而不引入新的bug。

关于重载(Overload)和重写(Override),术语可能有点拗口,可以参看:Java 重写(Override)与重载(Overload)

关于多态(Polymorphism),就是同一个行为有不同的实现细节,比如许多动物都会叫,羊是咩咩,牛是哞哞,狗是汪汪,猫是喵喵,鸡是咯咯哒,鸭子是呱呱,叫这个行为,有多种不同表现就叫多态。

再比如有个绘图的类叫Shape,该类有个方法叫draw,往屏幕上绘制不同的图案,有不同的形状,比如矩形,三角形,五边星,圆形,椭圆形,新月形,五角星,都可以实现自己的draw方法,那么一个组合图形呢,只要在相对位置上调其draw方法就好,而不需要关心是哪一种图形。这个就是多态的概念和好处。换句话说,代码面对的是一类有共性的行为,而不关心各自个性的不同。那么你再扩展更多的原子图形,都不需要修改已有的组合图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值