教学课件面向对象程序设计_第1页
教学课件面向对象程序设计_第2页
教学课件面向对象程序设计_第3页
教学课件面向对象程序设计_第4页
教学课件面向对象程序设计_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教学课件面向对象程序设计第1页,共76页,2023年,2月20日,星期五3.1类和对象面向对象方法类的定义成员变量成员方法构造方法对象的创建和使用类成员与实例成员第2页,共76页,2023年,2月20日,星期五面向对象方法现实生活中的对象有形的对象医院医生病人手术器械体温计

…….无形的对象治疗方案手术规程…….第3页,共76页,2023年,2月20日,星期五面向对象方法对象的特征分析静态特征:属性姓名性别年龄职称专长……量血压听诊写病历开处方……第4页,共76页,2023年,2月20日,星期五【案例3-1】用面向对象方法模拟医生为病人诊疗过程。案例说明:

本案例通过对病人就诊模型的分析与简化,抽象出包括日期、体温计、病人以及医生等四个主要的类,并利用医生类的接诊、开处方、诊疗等实例成员方法将这些类联系起来,重现病人就诊时医生用体温计测量病人体温,给病人诊疗并开据处方的过程。图5-2案例5-1的运行结果第5页,共76页,2023年,2月20日,星期五面向对象的基本概念对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。3132第6页,共76页,2023年,2月20日,星期五面向对象的基本概念(续1)接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成34包(Package)是用来容纳一组相关类与接口的容器,是Java语言组织与管理类与接口的一种机制

33第7页,共76页,2023年,2月20日,星期五类与对象的关系类与对象之间的关系,类似于数据类型与变量之间的关系;一个类可以生成无数个不同的对象,每个对象属性值不同,其状态也不同。可以用计算机模型与计算机实体之间的关系来更形象地说明类与对象之间的关系:将冯·诺依曼计算机模型看作计算机类,则不同品牌的计算机实体就对应为一个个的实例对象。第8页,共76页,2023年,2月20日,星期五类与对象的关系示例计算机模型与计算机实体之间的关系:第9页,共76页,2023年,2月20日,星期五面向对象编程(OOP)

从问题域客观存在的事物出发,将这些现实世界的物理实体抽象成概念世界的抽象数据类,再进一步将这种抽象数据类转换为计算机世界的类(Class);类刻画出实体所具有的状态信息与所能发挥的功能信息,是创建对象时所遵循的模板(Template)。对类进行实例化,就生成一个个的对象,对象对应于各个具体事物,是程序运行过程中实际发挥作用的类的独立内存映像。借助于类与对象这两个面向对象程序中最基本的要素,按照尽可能符合人类自然思维的方式,来构造软件系统,这就是所谓的面向对象程序设计(OOP)

第10页,共76页,2023年,2月20日,星期五OOP的逻辑过程面向对象设计分析的完整过程如图所示:现实域抽象抽象类对象实例化映射抽象数据类物理实体逻辑实现概念域计算机世界第11页,共76页,2023年,2月20日,星期五面向对象的重要特征

面向对象具有以下几个重要特征:抽象封装与隐藏继承多态性

33313234第12页,共76页,2023年,2月20日,星期五抽象抽象(Abstraction):抽象是面向对象编程的起点,也是其最本质的特征之一。抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象第13页,共76页,2023年,2月20日,星期五抽象示例下图阐述了如何由自然界众多的动物实体出发,经过抽象的处理过程,最终得到动物这一概念第14页,共76页,2023年,2月20日,星期五封装封装(Encapsulation):封装也可称为信息隐藏(InformationHiding),是通过对象的方法来访问与改变对象属性的一种机制。封装是面向对象的一个重要原则,其实现的核心是将类的属性与相关的操作捆绑起来,包装成不可分割的、独立的对象实体,将内部的数据与实现细节尽可能隐蔽起来,使外部用户不能直接操纵对象的内部信息,只能通过对象对外提供的施加有一定限制的访问接口来使用对象第15页,共76页,2023年,2月20日,星期五封装示例下图形象地说明了一个类的封装原理。类对数据与行为的封装是借助于不同级别的访问修饰符来达到控制目的的第16页,共76页,2023年,2月20日,星期五继承继承(Inheritance):继承是指从已有的类中可以派生出若干个新类,已有类称为基类或父类,新类称为派生类或子类;子类将自动地获得基类的属性与方法,从而不需再重复定义这些属性与方法;当然子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。类之间的继承关系是现实世界中遗传关系的直接模拟第17页,共76页,2023年,2月20日,星期五多态性多态性(Polymorphism):是指允许不同类的对象对同一消息作出各自的响应,即以统一的风格处理已存在的数据及相关的操作。多态性语言具有灵活、抽象、行为共享、代码共享的优势,较好地解决了应用程序中方法同名的问题第18页,共76页,2023年,2月20日,星期五

