学习Java的你,真的会面向对象编程吗?

简介: 学习Java的你,真的会面向对象编程吗?

零、引言 —— 面向对象

 

当今众多编程语言中,在软件领域最火的,无疑是 JavaScript 和 Java,而 JavaScript 编写前端代码,Java 则用于编写软件的后端逻辑代码。在Java中有一个很核心的概念叫做——面向对象,那么,学习Java的你,真的会面向对象编程吗?


 

一、由来 —— 面向对象来源于哲学

 

编程界的面向对象思想,来源于哲学,正如我们之前在高中学过的政治中讲的那样,分为世界观和方法论。

从世界观的角度来看,面向对象的基本哲学认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的,不同对象之间的相互作用和通信构成了完整的现实世界。因此,程序员应当按照现实世界的本来面目来理解世界,直接通过对象及其相互关系来反映世界,这样建立起来的系统才能符合现实世界的本来面目。

从方法学的角度来看,面向对象的方法是面向对象的世界观在程序开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。

在计算机进程中,程序是一段代码组成的,和进程是能描述程序的执行过程且用来共享资源的基本单位。

或者说,程序是静态的概念,进程是动态的概念!

简单地说,类久好比是程序,是静态的概念,对象好比是进程,是动态的概念。

比如你对于理想中的女朋友,她有身高、体重等多个属性,当然这只是你想想而已,这就是类。

当你真(n)正(e)找(w)到女朋友之后,那么那个她,身高体重等多个属性都有对应的值,这就是我们所说的对象!该对象由你的类(理想女朋友)实例化而成。

你看,我这不就new出来了么,还new出了俩......



 

二、类 —— 静态的模板

 

在我们物理或者生物世界中,类代表一种抽象概念。比如狗,它们都有一些具体的、基本的、相同的属性和行为。属性也可以称为变量,行为也叫做方法。在对生物的研究中,我们使用类属概念将世界分门别类,再进行归纳、演绎和研究。

在程序设计领域,类是一个蓝图,或者是模板,定义了某种类型的所有对象具有的数据特征和行为特征。

在Java语言中,程序设计的基本单位就是类,也就是说,一个Java程序是由许多设计好的类组成的。对象实际上是程序运行时通过类创建的一个实例,生成实例的过程称为 把一一个对象实例化 。一个实例化的对象实际上是由若千个实例变量和实例方法组成的。当创建出一个类的实例时,系统将为实例变量指定内存,然后即可利用实例方法去做某些工作。

记住一句话:类是静态的模板,规定了 将该类实例化的对象 的共性。


三、对象 —— 类的实例化

 

在现实世界中,对象一般指一个独立于我们的客观实体,它一般有一定的内部结构,对外表现出一定的性质和行为,并且和周围的世界有一定的交互性。至少占有一定的空间和时间。

在面间对象程序设计中,对象就是数据空间结构加上指令代码,或者可以称作数据与代码的组合。换句话说,面向对象编程中的最基本的概念就是“对象”,它是理解面向对象程设计技术的关键。为了让大家能理解“对象”的概念,我们首先来环顾现实世界中的对象。

我们周围的公交车、手机、狗、办公桌、电动车等都是现实世界中的物理实体,也就是我们所说的对象。现实世界中的对象具有3个特征,即状态、行为和事件响应能力,例如,自行车有状态(传动装置、步度、两个车和齿轮的数目等)和行为(刹车、加速等)。对事件的响应能力是通过行为方法实现的,它代表了一个对象和周围世界或其他对象的一种交互能力。

其次,我们再来看看软件对象,软件对象是现实世界中的对象在计算机内部的模拟化产物,它们也有状态和行为。软件对象把状态用数据来表示并存放在变量中,而行为则用方法来实现。

软件对象用于模拟现实世界中的实体,其对象模型是根据现实世界中实体的状态和动作来确定的,程序设计中的对象用特定的数据结构表示其内部组织结构,用操作数据的方法描述其可产生的行为。在程序设计中,不仅现实世界中的物体可以表示为一个对象,一个抽象的概念也可以是一个对象,用抽象的概念展示的对象就是抽象类,我在后续会一一讲解。

把一个对象的数据加以包装并置于其方法的保护之下称为封装。就像我们在编写项目代码的的实体类时候,会将变量设置成private,即私有变量,然后通过get和set方法,供外部调用获取、更新变量值。

所谓封装,就是对内部数据的隐藏。封装实现了把数据和操作这些数据的代码包装成一个对象 ,而将数据和操作细节(方法)隐藏起来。如果增加某些限制,使得对数据的访问可按照统的方式进行,这样就能比较容易地产生更为健壮的程序代码。

面向对象程序设计还体现了另外一个哲学思想,即意识和物质的不可分性,行为和肉体的不可分性。

以人的大脑为例.如果没有了大脑的神经元细胞物质组成部分,也就是失去了意识,聪明的读者应该明白,这样的人是不会存在的,因为神经元没有了载体。同样,如果一个人的大脑的物质组成正常,将其意识行为去掉,这样的人也只是“植物人”,不是一个真正的人。

所以,结构决定了行为,行为又改变着结构,它们是不可分的。我们只有设计出精巧的数据结构再配以合适的方法代码加上继承和多态,才是真正的面向对象程序设计。


 

四、抽象原则 —— 九九合一

 

面向对象程序设计的原则,也就是我们在编写代码的时候必需遵循的几本设计思路,是前辈给我们留下来的精华,我们一定要好好使用它们。下面我第一个讲的,就是抽象原则。

什么是抽象?抽象就是从大量的实体中抽取出共有的属性和行为,从而形成一般化概念的过程。

