Java从入门到精通

Java从入门到精通
作者: 孔祥月
出版社: 中国商业
原售价: 88.00
折扣价: 14.08
折扣购买: Java从入门到精通
ISBN: 9787520823852

作者简介

"孔祥月 高级软件工程师,曾担任多个大型项目的主管。工作之余喜好写技术类博客,分享编程领域内的相关知识,对Java有较深入的理解。"

内容简介

"第5章 类与对象 本书的第1章提到了Java是一门面向对象的语言,那什么是“面向对象”呢?下面我们就来具体解释一下这个概念。 5.1 面向对象 面向对象程序设计方法(Object-Oriented Programming,OOP)是一种运用对象、类、继承、封装等概念来构造计算机程序的方法。它要求从现实世界中客观存在的事物出发来建立软件系统,强调直接以现实世界中的事物为中心来思考问题、认识问题,这种解决问题的思路是人类习惯使用的思维方式。与面向过程语言相比,面向对象语言能够有效提高编程的效率并降低编程难度和复杂度,让程序更简洁、更高效、更高质地运行。 5.1.1 对象的基本概念 在面向对象语言诞生之前,程序员主要使用面向过程语言编写程序。面向过程语言也叫命令式语言、强制式语言,是按步骤重复计算低级(非抽象)值并将其赋值给变量(对象)的语言。在解决问题时,面向过程语言通常要把复杂的任务分解成若干个子任务,其程序语言是按顺序执行的指令串。随着时代发展,人们需要处理的任务越来越复杂,面向过程语言渐渐不能满足需求,并且面向过程语言本身也存在一些问题,比如效率低、成本高、难以维护等,于是面向对象语言和面向对象的程序设计方法应运而生。 理解面向对象的关键是理解对象。面向对象的程序设计方法将问题分解为一系列对象,然后围绕这些对象建立数据和函数。 “对象”包含三个方面的内容:对象的名称、对象的属性和对象的操作。 (1)对象的名称。每个对象的名称都是不同的,当需要用对象来表示实体时,要注意区分它们的名称。 (2)对象的属性。不同对象的属性不同,这种不同分为属性的种类不同和属性的内容不同。举例来说,猫和狗有不同种类的属性,而两只猫各自有其独特的属性内容。在面向对象的程序设计方法中,对象的属性表示了对象包含的数据。 (3)对象的操作。这是指对象能进行的行为,比如“奔跑”“卧倒”等。 下面来看一个具体的例子。 对象的名称:王小花 对象的属性: 性别:女 年龄:19 专业:汉语言文学 对象的操作: 上课 考试 5.1.2 类的基本概念 我们在生活中不会把每个对象都看成孤立的个体,而是会看到一些共性,比如白猫、黑猫、花猫有不同的属性,但会把它们都归类为猫。在面向对象的程序设计方法中,也有与之相似的“类”的概念。 在面向对象的程序设计语言中,不同的类代表不同的对象类型。类如同模板,用同样的模板可以定义许多对象。例如,定义一个“学生类”。 类名称:学生 类属性: 性别 年龄 专业 操作: 上课 考试 比较这个例子和上一小节的例子,可以看到如下情况。 (1)类名称并不指代某个固定的对象,“学生”指的是一个范围里的人,而不是某个具体的人;对象则是具体的,可以对应到某个人。 (2)类属性的值并不固定,比如年龄可以是合理范围的任一数字;对象的属性则是确定的。 (3)类和对象都有操作,而且是相同的操作。 由此可以看出,对象和类的关系是具体和抽象的关系。类是对有同类型属性和操作的多个对象的抽象归类,而对象则是类的具体化,给类这个模板上加一些确定的值就可以定义到某个具体的对象。一个类可以生成多个不同的对象,对象则是某个类的实例。 5.1.3 对象的交互 在面向对象的程序设计语言中,与解决问题有关的函数(也被称为方法)都被放进了类和对象中。与面向过程语言一样,面向对象语言在解决复杂问题时也会把问题分解成若干个子任务,但面向对象的程序设计语言会把函数分类到与其功能对应的对象中(哪个对象能在实际意义上具有这个行为,就把这个功能的函数分配到哪个对象)。如果是复杂的功能,某个单一的对象无法独自完成,就需要多个对象协作完成。这种多个对象间的协作就是对象的交互。 在面向过程语言中,程序的结构是有层级的,不同功能的函数放置在不同模块中,解决某个问题的函数都放在一起,主程序逐个调用、返回即可,控制流程比较简单。而在面向对象语言中,方法被放在对象中,如果一个方法想调用其他对象中的方法,两个对象之间就会发生交互,因此面向对象的控制流程相对比较复杂。 面向过程的编程方法构建的程序有点像军队,上下级明确,上级给下级布置任务,下级完成任务并返回结果,最上层的领导可以统率全局。而面向对象的编程方法构建的程序则大多没有这种上下级关系,在处理复杂任务时,各个对象处理好自己应该处理的那部分任务,再把需要别的对象处理的任务传给对方并等待回应即可。 对象的交互是通过消息传递的方式进行的,通过这种方式,程序可以将分散在不同对象中的方法联合起来。在面向对象的编程方法构建的程序中,程序的运行是靠消息传递来推动的,这种执行形式是由对象的特性和封装性决定的。 注意:对象之间通过传递消息来进行相互的联系,发送消息的对象要指明接收消息的对象,同时要在消息中说明接收消息的对象所要完成的动作。当一个对象发送一个消息后,被指定的对象接收到该消息并对消息进行分析,然后执行该动作。 5.1.4 封装和抽象 类与对象都有封装性。简单来说,封装是对象对自身内部数据和操作的隐藏,一个对象无法查看其他对象内部的数据和操作。如果一个对象需要其他对象协作,只需要向对方传递“做什么”的信息,不用管对方“怎么做”,事实上它也无法知道对方是怎么做的。 这些被传递的信息是在一定规则下制定的,因此双方都能正确理解。这些规则是对功能的抽象描述,相当于“使用指南”,可以让其他对象明白该对象能做什么,以及怎么让该对象去做那些事情。 类与对象的封装性使它们很像带有接口的盒子,从外面看只能看到接口,而看不到里面的结构。对类与对象来说,如果没有抽象出来的接口,它们就不能发生作用;如果没有封装性,数据和操作会被暴露出来,这既没有必要,也不安全。 5.1.5 继承的概念 现实世界中,万事万物皆可关联。关联描述的是两个类之间的关系,例如一个家庭类与家庭成员类就是一个关联。两个类之间的关联有很多种,继承是关联中的一种。继承描述的是事物之间的所属关系,比如大熊猫属于哺乳动物,因此可以称大熊猫类是哺乳动物类的继承类;哺乳动物属于动物,因此可以称哺乳动物类是动物类的继承类。拥有继承关系的两个类之间存在继承与被继承的关系,可以称这种关系为“父子关系”,其中继承类是子类(或派生类),被继承类为父类(或基类)。子类拥有父类的所有属性和行为,同时又有自己独特的行为和属性。例如,大熊猫类和哺乳动物类是两个类,都有恒温和胎生等属性,但是大熊猫类还有很多独特的属性,比如吃竹子。 由此可以总结,在面向对象程序设计中,有继承关系的两个类(或两个对象)之间有以下两个特征。 (1)继承类具有被继承类的所有属性和行为。 (2)继承类具有被继承类没有的属性和行为。 因此,在上面的例子中,不能反过来说哺乳动物这个对象继承了大熊猫这个对象的所有属性。 继承可以形成层次结构,也就是说一个类可以间接继承多个类。这种继承也被称为多重继承。比如大熊猫属于动物界的脊索动物门中哺乳纲下食肉目的熊科,大熊猫这个对象继承了熊科这个对象的所有属性,熊科这个对象继承了食肉目这个对象的所有属性,因此大熊猫这个对象也间接继承了食肉目这个对象的所有属性。依此类推,大熊猫这个对象继承了前面列举的所有“界门纲目科”等对象的属性。 按照继承源的不同,可以把继承分为单继承和多继承。单继承是只有一个基类的继承,比如上面举的大熊猫的例子就属于单继承。多继承是有多个基类的继承,比如小孩的肤色、血型等属性同时继承了父亲和母亲的某些特点。需要注意的是,多继承会造成许多问题,因此Java不支持多继承。不过,Java可以“声明多继承”,即Java的接口可以多继承:一个类可以“继承”多个接口的方法,一个接口可以“继承”多个接口的方法。 继承是面向对象的重要特征,它可以减少编写重复代码的工作量,极大地提升了编程效率。 注意:系统在创建一个子类的时候,会自动将这个子类所继承的父类中的相关代码复制到子类中。由此可见,继承虽然一定程度上减轻了程序员的负担,但是并没有减少系统的负担。 5.1.6 多态性 同样的消息传递给同属的不同类型的对象会导致同一行为的不同表现,这就是面向对象的多态性。比如大熊猫和狗都属于动物,这两种动物都具有吃饭的行为,我们让大熊猫和狗通过消息传递(方法调用)做出吃饭的行为,虽然二者的行为都表现为吃饭,但是吃的内容不一样——大熊猫吃的是竹子,狗吃的是狗粮。 多态性与继承有关。体现多态性的对象,既有共性,也有特性。共性是指这些对象具有相同的父类、相同的属性和行为,特性是指同一行为具有不同的行为表现。 多态性使面向对象语言更加灵活、抽象,一定程度上也能减少代码量,提高使用效率。 5.1.7 包的基本概念 包(package) 是组织类的一种方式。包是类的容器,其作用是分隔类名空间。打个形象点的比方,包有点像电脑硬盘中的文件夹。 包可以很好地保证类名的唯一性。如果没有包,都是一个个类的话,程序员在编程时很可能不记得或不知道现存的类有哪些类名,有可能会设置与之前的类相同的类名,那系统就会产生冲突。使用包便可以避免这类问题。 Java编译器认为不同的包之间没有关系,即使两个包里都有同一个类名的类,也不会产生冲突。 Java 的包机制为程序开发带来了很多好处。比如Java本身提供了很多类库,这些类库通常被称为“应用程序接口”或者“API”。Java 通过包机制把一些平时开发过程中较为通用的类和接口封装成类库,极大地提高了开发效率。" "培养编程思维,做Java高手! 系统全面:内容全面,循序渐进,带领零基础的你走上编程之路! 视频教程:图文教程+视频教程,为你打造轻松易学的教程套餐! 轻松上手:边学边练,随时进行自我检测,保证重点难点全掌握!"