《教学课件-面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《教学课件-面向对象程序设计.ppt(76页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 面向对象程序设计Object-Oriented Programming3.1 类和和对象象n面向面向对象方法象方法 n类的定的定义 n成成员变量量 n成成员方法方法 n构造方法构造方法 n对象的象的创建和使用建和使用 n类成成员与与实例成例成员 面向面向对象方法象方法现实生活中的对象现实生活中的对象n有形的对象有形的对象医院医院医生医生病人病人手术器械手术器械体温计体温计.n无形的对象无形的对象治疗方案治疗方案手术规程手术规程.面向面向对象方法象方法n对象的特征分析对象的特征分析静态特征:属性静态特征:属性姓名姓名性别性别年龄年龄职称职称专长专长量血压量血压听诊听诊写病历写病历开处方开
2、处方【案例案例3-1】用面向用面向对象方法模象方法模拟医生医生为病人病人诊疗过程。程。案例说明:本本案案例例通通过过对对病病人人就就诊诊模模型型的的分分析析与与简简化化,抽抽象象出出包包括括日日期期、体体温温计计、病病人人以以及及医医生生等等四四个个主主要要的的类类,并并利利用用医医生生类类的的接接诊诊、开开处处方方、诊诊疗疗等等实实例例成成员员方方法法将将这这些些类类联联系系起起来来,重重现现病病人人就就诊诊时时医医生生用用体体温温计计测测量量病病人人体体温温,给给病病人诊疗并开据处方的过程。人诊疗并开据处方的过程。图5-2 案例5-1的运行结果面向对象的基本概念 对象(Object)是一个
3、应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。3132面向对象的基本概念(续1)接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成 34包(Package)是用来容纳
4、一组相关类与接口的容器,是Java语言组织与管理类与接口的一种机制 33类与对象的关系类与对象之间的关系,类似于数据类型与变量之间的关系;一个类可以生成无数个不同的对象,每个对象属性值不同,其状态也不同。可以用计算机模型与计算机实体之间的关系来更形象地说明类与对象之间的关系:将冯诺依曼计算机模型看作计算机类,则不同品牌的计算机实体就对应为一个个的实例对象。类与对象的关系示例计算机模型与计算机实体之间的关系:面向对象编程(OOP)从问题域客观存在的事物出发,将这些现实世界的物理实体抽象成概念世界的抽象数据类,再进一步将这种抽象数据类转换为计算机世界的类(Class);类刻画出实体所具有的状态信息
5、与所能发挥的功能信息,是创建对象时所遵循的模板(Template)。对类进行实例化,就生成一个个的对象,对象对应于各个具体事物,是程序运行过程中实际发挥作用的类的独立内存映像。借助于类与对象这两个面向对象程序中最基本的要素,按照尽可能符合人类自然思维的方式,来构造软件系统,这就是所谓的面向对象程序设计(OOP)OOP的逻辑过程 面向对象设计分析的完整过程如图所示:现实域现实域抽象抽象类类对象对象实例化映射抽象数据类抽象数据类物理实体物理实体逻辑实现概念域概念域计算机世界计算机世界面向对象的重要特征 面向对象具有以下几个重要特征:抽象封装与隐藏继承多态性 33313234抽象 抽象(Abstra
6、ction):抽象是面向对象编程的起点,也是其最本质的特征之一。抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象抽象示例下图阐述了如何由自然界众多的动物实体出发,经过抽象的处理过程,最终得到动物这一概念 封装 封装(Encapsulation):封装也可称为信息隐藏(Information Hiding),是通过对象的方法来访问与改变对象属性的一种机制。封装是面向对象的一个重要原则,其实现的核心是将类的属性与相关的操作捆绑起来,包装成不可分割的、独
7、立的对象实体,将内部的数据与实现细节尽可能隐蔽起来,使外部用户不能直接操纵对象的内部信息,只能通过对象对外提供的施加有一定限制的访问接口来使用对象封装示例下图形象地说明了一个类的封装原理。类对数据与行为的封装是借助于不同级别的访问修饰符来达到控制目的的 继承继承(Inheritance):继承是指从已有的类中可以派生出若干个新类,已有类称为基类或父类,新类称为派生类或子类;子类将自动地获得基类的属性与方法,从而不需再重复定义这些属性与方法;当然子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。类之间的继承关系是现实世界中遗传关系的直接模拟多态性多态性(Polymorphism
8、):是指允许不同类的对象对同一消息作出各自的响应,即以统一的风格处理已存在的数据及相关的操作。多态性语言具有灵活、抽象、行为共享、代码共享的优势,较好地解决了应用程序中方法同名的问题 OOP的优越性 从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:提升程序的开发与运行效率提高代码的可重用性(或者称为复用性)按照与人类习惯思维方法一致的原则开发系统OOP的优越性(续)提高程序的可靠性与可维护性 提高程序的可扩展性 增强程序的可控制性 总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从
9、而获得较高的开发效率与可靠效果类的定的定义 u在面向对象的程序设计中,将数据与对数据进行的操作合起来定义为类。u类是将数据和与数据相关的操作封装在一起的集合体,用来定义一组对象共同具有的状态(属性)和行为(方法)的模板。u类是一种复杂的数据类型,它不但包含数据,还包含了对数据进行操作的方法(Method),通常将类中的数据称为成员变量,而操作数据的方法称为成员方法,二者统称为类的成员。类的定的定义 nJava类的定义格式如下:n说明:(1)类声明定义该类的名称、访问权限、与其他类的关系以及实现的接口等。(2)类主体定义该类中的成员,包含成员变量和成员方法。成员方法是用来描述对成员变量进行的操作
10、,不但定义方法,一般还要实现该方法。类的定的定义 n类声明的格式如下:class extends implements n说明:(1)class是定义类的关键字,、都应该是合法的Java标识符。(2)在类的声明中必须包括关键字class和自定义的类名,而方括号中的是可选项。(3)子句extends 显式地指明当前类的父类,子句implements 则说明当前类要实现接口。类的定的定义 n类主体的定义格式如下:n说明:(1)类体的数据声明为成员变量,针对数据的操作声明为成员方法,数据的操作过程在成员方法的实现中体现。(2)构造方法主要用于类对象的实例化,又称构造器。(3)类体中声明的成员变量和方
11、法的排列顺序可以任意。成成员变量量 n声明类的成员变量格式如下:修饰符 static final 数据类型 成员变量名1,成员变量名2,n说明:(1)修饰符的作用是限定成员变量的可访问权限,主要有public(公共的)、protected(受保护的)、private(私有的)以及缺省等四种情况(2)static用于声明类成员变量,用于保存与整个类有关的状态数据的成员变量称为静态成员变量或者类成员变量,简称为类变量,final用于声明常量;(3)成员变量的数据类型既可以是基本数据类型,也可以是引用数据类型,如数组或者其他类对象等。成成员方法方法n成员方法是可被调用执行并返回值的、能实现特定功能的
12、程序段。n成员方法声明格式如下:修饰符abstractstaticfinal 返回值类型 方法名(参数列表)throws 异常类 方法体 n说明:(1)方法的修饰符和成员变量的修饰符一样有四种情况;(2)abstract、static和final分别用于指定所声明的方法为抽象方法、静态方法和最终方法。静态方法又称类成员方法或类方法,一般用于与类有关的数据操作,可以使用类名直接调用。成成员方法方法(3)成员方法执行数据操作功能后都会向调用者返回数据操作的结果,返回值类型就是用于声明该成员方法返回值结果的数据类型,可以是包括基本数据类型和引用类型在内任何合法的类型。(4)若成员方法不返回任何值,则
13、返回值类型用void标记,不能缺省。(5)每个成员方法都有一个方法名,紧邻方法名的是用一对括号()括起来的参数列表,参数列表也称为形式参数表,简称形参表。(6)形参表主要用于声明该成员方法在被调用时需要调用者提供的、与数据操作相关的参数的个数与数据类型。每个成员方法允许声明的形参可以有0到多个,每个形参由形参数据类型、空格符和形参名组成,多个形参之间用逗号分隔,即便成员方法没有形参,括号()也不能缺省。成成员方法方法(7)形参的作用域是局部的,只限于声明它的成员方法之内有效。throws用于声明该成员方法在执行过程中可能会抛出的异常类型。(8)花括号所括起来的就是方法体,方法体可以包含一到多条
14、语句,用以实现成员方法所负责的数据操作功能。若成员方法的返回值类型不为void,则在方法体中需要使用return语句返回其数据操作的结果,且结果类型必须与方法声明的返回值类型相一致。(9)在方法体内可以局部变量,其作用域只限于声明它的方法体内,且声明中不能使用public等访问修饰符和static关键字,同时需遵循“先赋值,后使用”的原则,且在同一个类的不同方法中可以声明同名的局部变量,包括形式参数在内的所有局部变量都不能在方法体外被访问。成成员方法方法如果方法有返回如果方法有返回值类型,型,则方法体中必方法体中必须有有returnreturn语句句如果想如果想让方法方法执行后得到行后得到值a
15、 a,即返回,即返回值为a a,那么在方法,那么在方法中要使用中要使用returnreturna a语句。句。returnreturn有有“返返还”之意,它把表达之意,它把表达式的式的值返回到返回到调用之用之处。例如:。例如:public class Class3public class Class3 double f(int x)double f(int x)return 2.5+x;return 2.5+x;public static void main(String args)public static void main(String args)Class3 aaa=new Class
16、3();Class3 aaa=new Class3();double y=aaa.f(3);double y=aaa.f(3);System.out.println(y);System.out.println(y);System.out.println(aaa.f(2);System.out.println(aaa.f(2);构造方法构造方法n每当由类构造对象时都要调用该类特定的构造方法,在Java中,每个类都至少有一个构造方法。构造方法可以确保用户正确地构造类的对象,同时,构造方法也会对对象作初始化工作。n构造方法的声明格式如下:()初始化的程序代码块n说明:(1)一个类的构造方法可以有多个
17、,它们都具有相同的方法名,即类名;(2)与类的成员方法不同,构造方法用于创建类的对象并对对象的成员变量进行初始化。(3)构造方法没有返回值类型,但是也不能有void关键字,且只能通过new运算符调用,且其修饰符一般采用public(或者没有),以便于在其他位置根据需要定义并实例化该类的对象。可以使用参数值作为变量的可以使用参数值作为变量的初值,也可以直接给变量赋初值,也可以直接给变量赋具体的数值。具体的数值。构造方法构造方法(4)当一个类没有显式声明其构造方法时,Java编译器会自动为该类生成一个默认的、无参数的构造方法,且实例化后对象的成员变量在没有特别赋值的情况下自动获得其所声明类型的默认
18、值。构造方法构造方法 构造方法分为缺省的构造方法(不带参数)和带参数的构造方法。(1)缺省的构造方法 如果类的定义没有编写构造方法,Java语言会自动为用户提供。这个由Java自动提供的构造方法就是所谓的缺省构造方法。缺省的构造方法确保每个Java类都至少有一个构造方法,该方法应符合方法的定义。例如在下例的类EmpInfo中,我们没有定义构造方法,则Java自动提供了一个缺省的构造方法,如下:public EmpInfo()/缺省的构造方法构造方法构造方法EmpInfo.javaEmpInfo.javapublic class EmpInfo public class EmpInfo Stri
19、ng name;/String name;/雇员的姓名雇员的姓名 String designation;/String designation;/雇员的职务雇员的职务 String department;/String department;/雇员的部门雇员的部门 void print()/void print()/成员方法成员方法 System.out.println(name+is +designation+at +department);System.out.println(name+is +designation+at +department);public static void m
20、ain(String argv)public static void main(String argv)EmpInfo employee=new EmpInfo();/EmpInfo employee=new EmpInfo();/创建对象并实例化创建对象并实例化 employee.name=Robert Javaman ;/employee.name=Robert Javaman ;/给成员变量赋值给成员变量赋值 employee.designation=Manager ;/employee.designation=Manager ;/给成员变量赋值给成员变量赋值 employee.depa
21、rtment=Coffee Shop ;/employee.department=Coffee Shop ;/给成员变量赋值给成员变量赋值 employee.print();/employee.print();/调用方法调用方法print()print()运行结果如下:Robert Javaman is Manager at Coffee Shop调用缺省的构造方法调用缺省的构造方法构造方法构造方法构造方法构造方法(2)带参数的构造方法 带有参数的构造方法能够实现这样的功能:当构造一个新对象时,类构造方法可以按需要将一些指定的参数传递给对象的变量。构造方法构造方法例如,可以例如,可以为Peop
22、lePeople类增加一个如下所示的构造方法增加一个如下所示的构造方法Class PeopleClass People string name;string name;int age;int age;float height;float height;float weight;float weight;public People()/public People()/无参数无参数 name=name=沈昕沈昕;age=26;age=26;height=1.62;height=1.62;weight=55.5;weight=55.5;构造方法构造方法如果希望在创建对象时,其实例变量具有不同的初值,
23、可以通过传递参数并将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对应,例如:People类的另一种构造方法为:带参数的构造方法 Class People string name;int age;float height;float weight;public People(String initName,int initAge,double initHeight,double initWeight)name=initName;age=initAge;height=initHeight;weight=initWeight;对象的象的创建和使用建和使用 n 对象是类的实例,所以一
24、个对象必定属于一个已知的类。nJava语言中,一个对象的生命周期经历:创建,使用,销毁等三个阶段。对象被创建后将获得包括内存在内的所需资源;而对象销毁后,其所占的资源将被系统自动回收。Java语言具有资源回收机制,能跟踪存储单元的使用情况,自动回收不再被使用的资源。n对象的创建:创建一个对象包括两个步骤-声明对象和为对象分配内存。1)对象的声明一般格式为:类名 对象名如:People 张三这里people是前面定义的一个类的名字,张三是声明对象的名字。但此时对象“张三”的内存中没有任何数据,即“张三”还是一个空对象,不能使用。要是用这个对象还必须为这个对象分配内存,也叫做为对象分配实体。对象的
25、象的创建和使用建和使用2)为对象分配内存:为对象分配内存,即使用new运算符和类的构造方法实例化某个对象。如果类中没有构造方法,系统会自动调用默认的构造方法(没有参数,名字遵循普通构造方法的要求:和类名相同),格式为 对象名=new 构造方法名(实参列表);/实例化对象 例如:张三=new People()也可以把以上两个步骤合在一起,格式为:类名 对象名 =new 构造方法名(实参列表);例如 People 张三=new People()newnew可以实例化类的多个不同的对象,可以实例化类的多个不同的对象,分配不同的内存。因此,这些对象之间分配不同的内存。因此,这些对象之间的状态相互独立。
26、的状态相互独立。对象的象的创建和使用建和使用 n创建一个对象后,在程序中就可以引用对象中的成员变量,调用对象的成员方法,语法格式如下:对象名.成员变量对象名.成员方法(实参列表)n例如:aday.year=2009;aday.setDate(2009,10,28);n说明:(1)对象名与成员变量或方法之间使用点运算符“.”分隔。(2)方法调用时给出的参数称为实际参数,简称实参。实参可以是常量、变量、表达式或方法的调用,实参的个数与数据类型及排列次序一定要与类定义中该方法声明的形参保持一致,且多个实参之间用逗号分隔。对象的象的创建和使用建和使用(2)当调用方法时,系统按照实参与形参一一对应的关系
27、将实参的值或引用传递给对应的形参。需要特别注意的是,若实参为引用类型的数据,其值不能为null。方法后的圆括号()是必需的,即便该方法没有声明形式参数也不能缺省。对象象创建的一个例子建的一个例子class People int age;String name;double height;People()name=张婷;age=25;height=160.0;void laugh()/类的一个成员方法System.out.println(Haaha.);public static void main(String args)System.out.println(main方法执行);People
28、p=new People();p.laugh();(p.name=+p.name);(p.age=+p.age);(p.height=+p.height);一个构造函数一个构造函数对象象创建的一个例子建的一个例子public class Class27 int a;public Class27()a=10;public Class27(int q)a=q;public static void main(String args)Class27 ob1=new Class27();Class27 ob2=new Class27(20);Class27 ob3=new Class27(30);Sys
29、tem.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);两个构造函数两个构造函数对象象创建的一个例子建的一个例子class Man int height;int age;public class Class1 public static void main(String args)Man man1;man1=new Man();man1.height=180;man1.age=20;System.out.println(man1.height);/使用对象的成员变量 System.out.printl
30、n(man1.age);在本源程序中,有两在本源程序中,有两个类,其中包含主方个类,其中包含主方法的类为主类,文件法的类为主类,文件名与主类名相同名与主类名相同对象的象的创建和使用建和使用对象的创建对象的创建课堂练习:课堂练习:有一个类有一个类class1class1拥有以下成员变量拥有以下成员变量:Int:Int a;Double b;String c;a;Double b;String c;请编写构造函数请编写构造函数(带参数带参数)初始化成员变量初始化成员变量,创建类创建类class1class1的对象的对象ob,ob,输出输出对象对象obob的三个成员变量值。的三个成员变量值。类成成员
31、与与实例成例成员 nJava类中所包含的成员从功能上可以划分为成员变量和成员方法两种。其中,前者存储数据,后者负责数据的处理。n然而,从成员与类及类实例(对象)之间的关系的上看,类中的成员还可以划分为类成员和实例成员两种。类成成员与与实例成例成员n类成员是属于类的,使用static关键字声明,故又称静态成员,包括类成员变量和类成员方法。通过类名就可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也能够引用类成员。当然,类成员也能够通过类的实例(即对象)进行引用。n实例成员则属于类的实例(即对象),包括实例成员变量和实例成员方法。只有创建了对象之后,才能通过对象访问实例成员变量和调用实例
32、成员方法。换句话说,实例成员只能通过类的实例进行引用,而不能为类名。类成成员与与实例成例成员 n成员变量又可以分为:实例成员变量和类成员变量(静静态成成员变量量)(1)实例成员变量-每次创建类的一个实例对象时,系统会为对象的每一个实例成员变量分配内存单元,使得属于不同对象的同一个实例成员变量具有不同值。也就是说,只有对象存在时,其实例成员变量的值才存在。(2)类成员变量-系统运行时为每一个类成员变量只分配一个存储单元,使得所有通过该类实例化的对象共享同一个类成员变量的存储空间。只为该类的第一个对象分配内存单元,其后所有新创建的对象都共享这一个类变量。类成员变量(静态成员变量或类变量)类成员变量
33、(静态成员变量或类变量)如果成员变量的类型关键字前面有关键字如果成员变量的类型关键字前面有关键字staticstatic,这样的成员变量称作,这样的成员变量称作类变量或静态成员变量。类变量或静态成员变量。如:如:class dogclass dog float x float x;/实例成员变量实例成员变量 static int ystatic int y;/类变量类变量 静态成员变量在不创建对象的情况下也可以使用,它是所有对象共有的静态成员变量在不创建对象的情况下也可以使用,它是所有对象共有的变量。变量。如果一个类中的某个成员变量是类变量,那么所有类的实例对象如果一个类中的某个成员变量是类变
34、量,那么所有类的实例对象的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变量,其他类的这个类变量也会随之改变。也就是说,类变量被所有对象量,其他类的这个类变量也会随之改变。也就是说,类变量被所有对象共享。共享。实例成员变量(实例变量):只有在创建了类的对象后才能使用。实例成员变量(实例变量):只有在创建了类的对象后才能使用。类成成员与与实例成例成员 class Chineseclass Chinese static String country=static String country=中国中国;/;/定定义静静态变量
35、量countrycountry并初始化并初始化 String name;String name;int age;int age;void shout()void shout()(啊!我啊!我爱你你+country);+country);/类中的成中的成员方法也可以直接方法也可以直接访问静静态成成员变量量 class TestChineseclass TestChinese public static void main(String args)public static void main(String args)System.out.println(Chinese country is+Ch
36、inese.country);System.out.println(Chinese country is+Chinese.country);/未未创建建对象直接使用象直接使用“类名名.变量名量名”格式格式 Chinese ch1=new Chinese();Chinese ch1=new Chinese();(我我们的祖国是的祖国是 +ch1.country);+ch1.country);/创建了建了对象直接使用象直接使用“对象名象名.变量名量名”格式格式 ch1.shout();ch1.shout();类成员变量例类成员变量例类成成员与与实例成例成员 类的成员方法也分为:实例成员方法和类成员
37、方法类的成员方法也分为:实例成员方法和类成员方法(1)实例成员方法体中既可以访问类成员变量,也可以访问实例成员变量,且只能通过对象来调用。(2)类成员方法体中只能访问类成员变量,不能访问实例成员变量。但是类成员方法既可以通过对象来调用,也可以通过类名调用。class dogclass dog float x float x()()/实例方法实例方法 return return static int ystatic int y();();/类方法类方法 return return 类方法在不创建对象的时候也可以被调用。类方法在不创建对象的时候也可以被调用。若一个方法被声明为若一个方法被声明为类方
38、法,则它只能对类变量进行操作,类方法,则它只能对类变量进行操作,且象类变量一样,类的所且象类变量一样,类的所有实例对象共享同一个类方法。如下例:有实例对象共享同一个类方法。如下例:Main方法就是静态方法,方法就是静态方法,它在程序执行时,由它在程序执行时,由JVM自动调用,而不用先创自动调用,而不用先创建对象建对象类成成员与与实例成例成员 class testclass test int a=3int a=3;static int b;static int b;float ffloat f(int x,int yint x,int y)a=x a=x;b=yb=y;/变量引用合法,因为变量引
39、用合法,因为f f为实例方法为实例方法return x*yreturn x*y;static float gstatic float g(int x,int yint x,int y)a=x a=x;b=2*ab=2*a;/变量变量a a引用不合法,因为引用不合法,因为g g为类方法,而为类方法,而a a为实例变量为实例变量return x*yreturn x*y;类成成员与与实例成例成员 public class Class14 int a;static void setA(int b)a=b;public static void main(String args)Class14.setA(
40、10);错误在于在静态方法中调用了非静态变量,a是成员变量,只有在创建对象后才可以使用类方法类方法public class Class15public class Class15 static int a;/static int a;/静静态变量量 static void hello()/static void hello()/静静态方法方法 (救川救川););static void setA(int b)/static void setA(int b)/在静在静态方法中方法中调用另一个静用另一个静态方法方法 a=b;/a=b;/静静态变量量a a hello();hello();void p
41、rintA()/void printA()/在非静在非静态方法中方法中调用静用静态方法方法 System.out.println(a);System.out.println(a);hello();hello();public static void main(String args)public static void main(String args)Class15.setA(100);Class15.setA(100);Class15 ob=new Class15();Class15 ob=new Class15();ob.printA();ob.printA();类方法类方法在使用类方法
42、时要注意以下几个问题:在使用类方法时要注意以下几个问题:(1 1)使用)使用staticstatic修饰的类方法是属于某个类的,它在内修饰的类方法是属于某个类的,它在内存空间中的内容将随着类的定义而进行分配和装载,存空间中的内容将随着类的定义而进行分配和装载,不被任何一个对象所单独拥有。不被任何一个对象所单独拥有。(2 2)类方法不能操纵和处理属于某个对象的实例变量,)类方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类的类变量,也就是说类方法只而只能处理属于整个类的类变量,也就是说类方法只能处理类变量或者调用类方法。不能调用实例方法。能处理类变量或者调用类方法。不能调用实例方法。
43、实例方法可以调用该类中的任何其他方法:包括类方实例方法可以调用该类中的任何其他方法:包括类方法和其他实例方法。法和其他实例方法。(3 3)因为类方法不能访问实例变量,所以在类方法中不)因为类方法不能访问实例变量,所以在类方法中不能使用关键字能使用关键字thisthis。类变量与类方法的一些说明类变量与类方法的一些说明局部变量 类中的变量可分为成员变量(Member Variable)与局部变量(Local Variable)两类 成员变量在类体中定义,其作用域为整个类。成员变量在类中定义的顺序与位置并不影响它的作用域范围 局部变量的作用域(Scope)又称为局部变量的作用范围,它是变量可被使用
44、的代码块范围;作用域决定了变量的可见性与生存时间。局部变量作用域开始于它的声明,持续到包含该局部变量的程序段结束之处。不同类型的局部变量,其作用域也不尽相同3231局部变量的三种类型定义于方法体内的局部变量:这类局部变量仅能在方法内使用,其作用域局限于所定义的方法体。复合语句(或称为语句块)中定义的局部变量:这类局部变量只在复合语句中有效。方法的形参也称为局部变量:这类局部变量的作用域覆盖整个方法。方法形参在方法被调用时被创建,并以调用方法传来的实参作为其初始值,当方法终止,调用结束时,这些形参自动被释放,其生命周期也随着终止。333132局部变量的使用原则局部变量不允许加Java修饰符局部变
45、量在使用前必须先声明,并赋初值,否则将出错class Peopleclass People double double 身高;身高;/成员变量成员变量 booblean booblean 性别性别=true=true;String String 姓名,职业;姓名,职业;public void public void 人物简介人物简介()()/成员方法定义成员方法定义 age=30age=30;/合法,因为合法,因为ageage为全局变量,且和定义位置无关为全局变量,且和定义位置无关String String 爱好爱好=“=“围棋围棋”;/局部变量局部变量(“个人基本资料:个人基本资料:”+姓名
46、姓名+年龄年龄+性别性别+身高身高+职业职业+爱好);爱好);int age int age;public void speak(String s)public void speak(String s)(“我的娱乐是我的娱乐是”+爱好);爱好);/非法,变量爱好是局部变量非法,变量爱好是局部变量 局部变量在变量定义过程中,有时会出现成员变量和局部变量同名的情况,此时,在出现局部变量的方法中,同名的成员变量会被隐藏,即这个成员变量会在这个方法内暂时失效。This关键字关键字 n一个对象中的方法一般可以直接访问同一对象的成员变量。但是,有时候方法体内部定义的变量和成员变量名字相同,还有时方法的入口
47、参数和对象的成员变量名字相同,那么就需要将三者区别清楚。因此,专门用 this 来指明当前对象的成员变量。n通过this可以引用当前对象的成员变量或者调用当前对象的成员方法。语法格式如下:this.成员变量 this.成员方法(参数列表)This关键字关键字 n说明:(1)由于this用于表示指向当前对象的引用,所以它不能在类成员方法(静态方法)中使用,只能出现在实例成员方法中。(2)在类的方法体中,如出现形参或局部变量与成员变量同名的情况,系统默认的是形参或局部变量,若需要访问成员变量,则只能使用this来引用。(3)在没有以上同名情况的时候,对于当前对象的成员变量和成员方法的访问可以省略t
48、his引用。(4)this引用还可以用在重载的构造方法中,以调用本类已定义的构造方法。语法格式如下:this(参数列表)(5)在构造方法中,this()引用必须是第一行语句。关键字关键字thisthis最常见的应用是在最常见的应用是在类的构造方法和实例方法类的构造方法和实例方法中解决局部变量与成中解决局部变量与成员变量同名的问题。例如,下面一段程序:员变量同名的问题。例如,下面一段程序:public class Peoplepublic class People private String name;private String name;private int age;private in
49、t age;private char gender;private char gender;private double height;private double height;private doublet weight;private doublet weight;public People(String name,int age,char gender,double height,double weight)public People(String name,int age,char gender,double height,double weight)name=name;name=n
50、ame;age=age;age=age;gender=gender;gender=gender;height=height;height=height;weight=weight;weight=weight;This关键字关键字在上面的一段程序中,共有name、age、gender、height和weight5个实例变量。在构造方法中的5个参数的变量名称与实例成员变量的名称一一对应相同。在参数名或者局部变量名与实例成员变量同名的时候,由于参数变量和局部变量的优先级高,所以在方法体中参数名或者局部变量名将隐藏同名的实例成员变量。这种情况在Java语言中是不被允许的。如果想使实例变量和方法的参数或