OOP的优越性从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:

提升程序的开发与运行效率提高代码的可重用性(或者称为复用性)按照与人类习惯思维方法一致的原则开发系统第19页,共76页,2023年,2月20日,星期五OOP的优越性(续)提高程序的可靠性与可维护性

提高程序的可扩展性增强程序的可控制性总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从而获得较高的开发效率与可靠效果第20页,共76页,2023年,2月20日,星期五类的定义在面向对象的程序设计中,将数据与对数据进行的操作合起来定义为类。类是将数据和与数据相关的操作封装在一起的集合体,用来定义一组对象共同具有的状态(属性)和行为(方法)的模板。类是一种复杂的数据类型,它不但包含数据,还包含了对数据进行操作的方法(Method),通常将类中的数据称为成员变量,而操作数据的方法称为成员方法,二者统称为类的成员。第21页,共76页,2023年,2月20日,星期五类的定义Java类的定义格式如下:<类声明>{<类主体>}说明:(1)类声明定义该类的名称、访问权限、与其他类的关系以及实现的接口等。(2)类主体定义该类中的成员,包含成员变量和成员方法。成员方法是用来描述对成员变量进行的操作,不但定义方法,一般还要实现该方法。第22页,共76页,2023年,2月20日,星期五类的定义类声明的格式如下:

[<修饰符>]class<类名>[extends<父类名>][implements<接口名>]说明:(1)class是定义类的关键字,<类名>、<父类名>、<接口名>都应该是合法的Java标识符。(2)在类的声明中必须包括关键字class和自定义的类名,而方括号[]中的是可选项。(3)子句extends<父类名>显式地指明当前类的父类,子句implements<接口名>则说明当前类要实现接口。

第23页,共76页,2023年,2月20日,星期五类的定义类主体的定义格式如下:{ <成员变量的声明> <构造方法的声明与实现> <成员方法的声明及实现>}说明:(1)类体的数据声明为成员变量,针对数据的操作声明为成员方法,数据的操作过程在成员方法的实现中体现。(2)构造方法主要用于类对象的实例化,又称构造器。(3)类体中声明的成员变量和方法的排列顺序可以任意。第24页,共76页,2023年,2月20日,星期五成员变量声明类的成员变量格式如下:[修饰符][static][final]数据类型成员变量名1[,成员变量名2,…]说明:(1)修饰符的作用是限定成员变量的可访问权限,主要有public(公共的)、protected(受保护的)、private(私有的)以及缺省等四种情况(2)static用于声明类成员变量,用于保存与整个类有关的状态数据的成员变量称为静态成员变量或者类成员变量,简称为类变量,final用于声明常量;(3)成员变量的数据类型既可以是基本数据类型,也可以是引用数据类型,如数组或者其他类对象等。第25页,共76页,2023年,2月20日,星期五成员方法成员方法是可被调用执行并返回值的、能实现特定功能的程序段。成员方法声明格式如下:[修饰符][abstract][static][final]返回值类型方法名([参数列表])[throws异常类]{ 方法体 }

