37

谈谈面向对象的三大特性

 6 years ago
source link: https://mp.weixin.qq.com/s/rdDpC6dNKqQAZKz7_-TdDg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文阅读时间大约需要5分钟。

参考答案

封装:常见的编程范式有:过程式编程、面向对象编程、函数式编程,现在函数式编程很火,但是面向对象编程依然是主流。

  • 在Java中,封装是一种抽象机制,Java中提供了类和对象的概念,对象包含了一组数据和行为,并且可以响应对应的请求,这样的机制有助于开发者面向具体的领域问题编程,而不是像之前过程式语言中一样,就按照一步步的步骤来处理一些数据。在这里并不是说之前的语言不够好,而是说应用成本的问题,C语言不支持面向对象,但是也产生了unix、linux这样伟大的软件,但其实编程思想是相通的,在linux内核中有很多地方都用到了面向对象的编程思想,只是实现起来有一定的难度和门槛,而Java提供的抽象机制降低了这个门槛。

  • 封装的本质是信息隐藏,信息隐藏的初衷是为了将容易改变的代码和不经常改变的代码隔离开,以便控制代码变更的影响面。

继承:继承的目的是为了代码复用。有了封装,有了类和对象这种机制,可以将一些数据和行为封装再一个类里,但是还有问题没解决:如果有几个类有类似或共同的行为,就需要做很多重复性的工作。为了解决这个问题,Java提出了继承的概念。

  • 当继承一个现有类型时,就产生了新的类型,这个新的类型不仅包括父类的所有成员,更重要的是它复制了基类的接口;子类型的对象可以被父类类型的变量引用,反之则不行。

  • 有两种方法可以让子类和父类产生差异:直接在子类种添加新的方法和成员变量;改变现有父类的行为,在Java种的术语叫做覆盖(overriding)。

多态:多态的提出是为了将解决方案和逻辑复用,实现良好的 可扩展性

  • Java中的多态是依靠接口实现的,定义一个接口, 面向接口编程 ,具体的实现类可以有多个,后面再增加新的实现类的时候,不会对使用这个接口的业务逻辑产生影响。最经典的例子就是绘图例子:定义一个generic接口,编写的方法操作的都是泛化的类型而不是具体的类型,这样后面再加入新的类型的时候原有业务逻辑不需要改变。

  • Java中的多态的实现是 运行时绑定 ——编译器无法直到会运行哪一个实现类的代码,编译器会产生对一个具体函数的名字的调用,在运行时再将这个调用解析为具体代码的地址。

参考答案

面向对象理论的三个基本概念:封装、继承、多态的知识点在上面已经梳理过了,这里给出在OOP方面急需深入的建议。面向对象是一种很好的编程范式,不过我们不能手里拿着锤子就看到啥都是钉子,还需要扩展下自己的视野。这几年非常火的函数式编程范式,就是一种值得学习的编程范式,他跟面向对象不同,卖点在于:函数作为一等公民,函数的调用没有副作用。

再回到面向对象的学习,OOP学完,就可以学习OOD,然后要多做项目,项目做得多了以后,就有机会沉淀出很多经验和固定的套路,这就是设计模式,也值得学习。

基本理论、设计模式都准备好后,应付初级的Java面试就没问题了,不过我们这里还可以再扩展下。设计模式是针对代码级别的套路总结,如果把场景扩大到架构层面,就需要看架构模式了,之前有写过一篇文章总结了常见的架构模式。最后要注意,空学理论没什么用,一定要在项目中应用,否则就是过个眼瘾,没啥价值。

架构模式、设计模式都属于技术范畴,如果要应对更复杂的业务场景,只是基本的OOP和OOD是不够用的,这时候就需要用到DDD(领域驱动设计),领域驱动设计就是为了解决复杂常见而生的。当然,场景可能更加复杂,例如我们要做平台化,那么就需要做进一步的抽象,也就是所谓的领域的领域,这块就比较深了,是我努力的方向。

你再主动一点点    我们就有故事了


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK