第1页第5章Java面向对象编程面向对象程序设计概述01类和对象02构造方法03继承和多态04本讲提纲final和static成员05抽象类06接口07内部类08专题应用:多类设计09第2页程序设计方法的发展面向计算机的程序设计(FCP)以计算机工作方式组织程序,少占用系统资源为目标,机器语言或汇编语言,编写较为困难面向过程的程序设计(POP)结构化和模块化思想,讲求程序的清晰性和可读性,自顶向下和逐步求精,大型程序开发困难面向对象的程序设计(OOP)模仿现实世界的描述方式,类和对象,提高程序可重用性第1节面向对象程序设计概述第3页面向对象程序设计的特点第1节面向对象程序设计概述OOP程序设计方法彻底改变了人们编程的思维方式,其最主要的特点是封装性(Encapsulation)、继承性(Inheritance)和多态性(Polymorphism)。封装性将数据和与这些数据有关的操作方法统一组织在一起,以形成对对象的描述(类)。数据部分描述对象的属性,方法部分描述对象所具备的功能和行为:对象=属性+方法封装的好处:(1)对象之外不能随意修改对象内部,限制非法访问(2)实现错误局部化和模块独立维护性封装的基本单元是类,类是对象的模板,对象是类的实例成员变量成员方法第4页面向对象程序设计的特点第1节面向对象程序设计概述继承性OOP方法支持在现有类的基础上创建新的类,新类在保持现有类的某些特性甚至全部特性的基础上,还可以增加其他新的特性,从而拓展原有类的功能。原有类称为父类或超类,新类称为子类继承具有传递性,即若B继承于A,C继承于B,则C间接继承A的特性。Java支持“单重继承”,即一个类只有一个直接父类,但通过“接口”技术,可实现多重继承的功能。第5页面向对象程序设计的特点第1节面向对象程序设计概述多态性所谓多态,常指不同的对象接收到相同的消息时,表现出不同的行为。“多态”使得不同的对象可以依照自身的需求对同一消息做出恰当的处理。例如,对于不同的人,当他们说要去运动的时候,根据其兴趣爱好的不同,有的可能去游泳,有的可能去跑步,有的可能去打球等。(1)方法重载(Overload)(2)成员覆盖(Override),又称重写(Overwrite)同个类中的多个同名方法继承过程中重新设计父类成员第6页第2节类和对象类和对象类和对象构成了Java语言的核心。类是一组对象共有的属性和行为,是对象的抽象和模板,而对象是类的实例。属性通过成员变量表征,用于描述对象的状态;行为通过成员方法描述,指对象所具备的功能。类把属性和行为封装在一起,也即类是成员变量和成员方法的封装体。第7页第2节类和对象定义类[修饰符]class类名[extends父类名][implements接口列表]{[修饰符]类型成员变量1;……[修饰符]返回值类型成员方法1(参数列表){方法体}……}访问权限:public,private使用方式:abstract,final指定所定义的类继承于哪个父类,若省略则父类为Object指定实现的接口类体类是成员变量和成员方法的封装体,前者描述对象的属性即状态,后者描述对象的行为即功能。第8页第2节类和对象定义类【程序5-1】根据本校情况定义一个课程类Course。classCourse{privateStringcourseID;privateStringcourseName;privatefloatcredit;publicvoidsetCourseID(Stringid){this.courseID=id;}publicStringgetCourseID(){returncourseID;}…}Java程序设计的主要过程就是类定义、创建对象和访问对象的过程。查看前几章的程序范例不难发现,之前的程序由于功能较为简单或Java编程知识的不足,在设计类的过程中,我们主要考虑的是一个特殊的成员方法—main方法,较少或未涉及成员变量和其他成员方法,但每一个Java程序都遵循上述类定义的标准形式。第9页第2节类和对象成员变量类是客观事物的抽象描述。数据抽象用于描述该类对象的状态和属性,常称为成员变量。一个类应该设计多少个成员变量,由待解决的问题本身决定,没有必要也不可能将客观事物的所有属性罗列出来。成员变量一般定义在类体的开始部分,放在所有成员方法之外。[修饰符]类型成员变量名;classStudent{StringstuID;//声明变量学号stuID,默认访问权限Stringname;//声明变量姓名name,默认访问权限intage;//声明变量年龄age,默认访问权限Stringsex=”男”;//声明变量性别sex,并进行显示初始化publicstaticintstuCount;//静态变量学生数stuCount,所有对象共享publicfinalStringSCHOOL=”××大学”;//声明常量学校SCHOOL,显示初始化}第10页第2节类和对象成员方法成员方法用于描述某类对象的行为,是客观事物所具备功能的体现。因此,从程序设计的角度来看,每个方法就是一个功能模块。[修饰符]返回值类型成员方法名(参数列表){方法体}publicfloatgetAve(inta,intb){//参数是int型,返回值是float型intsum=a+b;//用于保存和的局部变量return(float)sum/2;//将int型的sum强制转换为folat型后再计算}注意:(1)方法不返回值时,申明为void类型(2)方法不带参数时,“()”也不能省略第11页第2节类和对象创建对象类是对象的模板,对象是类的实例。类是一种抽象的数据类型,“类”类型称为引用类型。类名引用变量名;对于基本类型,声明变量就意味着分配相应的内存空间,可以将基本类型数据直接保存在这段内存空间里;而对于引用类型,声明变量也会分配相应的存储空间,但分配的空间不能直接存储对象本身,而只能存储对象的“引用”。所谓对象的“引用”,可以理解为一个对象的内存首地址或操作句柄,通过它,可以和对象建立连接,访问对象的具体内容。intscore;//声明普通整型变量,此时值不定Studentstu;//声明Student类型引用变量,此时值为null第12页score=85;//变量的值为85stu=newStudent();//调用不带任何参数的构造方法声明变量和变量的赋值也可合并为:intscore=85;Studentstu=newStudent();第2节类和对象创建对象对象是类的具体实例。创建对象的一般方法是:类名引用变量名=new构造方法名(参数列表);例如:Studentstu=newStudent();第13页第2节类和对象使用对象当引用变量指向具体的对象后,便可以通过该引用变量访问对象的成员变量和成员方法。要访问对象,可采用对象访问运算符“.”进行操作。例如:stu.stuID=”201211051201”;stu.name=”李晓莉”;stu.age=18;stu.print();注意:考虑到封装性的要求,成员变量一般声明为private权限,然后通过setXxx和getXxx方法设置和获取其属性值。第14页第2节类和对象销毁对象Java通过“自动垃圾回收机制”自动监测对象的使用状况。当对象不再使用时,便销毁该对象,回收对象所占用的系统资源。Java判断一个对象是否为“垃圾对象”的标准是该对象没有任何引用变量指向它。Java销毁对象时,启动该类对象的finalize方法,用于对象被销毁前执行一些资源回收工作。该方法是从Java的所有类的父类Object类继承来的,由垃圾回收系统自动调用。【程序5-2】在程序5-1的基础上,创建一个Course类对象,并输出该对象的相关信息。本程序定义的CourseTest类和程序5-1中定义的Course类分别位于不同的文件。也可不定义CourseTest类,而直接将本程序的main方法(02-08行)直接添加到Course类的定义中。第15页第2节类和对象方法中的参数传递调用方法:对象名.方法名(实际参数表);参数传递方法:值传递,引用传递值传递(1)成员方法的参数类型为基本数据类型(2)实参和形参各占自己的存储空间,“复制”传递(3)特点:形参值的改变不会影响实参第16页第2节类和对象方法中的参数传递调用方法:对象名.方法名(实际参数表);参数传递方法:值传递,引用传递引用传递(1)成员方法的参数为引用类型(2)传递对象的引用值,使形参指向实参所指向的对象(3)特点:形参指向对象的改变相当于实参对象的改变第17页第2节类和对象成员变量和局部变量的区别成员变量:描述对象状态的变量局部变量:方法体中用到的临时变量,方法参数等变量声明时可使用的修饰符不同成员变量可使用public,private,protected,static,final进行修饰,而局部变量只能使用final,方法参数不能有任何修饰符面向对象变量的作用域和生存期不同成员变量的作用域为整个类,局部变量为声明变量的复合语句块,参见程序5-2初始化方式不同成员变量可默认初始化,局部变量不会,使用前必须赋值第18页第2节类和对象1.下面有关成员变量和局部变量的说法中,错误的是()系统会对局部变量和成员变量进行默认初始化局部变量使用前必须赋初值,因为系统不会对局部变量进行默认初始化成员变量无论声明位置,其作用区域都为整个类局部变量的作用区域为声明变量的复合语句块ABCD提交单选题1分第19页第3节构造方法构造方法的定义构造方法是创建和初始化对象的专用方法。(1)构造方法由new运算符负责调用。(2)构造方法的名称必须和类名完全相同。(3)构造方法无需指定返回值类型。(4)构造方法的参数列表可按需设置,因此一个类中可以含有多个构造方法(方法重载)。(5)为方便对象创建,构造方法通常声明为public。第20页第3节构造方法构造方法的定义classPoint{//定义类Point,包含x,y两个成员变量intx;inty;publicPoint(intm,intn){//带有两个参数的构造方法x=m;y=n;}}注意:当程序没有定义任何构造方法时,系统会为类“配置”一个默认构造方法,但当程序明确定义构造方法时,系统将“屏蔽”默认构造方法。因此,要定义类的构造方法,最好包含一个默认的构造方法。思考:系统会为上述代码“配置”默认构造方法吗?第21页第3节构造方法构造方法的定义设计多个构造方法的好处:方便创建对象。classPoint{//定义类Point,包含x,y两个成员变量intx,y;publicPoint(){//默认构造方法x=0;y=0;}publicPoint(intm){//带有一个参数的构造方法x=m;y=m;}publicPoint(intm,intn){//带有两个参数的构造方法x=m;y=n;}}【程序5-3】采用this关键字简化Point类构造方法的定义并创建对象。第22页第3节构造方法对象的生成过程(1)为新对象分配存储空间,并默认初始化各成员变量。(2)为各成员变量进行显示初始化。(3)执行构造方法中的语句。注意:默认初始化可确保不会存在没有初值的对象(初值见表5-1)显示初始化可使同类对象具有相同的初值构造方法有利于生成所需属性值的对象第23页第3节构造方法this关键字this用于成员方法体内,代表本对象,也即指当前正在被操作的对象本身。(1)在成员方法中访问类的成员classAnimal{privateintweight;privateintage;voidsetWeight(intweight){this.weight=weight;//此时必须使用this,左边为成员变量,右边为局部变量…}第24页第3节构造方法this关键字(2)在构造方法中调用其他构造方法参考程序5-3(3)在方法中传递当前对象【程序5-4】使用this关键字返回当前对象。publicDatetomorrow(){//使日期往后增加