说明:(1)方法的修饰符和成员变量的修饰符一样有四种情况;(2)abstract、static和final分别用于指定所声明的方法为抽象方法、静态方法和最终方法。静态方法又称类成员方法或类方法,一般用于与类有关的数据操作,可以使用类名直接调用。第26页,共76页,2023年,2月20日,星期五成员方法(3)成员方法执行数据操作功能后都会向调用者返回数据操作的结果,返回值类型就是用于声明该成员方法返回值结果的数据类型,可以是包括基本数据类型和引用类型在内任何合法的类型。(4)若成员方法不返回任何值,则返回值类型用void标记,不能缺省。(5)每个成员方法都有一个方法名,紧邻方法名的是用一对括号()括起来的参数列表,参数列表也称为形式参数表,简称形参表。(6)形参表主要用于声明该成员方法在被调用时需要调用者提供的、与数据操作相关的参数的个数与数据类型。每个成员方法允许声明的形参可以有0到多个,每个形参由形参数据类型、空格符和形参名组成,多个形参之间用逗号分隔,即便成员方法没有形参,括号()也不能缺省。第27页,共76页,2023年,2月20日,星期五成员方法(7)形参的作用域是局部的,只限于声明它的成员方法之内有效。throws用于声明该成员方法在执行过程中可能会抛出的异常类型。(8)花括号{}所括起来的就是方法体,方法体可以包含一到多条语句,用以实现成员方法所负责的数据操作功能。若成员方法的返回值类型不为void,则在方法体中需要使用return语句返回其数据操作的结果,且结果类型必须与方法声明的返回值类型相一致。(9)在方法体内可以局部变量,其作用域只限于声明它的方法体内,且声明中不能使用public等访问修饰符和static关键字,同时需遵循“先赋值,后使用”的原则,且在同一个类的不同方法中可以声明同名的局部变量,包括形式参数在内的所有局部变量都不能在方法体外被访问。第28页,共76页,2023年,2月20日,星期五成员方法如果方法有返回值类型,则方法体中必须有return语句.如果想让方法执行后得到值a,即返回值为a,那么在方法中要使用return

a语句。return有“返还”之意,它把表达式的值返回到调用之处。例如:publicclassClass3{doublef(intx){ return2.5+x;}publicstaticvoidmain(String[]args){Class3aaa=newClass3();doubley=aaa.f(3);System.out.println(y);System.out.println(aaa.f(2)); }}第29页,共76页,2023年,2月20日,星期五构造方法每当由类构造对象时都要调用该类特定的构造方法,在Java中,每个类都至少有一个构造方法。构造方法可以确保用户正确地构造类的对象,同时,构造方法也会对对象作初始化工作。构造方法的声明格式如下: [<修饰符>]<类名称>([<参数列表>]) { 初始化的程序代码块 }说明:(1)一个类的构造方法可以有多个,它们都具有相同的方法名,即类名;(2)与类的成员方法不同,构造方法用于创建类的对象并对对象的成员变量进行初始化。(3)构造方法没有返回值类型,但是也不能有void关键字,且只能通过new运算符调用,且其修饰符一般采用public(或者没有),以便于在其他位置根据需要定义并实例化该类的对象。可以使用参数值作为变量的初值,也可以直接给变量赋具体的数值。第30页,共76页,2023年,2月20日,星期五构造方法(4)当一个类没有显式声明其构造方法时,Java编译器会自动为该类生成一个默认的、无参数的构造方法,且实例化后对象的成员变量在没有特别赋值的情况下自动获得其所声明类型的默认值。第31页,共76页,2023年,2月20日,星期五构造方法

构造方法分为缺省的构造方法(不带参数)和带参数的构造方法。(1)缺省的构造方法如果类的定义没有编写构造方法,Java语言会自动为用户提供。这个由Java自动提供的构造方法就是所谓的缺省构造方法。缺省的构造方法确保每个Java类都至少有一个构造方法,该方法应符合方法的定义。例如在下例的类EmpInfo中,我们没有定义构造方法,则Java自动提供了一个缺省的构造方法,如下:

publicEmpInfo(){}//缺省的构造方法第32页,共76页,2023年,2月20日,星期五构造方法EmpInfo.javapublicclassEmpInfo{Stringname;//雇员的姓名

Stringdesignation;//雇员的职务

Stringdepartment;//雇员的部门