在现实世界中,人们就是通过抽象来理解复杂的事物。比如电脑,电脑就是电脑,人们不会将电脑理解为硬盘、CPU、电源等等实际零件组成的结构,而是将电脑当做自己特性行为的对象。

也就是说,我们可以忽略硬盘、CPU的工作原理和过程细节,而习惯于将电脑当做一个整体来认识。

总而言之,如果从一个抽象模型中去除足够多的细节,让该抽象模型变得足够通用,或者说足以适用于多个场景,这样的抽象模型在编程领域非常有用

经过对大量事物的抽象合归类,可以形成相应的类属层次。下图就是Java异常的类属层次。


 

五、封装原则 —— 自己的秘密不给别人看

 

封装原则是一个自然法则,正如我们看到的、学习到的,以及我们周围的一切实体,包括动物、植物、各种人造物品都是封装的。一般情况下,我们只能看到这些物体的“外壳”,而看不到其内部结构。

这种将内部结构和功能对外隐藏,只留下必要的接口和外界进行能量或信息交流的机制就是封装。例如人类,内脏、血管、神经都被封装在皮肤里面,对外表现出来的仅仅是皮肤和五官接口,也就是说,我们都是内聚性很强的对象个体,但我们又留有眼、耳、鼻、口等接口,我们通过这些接口在世间生存和忙碌。如果仔细观察,动物世界中的大多数动物都具有很好的封装性。

在面向对象程序设计中,我们应 该遵循同样的原则,将 对象的内部结构对外做信息隐藏,让外部不可访问,但提供一系列的公有接口,用来进行信息和能量交换。

在Java语言中,实现封装的关键字是private,提供接口的关键字是public。

 


六、继承原则  —— 爸爸的东西,就是我的

继承原则也是一个自然法则,如果没有继承,我们的生物世界就会永远处在生物链的底端,就不会出现如此丰富多样的生命世界。

继承是发展的一部分,只有不断地继承旧的、成熟的东西,才能发展出更新的、更先进的东西。不然,我们就会在原地踏步,永远重复。

继承也是存储的另一种形式,是程序的动态存储方式。我们的学习、工作都依赖于此,如果没有继承,则我们早晨起床后就会是一一个“新”的我,跟昨天没有关系。我们的生长和记忆都是在继承昨天的基础上开始的。继承不是简单的复制,其基本内涵就有改变的含义,所以有继承才有进化,这也是“生命是程序”的另一个证据。

在面向对象程序设计中,我们将从已经存在的类产生新类的机制称为继承。原来存在的类叫父类(或叫基类),新类叫子类(或叫派生类),子类中会自动拥有父类中的设计代码,还可以改写原来的代码或添加新的代码。

继承带来的好处有两个方面,一方面可减少程序设计的错误,另一方面做到了代码复用,可简化和加快程序设计,提高了工作效率。

继承不仅仅是简单的拥有父类的设计代码,继承机制本身就具有进化的能力,跟生物世界一样,子代总是比父代更能适应环境。我们通过对父类的设计做一些局部的修改,使得子类对象具有更好的适应能力和强大的生存能力。


 

七、多态原则 —— 兄弟姐妹各所其长

     多态原则是生物多样性在面向对象程序设计中的应用,面对同样的刺激、消息等,不同动物的反应是不一样的。在面向对象程序设计中,如果我们有许多不同的对象,每个对象都具有相应的执行代码。对每个对象发送同样的消息,每个对象的执行代码是不一样的,这就是面向对象程序设计中的多态。


     在具体实现上,指程序中定义的引用变量所指向的具体对象,和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。

因为在程序运行时才确定具体的对象,这样不用修改源程序代码就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态性增强了软件的灵活性和扩展性。

多态性是面向对象编程的基础属性,它允许多个方法使用同一个接口,从而导致在不同的上下文中对象的执行代码可以不一样。

Java从多个方面支持多态性,一是每个方法都可以被子类重写:二是设立interface关键字。二是,Java还支持通过方法重载实现的静态多态方式,即通过在编译时根据方法的参数不同选择编译不同的实现代码来实现多态,在运行时不再根据上下文改变。

由于父类中的方法可以在子类中重写,因此,创建类的层次结构非常简单。在类的层次结构中,每个子类都是它的父类的特化。

在 Java中,父类的引用可以指向子孙类对象,从而可以通过父类引用来调用子类对象的方法。

在Java中,多态是通过动态绑定实现的,在通过父类的引用调用某子类对象的一个方法时,会自动执行由该子类重写后的版本。因此,可以用父类来定义对象的形式,并提供对象的默认实现,而子类根据这种默认实现进行修改,以更好地适应具体情况的要求。  


总之,在父类中定义的一个接口可以作为多个不同实现的基础。


 

八、总结 —— 面向对象的编程

 

面向对象最初是一种编程方式,现在成为了一种思想,也就是说是一种广为应用的核心思想。

当然聪明的您,也可以理解为女朋友,那也不是不可。

在面向对象程序设计中,程序设计的目标发生了变化,设计的重点不再是程序流程的设计,而是抽象出一套代码模板,也就是我们最前面讲的 这个概念。

在程序运行时,用这些类实例化出所需的对象,可以是一个,也可以是多个,每一个对象都有自己的变量值数据和方法行为。这些对象相互合作交互,最终完成整个程序的功能。

参考文献:《Java语言面向对象程序设计(第二版)》 清华大学出版社


相关文章
|
23天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
8天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
28 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
16天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
38 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
31 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
33 1
|
1月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
22 1
|
30天前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
34 0
|
1月前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
41 0