资源预览内容
第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
第9页 / 共47页
第10页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第3章 类与对象,从本章开始,将深入讲解面向对象的思想和如何利用Java语言进行面向对象编程。类和对象是Java面向对象编程中非常重要的概念。本章首先讲述面向对象的基础知识,而后讲解Java类和对象的创建和使用,以及如何使用方法、包、访问控制等特性。,3.1 面向对象程序设计概述,面向对象程序设计(Object Oriented Programming,OOP)是当今主流的程序设计方式,取代了20世纪70年代的“过程化”程序设计。Java是纯面向对象的语言,用其进行面向对象的软件开发是非常方便、高效的。本节将在第1章的基础上,对面向对象的基础知识进行简单的介绍,主要包括面向对象程序设计的相关术语、面向过程与面向对象程序设计思想的对比、面向对象技术的优点等3方面的内容。,3.1.1 面向对象术语,OOP是与具体的语言无关的,无论在C+还是在Java中,OOP的思想是通用的。OOP利用特殊约定的词汇描述相关特性,尽管这些词汇与生活习惯相近,但是为避免歧义,在学习OOP前,仍需要了解OOP相关术语。这里只对其中最为重要的进行简要的介绍,包括:类、对象、接口、封装、继承。,3.1.1 面向对象术语,1对象 前面的章节中曾详细地讲述了对象的概念。这里以现实世界中的一个对象为例,如一只猫、可以说猫具有许多属性(或状态),如猫名、猫龄和颜色;猫还具有各种行为,如睡觉、吃食和发出叫声。在OOP的世界里,对象也具有许多属性和行为。使用面向对象的技术,就可以以一只猫建立一个模型。,3.1.1 面向对象术语,2类 类是OOP中最重要的术语。通常情况下,类被称为模板或者蓝本。对象就是由这些模板或者蓝本产生的。属于某个类的特性和行为总称为该类的成员。这里仍以上面提到的猫为例,猫的特性,包括猫名、猫龄和颜色称为类的属性,用变量表示;而猫的行为如玩、睡觉称为类的方法,用函数表示。,3.1.1 面向对象术语,3继承 OOP的主要优点之一是使用继承实现类之间的共享数据和方法的机制。在我们日常生活中,儿子总会继承父亲的一些特性:所有种类的汽车都需要实现汽车的基本功能;所有种类的电脑都需要实现电脑的基本功能,诸如此类的例子很多。而这些现象,都可以使用继承来实现。新建的类称为子类,该类需要继承的类称为超类或者父类。,3.1.1 面向对象术语,4接口 接口可以描述为类定义的模板,实现接口的类实现该模板。在猫的示例中,接口类似于猫的蓝图:通过蓝图可了解需要的部分,但并不一定提供关于这些部分的组装方法或工作原理的信息。 可将接口看作是用于将两个若没有接口便没有任何关系的类关联起来的“编程约定”。例如,多个程序员一起工作,每个程序员开发同一个应用程序的不同部分(类)。设计应用程序时,约定不同的类使用一组方法进行通信。因此,创建一个接口用以声明这些方法、方法的参数及其返回类型。任何实现此接口的类都必须提供这些方法的定义,否则将出现编译错误。,3.1.1 面向对象术语,5封装 封装是OOP中另一个非常重要的概念,也称为数据隐藏。在完美的面向对象的设计中,对象被看作包含或封装功能的“黑匣子”。程序员应当能够在仅知道对象的属性、方法和事件的情况下与对象进行交互,而不需知道其实现的详细信息。此方法使程序员可以在更高的抽象层次上思考,并能提供可用于构建复杂系统的组织框架。同时利用封装可以进行成员访问控制。成员的详细信息对于对象外的代码是私有的和不可见的。,3.1.2 面向对象程序设计方法的优点,利用面向对象的思想求解问题,使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,使编程更加富有人性化。同时利用OOP求解问题,具有更好的重用性、可扩展性、更易管理和维护。,3.1.2 面向对象程序设计方法的优点,1可重用性 软件由各个模块组成,可重用性就是该软件的模块可以被重复利用,不仅用于该项目,还可用于其他项目。对于代码级,可重用性指类或者方法的重复使用,避免对于同一功能多次实现产生多余代码。可重用性是OOP的一个核心思想。OOP中的抽象、继承、封装等都可服务于可重用性。 利用可重用性构建程序,优点是显而易见,不仅减少工作量,提高工作效率;利用已有的模块进行开发,更能够提高程序质量。,3.1.2 面向对象程序设计方法的优点,2可扩展性 可扩展性即软件或者程序能够很方便地进行修改和扩充。对于软件产品来说,修改和扩充是必不可少的,一是不断地修订保证程序的稳定;二是可以不断满足用户新的需求。由于继承、封装、多态等特性,面向对象方法可以设计出高内聚、低耦合的系统结构,使得系统更灵活,更容易扩展,而且成本较低。,3.1.2 面向对象程序设计方法的优点,3易于管理和维护 面向过程的开发方法,都是以函数为基本单元。所以当开发项目不断扩大时,这样的函数单元将变得不计其数,显示这样是不利于管理和维护的。而使用OOP后,以类作为开发的基本模块,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便的,成本也较低。,3.2 面向对象与UML建模,上一节已经详细讲述了对象以及面向对象编程的基本概念。面向对象是人们思考现实世界的一种自然方法,也是编写计算机程序的一种自然方法,在软件的分析和设计过程中,面向对象的思想也是无处不在的。所以在构建软件的过程中,系统建模是非常关键的步骤,所以OOP也与建模紧密地结合在一起。本节主要介绍软件工程中建模的重要性,UML以及使用UML表达面向对象。,3.2.1 为什么需要建模,建模是一项经过检验并被广为接受的工程技术。建立房屋和大厦的建筑模型,能帮助用户得到实际建筑物的印象,甚至可以建立数学模型来分析大风或地震对建筑物造成的影响。 如果真正想建造一个相当于房子或大厦类的软件系统,问题不仅仅是编写许多软件的问题。关键是要编出正确的软件,并考虑如何少写代码,减少软件的打消。所以要生产合格的软件就要有一套关于体系的结构、过程和工具的规范。如果对体系结构、过程或工具的规范没作任何考虑,犹如在没有任何根基的地上盖大楼,总有一天大楼会由于其自身的重量而倒塌。不成功的大楼将对大厦的租户造成严重的影响,同样,不成功的软件也会对用户和企业造成十分严重的影响。,3.2.2 UML建模语言,UML就是统一建模语言(Unified Modeling Language),是由OMG组织(Object Management Group,对象管理组织)在1997年发布的。UML的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用。UML提出了一套IT专业人员期待多年的统一的标准建模符号。通过使用UML,这些人员能够阅读和交流系统架构和设计规划就像建筑工人多年来所使用的建筑设计图一样。,3.2.3 UML的面向对象分析设计,为了创建最好的解决方案,必须遵循从项目需求分析到开发这样一个过程,如果按照面向对象的观点,则称其为面向对象的分析和设计(object-oriented analysis and design,OOAD)。运用UML进行面向对象的系统分析设计,其过程通常由以下3个部份组成。 1识别系统的用例和角色 2进行系统分析,并抽取类 3系统设计,并设计类及其行为,3.3 Java语言与面向对象特性,在介绍完OOP后,本节将简要介绍面向对象思想在Java中的具体体现,在后续的章节中将详细介绍如何利用Java进行面向对象编程。 Java是完全面向对象的语言。对象是Java程序中最核心、最基础的部分。在Java中,对象被映射为类(Class)。类是Java程序中最基本的单元。对象的任何行为都可以通过Java类中的方法实现,而对象的属性则可以通过Java类中的属性来实现。 1Java中的类 2Java中的封装 3Java中的继承 4Java中的多态 5Java中的垃圾回收机制,3.4 类的定义和对象的创建,在初步了解面向对象思想的基础上,从本节开始,将逐步介绍如何利用Java进行面向对象编程。类是Java中基本的编程单元,本节介绍如何定义类,如何利用类创建对象。,3.4.1 类的基本结构,如果一切都是对象,那么是什么决定某一类对象的外观与行为呢?答案是“类”。类是构造对象的模板或蓝图。就像建筑物与设计图纸,通过一份设计图纸,可以造出建筑物,而Java开发人员在编写代码时,实际上是在编写类代码,对象只有程序运行时才存在。 当用户创建一个Java程序时,可以通过类声明来定义类,然后使用类来创建用户需要的对象。类声明是用来创建对象模板的抽象规格说明。在前面的一些章节中,已经编写过一些简单的类,只是那些类一般只有main方法。,3.4.2 类之间的关系,在面向对象思想中,类之间存在以下几种常见的关系。 1“USES-A”关系 “USES-A”关系是一种最明显、最常见的关系,若类A的方法操纵了类B(对象)的成员,则称之为类A“USES-A”(用到了)类B。例如,汽车启动前检查汽油是否足够,例3-1说明了这个问题。 2“HAS-A”关系 “HAS-A”关系是一种拥有关系,若类A中有B类型的成员引用变量,则类A“HAS-A”(拥有)类B。 3“IS-A”关系 在面向对象中“IS-A”的概念是基于继承的,旨在表达一个类是另一个类的子类。也就是说,若类A是类B子类的一种,则可以说类A“IS-A”(是一种)类B。例如,“苹果”是“水果”的一种,则它们之间的关系为“苹果”IS-A(是一种)“水果”。在后面章节中将结合继承性对“IS-A”关系进行详细的介绍。,3.4.3 构造函数,在创建对象时,对象的成员可以由构造函数方法进行初始化。构造函数是一种特殊的方法,它具有和它所在的类完全一样的名字。一旦定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,这是因为一个类的构造函数的返回值的类型就是这个类本身。构造函数的任务是初始化一个对象的内部状态,所以用new操作符创建一个实例后,立刻就会得到一个可用的对象。,3.4.4 类成员,定义了类之后,就可以在类体中声明两种类的成员,成员变量与成员方法。本节介绍与成员变量开发相关的一些知识,主要包括成员变量的开发与使用、成员变量的初始值以及对象引用变量的比较等内容。 1成员变量的使用 成员变量就是类的属性,类定义中的属性指定了一个对象区别于其他对象的值。例如,学生类的定义中包括年龄、姓名和班级这些属性,每个对象的这些属性都有自己的值。所有由类定义建立的对象都共享类的方法,但是,它们都拥有各自属性变量的副本。 2成员变量的初始值 每当创建一个对象后,如果对象有成员变量,则系统会自动为其分配一个初始值,,3.4.5 对象的创建,有了类就可以利用其来创建对象了,在Java中创建对象很简单,只要使用new关键字即可。如下代码创建了Student类的对象。 Student s = new Student(); 由类创建对象的过程称为实例化,每个对象是类的一个实例,说明了类与对象的不同之处。 学生类是对什么是学生做定义,而王强、李勇和马跃是对象,是学生类的实例。,3.5 方 法,在Java中,对对象的操作由方法来完成。要使一个对象完成某些工作,就要调用其相应的方法。方法实际上描述的是一个行为,一种功能,决定了一个对象能够接收什么样的消息,做出什么反应。本节介绍方法的定义以及方法的重载和递归。,3.5.1 方法的定义,方法的基本组成包括:方法的声明以及方法体,基本语法如下。 返回值类型 方法名(参数序列) 方法体 在sub方法中,入口参数有两个,都是int型,方法的返回值为int型。 下面对方法的各组成部分进行详细介绍。 1参数序列 2方法体 3返回值类型,3.5.2 方法的重载,方法重载是指在同一个类里面,有两个或两个以上具有相同名称,不同参数序列的方法。例如,三角型类可以定义多个名称为area的计算面积的方法,有的接收底和高做参数,有的接收3条边做参数。这样做的好处是,使开发人员不必为同一操作的不同变体而绞尽脑汁取新的名字,同时也是使类的使用者可以更容易地记住方法的
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号