voidprint(){//成员方法

System.out.println(name+"is"+designation+"at"+department);}publicstaticvoidmain(Stringargv[]){EmpInfoemployee=newEmpInfo();//创建对象并实例化

="RobertJavaman";//给成员变量赋值

employee.designation="Manager";//给成员变量赋值

employee.department="CoffeeShop";//给成员变量赋值

employee.print();//调用方法print()}}运行结果如下:RobertJavamanisManageratCoffeeShop调用缺省的构造方法第33页,共76页,2023年,2月20日,星期五构造方法第34页,共76页,2023年,2月20日,星期五构造方法(2)带参数的构造方法带有参数的构造方法能够实现这样的功能:当构造一个新对象时,类构造方法可以按需要将一些指定的参数传递给对象的变量。第35页,共76页,2023年,2月20日,星期五构造方法例如,可以为People类增加一个如下所示的构造方法ClassPeople{stringname;intage;floatheight;floatweight;publicPeople()//无参数{name="沈昕";age=26;height=1.62;weight=55.5;}}第36页,共76页,2023年,2月20日,星期五构造方法如果希望在创建对象时,其实例变量具有不同的初值,可以通过传递参数并将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对应,例如:People类的另一种构造方法为:带参数的构造方法

ClassPeople{stringname;intage;floatheight;floatweight;publicPeople(StringinitName,intinitAge,doubleinitHeight,doubleinitWeight){name=initName;age=initAge;height=initHeight;weight=initWeight;}}第37页,共76页,2023年,2月20日,星期五对象的创建和使用

对象是类的实例,所以一个对象必定属于一个已知的类。Java语言中,一个对象的生命周期经历:创建,使用,销毁等三个阶段。对象被创建后将获得包括内存在内的所需资源;而对象销毁后,其所占的资源将被系统自动回收。Java语言具有资源回收机制,能跟踪存储单元的使用情况,自动回收不再被使用的资源。对象的创建:创建一个对象包括两个步骤--声明对象和为对象分配内存。1)对象的声明一般格式为:类名对象名如:People张三这里people是前面定义的一个类的名字,张三是声明对象的名字。但此时对象“张三”的内存中没有任何数据,即“张三”还是一个空对象,不能使用。要是用这个对象还必须为这个对象分配内存,也叫做为对象分配实体。

第38页,共76页,2023年,2月20日,星期五对象的创建和使用2)为对象分配内存:为对象分配内存,即使用new运算符和类的构造方法实例化某个对象。如果类中没有构造方法,系统会自动调用默认的构造方法(没有参数,名字遵循普通构造方法的要求:和类名相同),格式为

对象名=new构造方法名([实参列表]);//实例化对象

例如:张三=newPeople()也可以把以上两个步骤合在一起,格式为:类名对象名=new构造方法名([实参列表]);例如

People张三=newPeople()new可以实例化类的多个不同的对象,分配不同的内存。因此,这些对象之间的状态相互独立。第39页,共76页,2023年,2月20日,星期五对象的创建和使用

创建一个对象后,在程序中就可以引用对象中的成员变量,调用对象的成员方法,语法格式如下: 对象名.成员变量 对象名.成员方法([实参列表])例如:aday.year=2009; aday.setDate(2009,10,28);说明:(1)对象名与成员变量或方法之间使用点运算符“.”分隔。(2)方法调用时给出的参数称为实际参数,简称实参。实参可以是常量、变量、表达式或方法的调用,实参的个数与数据类型及排列次序一定要与类定义中该方法声明的形参保持一致,且多个实参之间用逗号分隔。第40页,共76页,2023年,2月20日,星期五对象的创建和使用

(2)当调用方法时,系统按照实参与形参一一对应的关系将实参的值或引用传递给对应的形参。需要特别注意的是,若实参为引用类型的数据,其值不能为null。方法后的圆括号()是必需的,即便该方法没有声明形式参数也不能缺省。

第41页,共76页,2023年,2月20日,星期五对象创建的一个例子classPeople{ intage; Stringname; doubleheight; People(){ name="张婷"; age=25; height=160.0; } voidlaugh(){//类的一个成员方法 System.out.println("Haaha..."); } publicstaticvoidmain(String[]args){ System.out.println("main方法执行"); Peoplep=newPeople(); p.laugh();System.out.println("="+);System.out.println("p.age="+p.age);System.out.println("p.height="+p.height); }}一个构造函数第42页,共76页,2023年,2月20日,星期五对象创建的一个例子publicclassClass27{inta;publicClass27(){ a=10;}publicClass27(intq){ a=q;}publicstaticvoidmain(String[]args){Class27ob1=newClass27();Class27ob2=newClass27(20);Class27ob3=newClass27(30);

System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);

}}两个构造函数第43页,共76页,2023年,2月20日,星期五对象创建的一个例子classMan{intheight;intage;}publicclassClass1{publicstaticvoidmain(String[]args){Manman1;man1=newMan();man1.height=180;man1.age=20;System.out.println(man1.height);//使用对象的成员变量

System.out.println(man1.age); }}在本源程序中,有两个类,其中包含主方法的类为主类,文件名与主类名相同第44页,共76页,2023年,2月20日,星期五对象的创建和使用对象的创建—课堂练习:有一个类class1拥有以下成员变量:Inta;Doubleb;Stringc;请编写构造函数(带参数)初始化成员变量,创建类class1的对象ob,输出对象ob的三个成员变量值。第45页,共76页,2023年,2月20日,星期五类成员与实例成员

