Java零基础学习之路(八)Java面向对象

本章节目标:

了解面向对象,知道类和对象的区别,会进行类的定义。

 

知识框架:

 

 

Java零基础学习之路(八)Java面向对象_第1张图片

Java面向对象编程和面向过程编程的区别

 

“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想,简称OP。“面向过程”也可称之为“面向记录”编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。所以面向过程的编程方式关注点不在“事物”上,而是做这件事分几步,先做什么,后做什么。例如:早晨起来:起床、穿衣、洗漱、上班,只要按照这个步骤来,就能实现“一天”的功能,整个这个过程中关注的是一步一步怎么做,并没有关注“人”这个事物。再例如:开门、调整座椅、系好安全带、踩离合、启动、挂档、给油,只要按照这个步骤来,车就走了,显然关注点还是在步骤上,只要实现每一步就行,整个过程并没有关注“汽车”这个事物。

 

“面向对象”(Object Oriented)是一种以对象为中心的编程思想,简称OO。随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,可以像搭积木的一样快速开发出一个全新的系统。面向对象将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

 

使用面向对象编程思想开发系统,在现代开发中会将面向对象贯穿整个过程,一般包括:OOA/OOD/OOP:

● OOA:面向对象分析(Object-Oriented Analysis)

● OOD:面向对象设计(Object-Oriented Design)

● OOP:面向对象编程(Object-Oriented Programming)

 

面向过程和面向对象有什么关系呢?

面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精。面向对象主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。但对于复杂而庞大的系统来说,面向过程显得就很无力了。

 

为了帮助大家理解面向过程和面向对象,我们再来设想一个场景,假如说编写一段程序,模拟一个人抽烟的场景,采用面向过程的方式是这样的:

买烟->买打火机->找能够抽烟的场合->点燃香烟->开抽,只要按照这个流程一步一步来,就可以实现抽烟场景,采用面向对象的方式关注点就不一样了,我们会想这个场景都有什么事物参与,每个事物应该有什么行为,然后将这些事物组合在一起,来描述这个场景,例如:一个会抽烟的人(对象)+香烟(对象)+打火机(对象)+允许抽烟的场所(对象),将以上4个对象组合在一起,就实现了抽烟场景,其中采用面向对象的方式开发具有很强的扩展力,例如:人这个对象是可以更换的,打火机也是可以更换的,香烟的品牌也是可以更换的,包括抽烟的场合也是可以更换的。如果采用面向过程方式开发,一步依赖另一步,任何一步都不能变化,变化其中一步则整个软件都会受到影响。

网上发现了一篇文章,说了一下OP与OO的不同,并且打了一个比喻,通俗易懂。有人这么形容OP和OO的不同:

用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,"饭" 和"菜"的耦合度比较低。蛋炒饭将"蛋""饭"搅和在一起,想换"蛋""饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。

对于编程语言来说,基于C语言的编程是面向过程的,C++只能说一半面向过程一半面向对象,java语言就是一门完全面向对象的编程语言。有C++基础的同学,学习java应该很快,因为java底层是C++语言实现的。当然,除了java语言之外,还有很多都是完全面向对象的编程语言,例如:C#、Python等。

对于面向过程和面向对象的理解,目前阶段来说还是很难的,毕竟大家现在还停留在只会定义变量,写个if语句阶段,慢慢来吧,我们需要不断的学习后面的内容,然后再加深对面向对象的理解。

Java面向对象特征

Java面向对象具有三大特征,这三大特征目前大家只需要记住,后面我会进行一一讲解:

● 封装(Encapsulation)

● 继承(Inheritance)

● 多态(Polymorphism)

任何一门面向对象的编程语言都具备以上三大特征,例如:python、C#、java等。

Java零基础学习之路(八)Java面向对象_第2张图片

Java类与对象的定义

Java面向对象之所以能够成为主流,那是因为人习惯以对象的方式认识现实世界,例如我说:老虎。那你大脑中马上呈现出一个老虎的样子,对吧。

软件存在的意义就是为了解决现实世界当中的问题,它必然模拟现实世界,也就是说现实世界中有什么,软件中就对应有什么。

Java面向对象编程思想中关注点是“对象”或者“事物”,那么在编程语言当中要想创建对象则必须先有类,那么类和对象分别是什么,它们的区别和联系是什么呢?

类是现实世界当中具有共同特征的事物进行抽象形成的模板或概念。而对象是实际存在的个体。例如:“汽车”就是一个类(所有的汽车都有方向盘、发动机、都能形式,这是它们的共同特征),“你家的那个汽车”就是一个真实存在的对象。或者说“明星”是一个类,“刘德华”就是一个对象。“沈腾”、“赵本山”、“宋丹丹”都是实际存在的对象,他们都属于“笑星”类,类描述事物的共同特征,那么“笑星”类都有哪些共同特征呢?笑星类都有姓名、性别、年龄等状态信息(属性),他们还有一个共同的行为就是“演出”(方法)。但当具体到某个对象上之后,我们发现姓名是不同的,性别是不同的,年龄也是不同的,演出的效果也是不同的。所以我们在访问姓名、性别、年龄的时候,必须先有笑星对象,通过真实存在的笑星对象去访问他的属性,包括“演出”的时候,只有“笑星”类是不行的,必须先有笑星对象,让笑星对象去执行“演出”这个动作。

