摘要:面向对象与面向过程的区别要知道,二者并不是非此即彼,而是相辅相成的。而面向过程,则在微观上对对象内部进行具体的实现。面向对象的三大特性说到面向对象,就不得不说其三大特性封装继承和多态。封装封装是面向对象最基础的特性。
作者:伯特
出处:github.com/ruicbAndroid/LoulanPlan
声明:本文出自伯特的《LoulanPlan》,转载务必注明作者及出处。
刚学习 Java 那会就接触了“面向对象”的概念,但当时并没有太多实战经验,所以对其的理解也仅限于概念。当工作两年后再回顾一下,有些概念能够落地了,遂记录一下,作为 LoulanPlan 的开篇。
1. 什么是面向对象面向对象是一种程序设计的思想,而不是一种方法,亦或准则。其指导我们从现实世界中客观存在的事物出发,进行程序设计。
2. 什么是对象Everything is Object,在 Java 语言的世界中,万事万物皆对象。上面提到“从现实世界中客观存在的事物出发”,这里客观存在的事物,我们称之为“对象”。
在程序中,对象是程序的基本构成单元,是客观存在的事物的体现。一个对象通常由一组属性和对这组属性进行操作的若干服务(方法)构成。
3. 面向对象与面向过程的出现面对简单的软件程序,我们往往不需要考虑过多的设计,任何一个小的功能单元或模块,都可以按照一定的步骤去实现,这种 step by step 的方式即为面向过程。
随着程序的复杂性提升,我们无法按步骤去描述并实现编码,所以面向过程已无法适应。加之考虑到代码的可读及复用性等,便有了对象的概念,以及面向对象的编程思想。
当然,还有面向组件、面向服务等设计思想,不在此讨论。
4. 面向对象与面向过程的区别要知道,二者并不是非此即彼,而是相辅相成的。
面向对象思想要求我们从宏观上进行程序设计,抽象出一个个“对象”。而面向过程,则在微观上对“对象”内部进行具体的实现。
可以看出,面向对象最终还是离不开面向过程。
举例来说,需要编程实现绘制圆形、三角形、矩形。
面向过程实现:
drawCircle... //一坨绘制相关的代码,下同 drawTriangle drawRect
面向对象实现:
//抽象出画笔对象 class Painter { drawCircle(){ //上述面向过程实现,下同 } drawTriangle(){} drawRect(){} } //面向对象,使用画笔绘制 1. painter.drawCircle() //此处只需要调用对象的方法,下同 1. painter.drawTriangle() 2. painter.drawRect()5. 对象与类
前面介绍了对象以及面向对象,下面回到 Java 中聊聊类的概念。
5.1 类我们常说“物以类聚”,表达“ 同类的东西聚在一起”。其实 Java 中的类也可以这么去理解:“物”即客观存在的“对象”,同类物体的特征描述,即为“类”。
上面是我的个人理解,用术语概括就是:类是客观事物的抽象,或者说是对现实生活中事物的一种描述(属性和行为)。
例如前面定义的 Painter 类,是对客观事物画笔的抽象,包含了一些绘制的方法(行为)。
5.2 对象与类的关系类进行实例化可生成对象,所以,类的具体表现或者实例就是对象,而对象的抽象或者总概括就是类。
6. 面向对象的三大特性说到面向对象,就不得不说其三大特性:封装、继承和多态。
下面简单说说自己的理解吧,就不再贴相关示例了,网上有很多优秀的例子。
6.1 封装封装是面向对象最基础的特性。在前面介绍对象时,提到“一个对象通常由一组属性和对这组属性进行操作的若干服务(方法)构成”,这里的构成体现的就是封装性。
封装,是指对外隐藏对象内部的属性和实现细节,只提供相应的接口和方法进行交互。一方面,外部只需专注于对象所提供的能力,而不用关心内部实现细节;另一方面,避免了外部随意修改或访问内部属性和方法,从而提升了程序的健壮性;同时,封装能提升代码的复用率。
6.2 继承继承指一个对象从另一个对象中获得属性和方法的过程,继承者称为子类,被继承者称为父类。继承使得子类对象拥有父类对象的全部属性与方法(非私有)。
Key point:
子类也可以被其他类继承成为父类;
父类可以拥有多个子类,但一个子类只能有一个父类。这一点与现实中父亲与孩子的关系是一致的;
Java 中任何类都是 java.lang.Object 的直接或间接子类;
子类不能继承父类中访问权限为 private 的成员变量和方法;
子类可以重写(override)父类的方法;
子类可以通过 super 关键字访问父类的成员变量、方法和构造器;
final 声明的类或方法,不能被继承或重写;
6.3 多态多态是在继承的基础上实现的,多态实现的三个必要条件:
继承
方法重写(override)
父类引用指向子类对象,例如:Human human = new Man(),这里 Man extends Human。
当使用多态方式调用方法时,会依据以下规则:
首先检查父类中是否有该方法,如果没有,则编译错误;
若子类重写了该方法,调用子类的重写方法;
若子类没有重写该方法,则调用父类的方法;
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
7. 总结以上是本文的全部内容,希望能对你有所启发。内容说不上全面、无误,还望读者朋友补充、指正。
最后,感谢阅读。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72244.html
摘要:可实现单例模式代码块初始化静态变量,只被执行一次内部类不能与外部类重名,只能访问外部类静态数据包括私有多分支选择整型或字符类型变量或整数表达式开始支持。 前言 大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性。互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了。 而学习新技术总要付出一定的时间...
摘要:前言系列文章目录我们都不陌生也是面试几乎必问的考点本系列我们来深入思考有关的设计思想和实现细节解决了什么问题任何数据结构的产生总对应着要解决一个实际的问题的产生要解决问题就是如何有效的存取一组键值对键值对是最常使用的数据形式如何有效地存 前言 系列文章目录 HashMap我们都不陌生, 也是java面试几乎必问的考点, 本系列我们来深入思考有关HashMap的设计思想和实现细节. Ha...
摘要:在这些类当中有其自身的实现一般都是用来比较对象的成员变量值是否相同,而不再是比较类在堆内存中的存放地址了。举例说明结果说明中有其自身的实现,属于内容比较。 在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: showImg(https://segmentfault.co...
阅读 2276·2021-11-24 10:18
阅读 2707·2021-11-19 09:59
阅读 1695·2019-08-30 15:53
阅读 1168·2019-08-30 15:53
阅读 1039·2019-08-30 14:19
阅读 2465·2019-08-30 13:14
阅读 2955·2019-08-30 13:00
阅读 1893·2019-08-30 11:11