Java类中所包含的成员从功能上可以划分为成员变量和成员方法两种。其中,前者存储数据,后者负责数据的处理。然而,从成员与类及类实例(对象)之间的关系的上看,类中的成员还可以划分为类成员和实例成员两种。第46页,共76页,2023年,2月20日,星期五类成员与实例成员类成员是属于类的,使用static关键字声明,故又称静态成员,包括类成员变量和类成员方法。通过类名就可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也能够引用类成员。当然,类成员也能够通过类的实例(即对象)进行引用。实例成员则属于类的实例(即对象),包括实例成员变量和实例成员方法。只有创建了对象之后,才能通过对象访问实例成员变量和调用实例成员方法。换句话说,实例成员只能通过类的实例进行引用,而不能为类名。第47页,共76页,2023年,2月20日,星期五类成员与实例成员

成员变量又可以分为:实例成员变量和类成员变量(静态成员变量)(1)实例成员变量----每次创建类的一个实例对象时,系统会为对象的每一个实例成员变量分配内存单元,使得属于不同对象的同一个实例成员变量具有不同值。也就是说,只有对象存在时,其实例成员变量的值才存在。(2)类成员变量----系统运行时为每一个类成员变量只分配一个存储单元,使得所有通过该类实例化的对象共享同一个类成员变量的存储空间。只为该类的第一个对象分配内存单元,其后所有新创建的对象都共享这一个类变量。

第48页,共76页,2023年,2月20日,星期五类成员变量(静态成员变量或类变量)如果成员变量的类型关键字前面有关键字static,这样的成员变量称作类变量或静态成员变量。如:classdog{floatx;//实例成员变量

staticinty;//类变量

}静态成员变量在不创建对象的情况下也可以使用,它是所有对象共有的变量。如果一个类中的某个成员变量是类变量,那么所有类的实例对象的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变量,其他类的这个类变量也会随之改变。也就是说,类变量被所有对象共享。实例成员变量(实例变量):只有在创建了类的对象后才能使用。

类成员与实例成员

第49页,共76页,2023年,2月20日,星期五classChinese{staticStringcountry="中国";//定义静态变量country并初始化

Stringname;intage;voidshout(){System.out.println("啊!我爱你——"+country); //类中的成员方法也可以直接访问静态成员变量

}}classTestChinese{publicstaticvoidmain(Stringargs[]){System.out.println("Chinesecountryis"+Chinese.country); //未创建对象直接使用“类名.变量名”格式

Chinesech1=newChinese();System.out.println("我们的祖国是"+ch1.country);//创建了对象直接使用“对象名.变量名”格式

ch1.shout();}}类成员变量-例第50页,共76页,2023年,2月20日,星期五类成员与实例成员

类的成员方法也分为:实例成员方法和类成员方法(1)实例成员方法体中既可以访问类成员变量,也可以访问实例成员变量,且只能通过对象来调用。(2)类成员方法体中只能访问类成员变量,不能访问实例成员变量。但是类成员方法既可以通过对象来调用,也可以通过类名调用。第51页,共76页,2023年,2月20日,星期五classdog{floatx()//实例方法

{…

return…

}

staticinty();

//类方法

{…return…

}}类方法在不创建对象的时候也可以被调用。若一个方法被声明为类方法,则它只能对类变量进行操作,且象类变量一样,类的所有实例对象共享同一个类方法。如下例:Main方法就是静态方法,它在程序执行时,由JVM自动调用,而不用先创建对象类成员与实例成员