通过类可以创建对象,对象又被称为实例(instance),这个过程也可以称为实例化。对象1、2、3具有共同特征,进行抽象形成了类,所以从对象到类称为抽象。如下图所示:

Java零基础学习之路(八)Java面向对象_第3张图片

图8-1:类和对象

通过以上的描述,我们得知:类 = 属性 + 方法,而属性描述的是状态,方法描述的是行为动作。行为动作以方法的形式存在,那属性以什么形式存在呢?例如:姓名、性别、年龄,大家想起之前学习的变量了吗?变量用来存储数据。不错,对象的属性以变量形式存在,并且这里所说的变量是我们之前提过的“成员变量当中的实例变量”。为什么是实例变量呢,实例变量就是对象级别的变量,这样的变量要求必须先存在对象,通过对象才能访问。例如:“中国人”这个类,有一个属性是“身份证号”,每一个中国人的“身份证号”都是不一样的,所以身份证号必须使用一个真实存在的“中国人对象”来访问。不能使用“中国人”这个类去访问身份证号。一个类可以实例化N多个对象,假设通过“中国人”这个类创建了100个“中国人对象”,那么“身份证号”必然会有100个实例变量空间去存储。

Java类的设计与发现

理解了类和对象的概念之后,我们开始进行类的设计,那么,应该怎么在现实世界当中发现类呢?例如有这样的背景:开发学生选课系统,要求能够单独对学生信息、课程信息进行维护,还要求能够维护某学生选择某些课程。根据以上的描述,我们可以看到上面的描述中有很多名词,例如:学生、课程等。从这些名词当中就可以发现类,例如:学生类、课程类。所有的学生都有学号、姓名、性别、出生日期等属性,所有的课程都有课程编号、课程名字等属性。

如果我们发现了类,并且发现了类中的属性和方法,那么应该以什么形式展现出来呢,在团队协作开发中应该如何让其他项目组成员知晓你的设计呢,恐怕这个时候就需要使用UML了。Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。 面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。UML规范用来描述建模的概念有:类、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。

其实软件开发和现实生活当中的建造大楼是一样的,在建造大楼之前需要进行前期的设计,这个时候就需要建筑工程师画图纸,图纸上画的都是一些符合某些标准的符号,负责建筑的人员一定是能够看懂这些标准符号的。而UML就是在软件开发方面的一种图标式语言,程序员在进行系统设计的时候,需要画出UML建模图,程序员根据UML建模图进行开发。

那么能够实现UML图的工具有哪些呢?例如:IBM Rational Rose、PowerDesigner、StarUML、MS Visio等,我们接下来使用Rational Rose工具画一个类出来。请看下图:

Java零基础学习之路(八)Java面向对象_第4张图片

图8-2:学生类的设计

通过以上类图,我们可以看到一个学生有学号、姓名、年龄、性别属性,并且有一个考试的方法。其中学号采用整数型,姓名采用字符串类型,年龄采用整数型,性别采用布尔型,考试返回值类型设计为浮点型double。

请大家注意,该小节内容属于了解内容,目前还不需要掌握怎么画这些图,只要知道从名词中发现类,系统开发初期需要进行类的设计,而设计的时候就需要使用UML进行建模,了解几个常见的建模工具就行了。

Java类中的定义

以上所讲内容使用java语言完全可以实现,因为java语言是一门完全面向对象的编程语言,当然,使用其他面向对象的编程语言也可以实现。当进行了类的设计之后,接下来就可以根据UML图进行代码的编写了,在代码级别上实现一个类,类怎么定义呢?

[修饰符] class 类名 {
    类体 = 属性 + 方法
}

以上为类的简单定义,实际上一个完整的类的定义要比以上语法复杂一些,以后再慢慢补充,先从简单的开始。

接下来,根据UML图,使用代码将“学生类”进行实现(只实现属性),代码如下图所示:

public class Student {
	//学号
	int no;
	//姓名
	String name;
	//年龄
	int age;
	//性别
	boolean sex;
}

以上程序当中no、name、age、sex都是属性,它们都是成员变量中的实例变量,所谓实例变量就是对象级别的变量,这些属性要想访问,必须先创建对象才能访问,不能直接通过类去访问,因为每一个学生的学号都是不一样的。没有学生对象,谈何学号! 

 

 

 

 

你可能感兴趣的:(纯干货,Java学习资料,Java相关技术文档,编程语言,python,人工智能,java,大数据)