第52页,共76页,2023年,2月20日,星期五classtest{inta=3;staticintb;floatf(intx,inty)

{a=x;b=y;//变量引用合法,因为f为实例方法returnx*y;

}staticfloatg(intx,inty)

{a=x;b=2*a;//变量a引用不合法,因为g为类方法,而a为实例变量returnx*y;}}类成员与实例成员

第53页,共76页,2023年,2月20日,星期五publicclassClass14{inta;staticvoidsetA(intb){a=b;

}publicstaticvoidmain(String[]args){Class14.setA(10);}}错误在于在静态方法中调用了非静态变量,a是成员变量,只有在创建对象后才可以使用类方法第54页,共76页,2023年,2月20日,星期五publicclassClass15{staticinta;//静态变量

staticvoidhello(){//静态方法

System.out.println("救川~~");}staticvoidsetA(intb){//在静态方法中调用另一个静态方法

a=b;//静态变量a hello();}voidprintA(){//在非静态方法中调用静态方法

System.out.println(a); hello();}publicstaticvoidmain(String[]args){Class15.setA(100);Class15ob=newClass15();ob.printA();}}类方法第55页,共76页,2023年,2月20日,星期五在使用类方法时要注意以下几个问题:(1)使用static修饰的类方法是属于某个类的,它在内存空间中的内容将随着类的定义而进行分配和装载,不被任何一个对象所单独拥有。(2)类方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类的类变量,也就是说类方法只能处理类变量或者调用类方法。不能调用实例方法。实例方法可以调用该类中的任何其他方法:包括类方法和其他实例方法。(3)因为类方法不能访问实例变量,所以在类方法中不能使用关键字this。类变量与类方法的一些说明第56页,共76页,2023年,2月20日,星期五局部变量类中的变量可分为成员变量(MemberVariable)与局部变量(LocalVariable)两类成员变量在类体中定义,其作用域为整个类。成员变量在类中定义的顺序与位置并不影响它的作用域范围局部变量的作用域(Scope)又称为局部变量的作用范围,它是变量可被使用的代码块范围;作用域决定了变量的可见性与生存时间。局部变量作用域开始于它的声明,持续到包含该局部变量的程序段结束之处。不同类型的局部变量,其作用域也不尽相同3231第57页,共76页,2023年,2月20日,星期五局部变量的三种类型定义于方法体内的局部变量:这类局部变量仅能在方法内使用,其作用域局限于所定义的方法体。复合语句(或称为语句块)中定义的局部变量:这类局部变量只在复合语句中有效。方法的形参也称为局部变量:这类局部变量的作用域覆盖整个方法。方法形参在方法被调用时被创建,并以调用方法传来的实参作为其初始值,当方法终止,调用结束时,这些形参自动被释放,其生命周期也随着终止。333132第58页,共76页,2023年,2月20日,星期五局部变量的使用原则局部变量不允许加Java修饰符局部变量在使用前必须先声明,并赋初值,否则将出错第59页,共76页,2023年,2月20日,星期五classPeople{double身高;//成员变量

booblean性别=true;

String姓名,职业;

publicvoid人物简介() //成员方法定义

{

age=30; //合法,因为age为全局变量,且和定义位置无关

String爱好=“围棋”; //局部变量

System.out.println(“个人基本资料:”

+姓名+年龄+性别+身高+职业+爱好);

}intage;

publicvoidspeak(Strings){

System.out.println(“我的娱乐是”+爱好);//非法,变量爱好是局部变量

}}局部变量在变量定义过程中,有时会出现成员变量和局部变量同名的情况,此时,在出现局部变量的方法中,同名的成员变量会被隐藏,即这个成员变量会在这个方法内暂时失效。第60页,共76页,2023年,2月20日,星期五This关键字

一个对象中的方法一般可以直接访问同一对象的成员变量。但是,有时候方法体内部定义的变量和成员变量名字相同,还有时方法的入口参数和对象的成员变量名字相同,那么就需要将三者区别清楚。因此,专门用this来指明当前对象的成员变量。通过this可以引用当前对象的成员变量或者调用当前对象的成员方法。语法格式如下:this.成员变量

this.成员方法([参数列表])第61页,共76页,2023年,2月20日,星期五This关键字

说明:(1)由于this用于表示指向当前对象的引用,所以它不能在类成员方法(静态方法)中使用,只能出现在实例成员方法中。(2)在类的方法体中,如出现形参或局部变量与成员变量同名的情况,系统默认的是形参或局部变量,若需要访问成员变量,则只能使用this来引用。(3)在没有以上同名情况的时候,对于当前对象的成员变量和成员方法的访问可以省略this引用。(4)this引用还可以用在重载的构造方法中,以调用本类已定义的构造方法。语法格式如下:

this([参数列表])(5)在构造方法中,this()引用必须是第一行语句。第62页,共76页,2023年,2月20日,星期五关键字this最常见的应用是在类的构造方法和实例方法中解决局部变量与成员变量同名的问题。例如,下面一段程序:publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){name=name;age=age;gender=gender;height=height;weight=weight;}…

…}This关键字第63页,共76页,2023年,2月20日,星期五在上面的一段程序中,共有name、age、gender、height和weight5个实例变量。在构造方法中的5个参数的变量名称与实例成员变量的名称一一对应相同。在参数名或者局部变量名与实例成员变量同名的时候,由于参数变量和局部变量的优先级高,所以在方法体中参数名或者局部变量名将隐藏同名的实例成员变量。这种情况在Java语言中是不被允许的。如果想使实例变量和方法的参数或方法本身定义的局部变量同名的话,就需要用一种方法使实例成员变量与和其同名的方法参数或局部变量区分开来,这就要使用到this关键字。下面的一段程序改写了上面的程序,使People类的构造方法可以合法地使用与实例变量名称相同的参数。This关键字第64页,共76页,2023年,2月20日,星期五publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){=name;this.age=age;this.gender=gender;this.height=height;this.weight=weight;}…

…}其中,使用this调用的都是实例变量,例如:,而name是参数变量。由上面的实例,我们可以看出,this在方法体中用来指向调用当前正在执行方法的对象。当然我们也可以通过使用与实例变量名不同的参数名或者局域变量名来避免这个问题。This关键字第65页,共76页,2023年,2月20日,星期五publicclassClass27{inta;publicClass27(){ a=10;}publicClass27(inta){ a=a;}publicstaticvoidmain(String[]args){Class27ob1=newClass27();Class27ob2=newClass27(20);Class27ob3=newClass27(30);

System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);

}}一个使用this关键字的例子—构造方法参数与成员变量重名?第66页,共76页,2023年,2月20日,星期五//源文件名:theThis.javaclassaThis{inta1=1;inta2=2;voidss(){inta1=10;inta2=20;System.out.println("局部变量a1="+a1);System.out.println("局部变量a2="+a2);System.out.println("成员变量a1="+this.a1);System.out.println("成员变量a2="+this.a2);}}publicclasstheThis{publicstaticvoidmain(Stringargs[]){aThisaa=newaThis();aa.ss();}}一个使用this关键字的例子-局部变量与成员变量重名第67页,共76页,2023年,2月20日,星期五1.成员方法调用成员方法根据其是否带有static修饰符可以分为类方法和实例方法。(1)实例方法调用的格式:对象名.方法名(实参列表);例如:Circlec1=newCircle();//r1是对象名System.out.println(“area=”+c1.getArea());(2)类方法调用的格式:类名.方法名(实参列表);例如:publicclassClass14{staticinta;staticvoidsetA(intb){a=b;

}publicstaticvoidmain(String[]args){Class14.setA(10);}}方法调用及参数传递第68页,共76页,2023年,2月20日,星期五方法调用方式分类以表达式方式调用方法:对于有返回值的方法,将其作为表达式或表达式的一部分来调用。调用的形式为:变量=对象名.方法名([实际参数表]);以语句方式调用方法:对于返回值为空(void)的方法,一般以独立语句的方式进行调用。调用的形式为:对象名.方法名([实际参数表]);根据成员方法是否有返回值将调用方式分为两类:3132publicclassEmpInfo{Stringname;//雇员的姓名

Stringdesignation;//雇员的职务

Stringdepartment;//雇员的部门

voidprint(){//成员方法

System.out.println(name+"is"+designation+"at"+department);}

publicstaticvoidmain(Stringargv[]){EmpInfoemployee=newEmpInfo();//创建对象并实例化

="RobertJavaman";//给成员变量赋值

employee.designation="Manager";//给成员变量赋值

employee.department="CoffeeShop";//给成员变量赋值

employee.print();//调用方法print()}}第69页,共76页,2023年,2月20日,星期五方法参数传递机制方法的参数是方法的输入接口,是外界传递给方法进行加工操作的数据方法的参数传递机制是指采用何种方式将实参传递给形参第70页,共76页,2023年,2月20日,星期五2.参数传递(1)形参和实参【例】程序题目publicclassTest{publicintmin(inta,intb){intc;

c=(a<b)?a:b;

returnc;}publicstaticvoidmain(String[]args){intmin=0,x=10,y=20;

Testt=newTest();

min=t.min(x,y);

System.out.println(“minis”+min);

}}方法调用及参数传递第71页,共76页,2023年,2月20日,星期五(2)参数传递分为:按值传递和引用传递【例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论