《第7章类的基本构架.ppt》由会员分享,可在线阅读,更多相关《第7章类的基本构架.ppt(56页珍藏版)》请在三一办公上搜索。
1、类与对象的概念,程序设计所面对的问题域客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议)。把客观世界中的事物映射到面向对象的程序设计中就是对象。对象是面向对象程序设计中用来描述客观事物的程序单位。客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。所以,类是对象的抽象和归纳,对象是类的实例。,抽象原则 所谓抽象(abstraction),就是从被研究对象中舍弃个别的、非本质的、或与研究主旨无关的次要特征,而抽取与研究工作有关的实质性内容加以考察,形成对所研究问题正确的、简明扼要的认识。例如,“马”就是
2、一个抽象的概念,实际上没有任何两匹马是完全相同的,但是我们舍弃了每匹马个体之间的差异,抽取其共同的、本质性的特征,就形成了“马”这个概念。抽象是科学研究中经常使用的一种方法,是形成概念的必要手段。在计算机软件开发领域,抽象原则的运用非常广泛,概括起来,可分为过程抽象和数据抽象两类。,1.过程抽象 过程抽象是指:软件开发者可以把任何一个完成确定功能的操作序列都看作是一个单一的实体,尽管它实际上可能是由一系列更低级的操作完成的。运用过程抽象,软件开发者可以把一个复杂的功能分解为一些子功能(模块),如果子功能仍比较复杂,则可以进一步分解。这使得开发者可以在不同的抽象层次上考虑问题,在较高层次上思考时
3、可以不关心较低层次的实现细节。面向过程的程序设计采用的是过程抽象方法。使用过程抽象有利于控制、降低整个程序的复杂度,但是,这种方法允许在全系统的范围内进行功能的描述,本身自由度大,难于规范化和标准化,不易保证软件的质量,而且操作起来也有一定难度。,2.数据抽象 数据抽象把系统中需要处理的数据和施加于这些数据之上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包含了针对这些数据的授权操作,并限定数据的值只能由这些操作来观察和修改。因此,数据抽象是相对于过程抽象更为严格、更为合理的抽象方法。面向对象的程序设计就是采用数据抽象这一方法来构建程序中
4、的类和对象的。它强调把数据和操作结合为一个不可分的系统单位对象,对象的外部只需要知道这个对象能做什么,而不必知道它是如何做的。,对象 只要仔细研究程序设计所面对的问题域客观世界,我们就可以看到:客观世界是由一些具体的事物构成的,每个事物都具有自己的一组静态特征(属性)和一组动态特征(行为)。例如,一辆汽车有颜色、型号、马力、生产厂家等静态特征,又具有行驶、转弯、停车等动态特征。把客观世界的这一事实映射到面向对象的程序设计中,则把问题域中的事物抽象成了对象(Object),事物的静态特征(属性)用一组数据来描述,事物的动态特征(行为)则用一组方法来刻画。因此,对象具有下述特征:,(1)对象标识:
5、即对象的名字,是用户和系统识别它的唯一标志。例如,汽车的牌照可作为每一辆汽车对象的标识。对象标识有“外部标识”和“内部标识”之分。外部标识供对象的定义者或使用者用,内部标识供系统内部唯一地识别每一个对象。在计算机世界中,我们可以把对象看成计算机存储器中一块可标识的区域,它能保存固定或可变数目的数据(或数据的集合)。(2)属性:即一组数据,用来描述对象的静态特征。例如,汽车的颜色、型号、马力、生产厂家等。在Java程序中,把这一组数据称为数据成员。,(3)方法:也称为服务或操作,它是对象动态特征(行为)的描述。每一个方法确定对象的一种行为或功能。例如,汽车的行驶、转弯、停车等动作可分别用move
6、()、rotate()、stop()等方法来描述。为避免混淆,本书中把方法称为成员方法。在Java程序中,类是创建对象的模板,对象是类的实例,任何一个对象都是隶属于某个类的。Java程序设计是从类的设计开始的,所以,在进一步讲述对象的知识之前,必须先掌握类的概念。,类 对象是对事物的抽象,而类是对对象的抽象和归纳。人类在认识客观世界时经常采用的思维方法就是把众多的事物归纳成一些类。分类所依据的原则是抽象,即抽象出与当前目标有关的本质特征,而忽略那些与当前目标无关的非本质特征,从而找出事物的共性,把具有共同性质的事物归结为一类,得出一个抽象的概念类。在面向对象的编程语言中,类是一个独立的程序单位
7、,是具有相同属性和方法的一组对象的集合。类的概念使我们能对属于该类的全部对象进行统一的描述。例如,“树具有树根、树干、树枝和树叶,它能进行光合作用”。这个描述适合于所有的树,从而不必对每棵具体的树都进行一次这样的描述。因此,在定义对象之前应先定义类。描述一个类需要指明下述三个方面内容:,(1)类标识:类的一个有别于其他类的名字。这是必不可少的。(2)属性说明:用来描述相同对象的静态特征。(3)方法说明:用来描述相同对象的动态特征。,例如,下面是对dog类进行的描述:class dog/class指出这是一个类,dog是类标识 String name;int AverageWeight;类的属性
8、(静态特征)int AverageHeight;public void move()类的方法(动态特征)public void ShowDog(),dog类,类与对象的关系 类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。类与对象之间的关系就如同一个模具与用这个模具铸造出来的铸件之间的关系一样。也就是说,我们可以把类与对象之间的关系看成是抽象与具体的关系。在面向对象的程序设计中,对象被称作类的一个实例(instance),而类是对象的模板(temp1ate)。类是多个实例的综合抽象,而实例又是类的个体实物。如图所示为类与对象的关系。,图 类与对象的关系,定义类的一般格式
9、(1)系统定义的类,即Java类库,它是系统定义好的类。类库是Java语言的重要组成部分。Java语言由语法规则和类库两部分组成,语法规则确定Java程序的书写规范;类库则提供了Java程序与运行它的系统软件(Java虚拟机)之间的接口。Java类库是一组由它的发明者SUN公司以及其他软件开发商编写好的Java程序模块,每个模块通常对应一种特定的基本功能和任务,且这些模块都是经过严格测试的,因而也总是正确有效的。当自己编写的Java程序需要完成其中某一功能的时候,就可以直接利用这些现成的类库,而不需要一切从头编写,这样不仅可以提高编程效率,也可以保证软件的质量。,(2)用户自己定义的类。系统定
10、义的类虽然实现了许多常见的功能,但是用户程序仍然需要针对特定问题的特定逻辑来定义自己的类。用户按照Java的语法规则,把所研究的问题描述成Java程序中的类,以解决特定问题。进行Java程序设计,首先应学会怎样定义类。在Java程序中,用户自己定义类的一般格式如下:class 类名 数据成员 成员方法,图 类的图形表示,可以看出,类的结构是由类说明和类体两部分组成的。类的说明部分由关键字class与类名组成,类名的命名遵循Java标识符的定义规则;类体是类声明中花括号所包括的全部内容,它又由数据成员(属性)和成员方法(方法)两部分组成。数据成员描述对象的属性;成员方法刻画对象的行为或动作,每一
11、个成员方法确定一个功能或操作。,创建对象 创建对象通常包括声明对象、建立对象和初始化对象三步。1声明对象 声明对象就是确定对象的名称,并指明该对象所属的类。声明对象的格式如下:类名 对象名表;,其中:类名是指对象所属类的名字,它是在声明类时定义的;对象名表是指一个或多个对象名,若为多个对象名时,用逗号进行分隔。声明对象的作用是为将来的编译过程提供必要的信息。例如:class_name object_one,object_two;这个语句声明了两个对象object_one,object_two,它们都是class_name类的对象。,2建立对象 所谓建立对象,实际上就是用Java提供的new关键
12、字为对象分配存储空间。在声明对象时,只确定了对象的名称和它所属的类,并没有为对象分配存储空间,此时对象还不是类的实例。只有通过建立对象这一步,才为对象分配内存,使该对象成为类的实例。建立对象的格式如下:对象名=new 构造方法()例如:object_one=new class_name();object_two=new class_name();,也可以在声明对象的同时建立对象,这称为创建一个对象。创建对象的格式如下:类名 对象名=new 构造方法()例如:class_name object_one=new class_name();class_name object_two=new clas
13、s_name();其中:new是Java的关键字,也可将其称为运算符,因为new的作用是建立对象,为对象分配存储空间。执行new class_name()将产生一个class_name()类的实例(对象)。,3.初始化对象 初始化对象是指由一个类生成一个对象时,为这个对象确定初始状态,即为它的数据成员赋初始值的过程,当然,它主要由一些赋值语句组成。由于初始化操作是最常用的操作之一,为简化这一过程,Java还提供了专用的方法来完成它,这个方法被称为构造方法。,使用对象 一个对象可以有许多属性和多个方法。在面向对象的系统中,一个对象的属性和方法被紧密地结合成一个整体,二者是不可分割的,并且限定一个
14、对象的属性值只能由这个对象或它的方法来读取和修改。这便是封装和信息隐藏的一个方面。当一个对象被创建后,这个对象就拥有了自己的数据成员和成员方法,我们可以通过引用对象的成员来使用对象,对象的数据成员的引用方式如下:对象名.数据成员名对象的成员方法的引用方式如下:对象名.成员方法名(参数表),【示例程序】定义一个圆类,使其包括半径、两个数据成员和一个显示面积的成员方法。,class yuandouble r;double pi=3.1415;double mianji()double s;s=pi*r*r;return s;public class leilianxi1public static
15、void main(String args)yuan y;y=new yuan();y.r=10;System.out.println(y.mianji();,数 据 成 员,数据成员的声明 数据成员是用来描述事物的静态特征的。一般情况下,声明一个数据成员必须做的事是给出这个数据成员的标识符并指明它所属的数据类型。在这里我们要指出的是:声明一个数据成员除了这些必做的事情外,我们还可以用修饰符对数据成员的访问权限作出限制。这样一来,数据成员的声明就成了如下的形式:修饰符 数据成员类型 数据成员名表;,其中:修饰符是可选的,它是指访问权限修饰符public、private、protected和非访
16、问权限修饰符static、final等;数据成员类型就是诸如int、float等Java允许的各种定义数据类型的关键字;数据成员名表是指一个或多个数据成员名,即用户自定义标识符,当同时声明多个数据成员名时,彼此间用逗号分隔。,成 员 方 法,成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。它与过去所说的子程序、函数等概念相当。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。成员方法一旦定义,便可在不同的程序段中多次调用,故可增强程序结构的清晰度,提高编程效率。例如,下面的成员方法可完成两个整数的求和运算,一旦完
17、成了它的编写和调试,便可在程序中随时调用该方法,传递不同的参数来完成任意两个整数的求和运算。,int add(int x,int y)int z;z=x+y;return(z);,成员方法的分类 为了便于理解,我们先来看看成员方法的分类。我们可以从不同的角度出发,对成员方法进行分类。从成员方法的来源看,可将成员方法分为:(1)类库成员方法。这是由Java类库提供的,用户只需要按照Java提供的调用格式去使用这些成员方法即可。(2)用户自己定义的成员方法。这是为了解决用户的特定问题,由用户自己编写的成员方法。程序设计的主要工作就是编写用户自定义类、自定义成员方法。,从成员方法的形式看,可将成员方
18、法分为:(1)无参成员方法。例如,void printStar()(2)带参成员方法。例如,int add(int x,int y)当然,还可以从成员方法的功能上将其分为数学运算方法、字符处理方法、图形方法等。介绍上面分类的主要目的是为了帮助我们理解类库成员方法、带参成员方法等几个最常用的名词。实际上,类库成员方法可以是无参成员方法,也可以是带参成员方法。同样,某个带参成员方法既可能是类库成员方法,也可能是用户自已定义的成员方法。,声明成员方法的格式 在Java程序中,成员方法的声明只能在类中进行,格式如下:修饰符 返回值的类型 成员方法名(形式参数表)说明部分 执行语句部分,成员方法的声明包
19、括成员方法头和方法体两部分,其中:成员方法头确定成员方法的名字、形式参数的名字和类型、返回值的类型、访问限制和异常处理等;方法体由包括在花括号内的说明部分和执行语句部分组成,它描述该方法功能的实现。,在成员方法头中:(1)修饰符。修饰符可以是公共访问控制符public、私有访问控制符private、保护访问控制符protected等访问权限修饰符,也可以是静态成员方法修饰符static、最终成员方法修饰符final等非访问权限修饰符。访问权限修饰符指出满足什么条件时该成员方法可以被访问。非访问权限修饰符指明数据成员的使用方式。,(2)返回值的类型。返回值的类型用Java允许的各种数据类型关键字
20、(例如,int,float等)指明成员方法完成其所定义的功能后,运算结果值的数据类型。若成员方法没有返回值,则在返回值的类型处应写上void关键字,以表明该方法无返回值。(3)成员方法名。成员方法名也就是用户遵循标识符定义规则命名的标识符。,(4)形式参数表。成员方法可分为带参成员方法和无参成员方法两种。对于无参成员方法来说则无形式参数表这一项,但成员方法名后的一对圆括号不可省略;对于带参成员方法来说,形式参数表指明调用该方法所需要的参数个数、参数的名字及其参数的数据类型,其格式为:(形式参数类型1 形式参数名1,形式参数类型2 形式参数名2,),方法体中的局部变量 方法体描述该方法所要完成的
21、功能,它由变量声明语句、赋值语句、流程控制语句、方法调用语句、返回语句等Java允许的各种语句成分组成,是程序设计中最复杂的部分,几乎会用到我们已经学习过的和将要学习的绝大多数内容。本着由浅入深、循序渐进的原则,这里先提请读者注意:(1)在方法体内可以定义本方法所使用的变量,这种变量是局部变量,它的生存期与作用域是在本方法内。也就是说局部变量只在本方法内有效或可见,离开本方法则这些变量被自动释放。,(2)方法体内定义变量时,变量前不能加修饰符。(3)局部变量在使用前必须明确赋值,否则编译时会出错。(4)在一个方法内部,可以在复合语句中定义变量,这些变量只在复合语句中有效,这种复合语句也被称为程
22、序块。下面的示例程序C4_11.java中指出了这一问题。(5)方法内部的局部变量可以和类成员变量同名,此时在方法内使用的是局部变量,类成员变量被屏蔽,如果想访问类成员变量,应在变量名前加关键字this。例:this.类成员变量,class yuandouble r;double pi=3.1415;double mianji()int pi=3;double s;s=pi*r*r;/此时pi的值为3;this.pireturn s;,【示例程序c4_10.java】局部变量及其用法。public class c4_10 public static void main(String args)
23、int a=2,b=3;int f=add(a,b);/调用add方法 System.out.println(f=+f);/System.out.println(z=+z);错,z在add方法内,离开add则被清除,static int add(int x,int y)/public int zz;错误的语句,在局部变量zz前误加了public修饰符 int z,d;/本方法中定义的变量z,d z=x+y;/若写成 z=x+d;就会出错,因为d还没有赋值就使用 return z;,【示例程序c4_11.java】复合语句中声明的局部变量。public class c4_11 public st
24、atic void main(String args)int a=2,b=3;int z=a+b;/复合语句中声明的变量z System.out.println(z=+z);/System.out.println(z=+z);错,z只在复合语句中有效,形式参数与实际参数 一般来说,可通过如下的格式来引用成员方法:成员方法名(实参列表)但在引用时应注意下述问题:(1)对于无参成员方法来说,是没有实参列表的,但方法名后的括弧不能省略。(2)对于带参数的成员方法来说,实参的个数、顺序以及它们的数据类型必须与形式参数的个数、顺序以及它们的数据类型保持一致,各个实参间用逗号分隔。实参名与形参名可以相同也
25、可以不同。,(3)实参也可以是表达式,此时一定要注意使表达式的数据类型与形参的数据类型相同,或者使表达式的类型按Java类型转换规则达到形参指明的数据类型。(4)实参变量对形参变量的数据传递是“值传递”,即只能由实参传递给形参,而不能由形参传递给实参。程序中执行到引用成员方法时,Java把实参值拷贝到一个临时的存储区(栈)中,形参的任何修改都在栈中进行,当退出该成员方法时,Java自动清除栈中的内容。下面我们通过一个程序来说明上述各点。,【示例程序c4_12.java】public class c4_12 static void add(double x,double y)double z;z
26、=x+y;System.out.println(z=+z);x=x+3.2;y=y+1.2;System.out.println(x=+x+ty=+y);,static double add1(double y1,double y2)double z;z=y1+y2+2.9;return z;public static void main(String args)int a=2,b=7;double f1=2,f2=4,f3;add(a,b);/按Java的类型转换规则达到形参类型 System.out.println(a=+a+tb=+b);,/f3=add1(f1,f2,3.5);错,实参
27、与形参参数个数不一致 f3=2+add1(f1,f2);System.out.println(f1=+f1+tf2=+f2+tf3=+f3);该程序的运行结果如下:z=9.0 x=5.2 y=8.2a=2 b=7f1=2.0 f2=4.0f3=10.9,【示例程序c4_13.java】public class c4_13 static void add(double x,double y)double z;z=x+y;System.out.println(z=+z);static double add1(double y1,double y2)double z;z=y1+y2+2.9;retu
28、rn z;,public static void main(String args)int a=2,b=7;double f1=2,f2=4,f;add(a,add1(f1,f2);运行结果:10.9,在本类中成员方法的引用方式 成员方法的引用可有下述几种方式。1方法语句 成员方法作为一个独立的语句被引用。例如,程序c4_12.java中的“add(a,b);”语句就是这种形式。2方法表达式 成员方法作为表达式中的一部分,通过表达式被引用。例如,程序c4_12.java中的“f3=2+add1(f1,f2);”语句就是这种形式。,3方法作为参数 一个成员方法作为另一个成员方法的参数被引用。例如
29、,程序c4_13.java中的“add(a,add1(f1,f2);”语句就是这种形式的代表。更为典型的是,在递归的成员方法中,一个成员方法作为它自身的参数被引用。说明:在类的内部调用方法时可以在方法前加上this,,在类的外部,类中成员的引用方式1、在类的外部访问成员变量格式:对象名成员变量名;2、在类的外部访问成员方法格式:对象名成员方法名(),class yuandouble r,pi=3.1415;public double mianji()double s;s=pi*r*r;return s;void show()System.out.println(mianji();,public
30、 class leilianxi1public static void main(String args)yuan y;double s;y=new yuan();y.r=10;/在类的外部访问成员变量 s=y.mianji();/在类的外部访问成员方法System.out.println(s);,public class leilianxi1public static void main(String args)yuan y,y1;double s,s1;y=new yuan();y1=new yuan();y1.r=y.r=10;y1.pi=3;s=y.mianji();s1=y1.mia
31、nji();/思考此时s与s1的值,是否相等?System.out.println(s);,隐含参数this,class yuandouble r,pi=3.1415;public double mianji()double s;s=this.pi*this.r*this.r;/this表示调用这个方法的对象return s;void show()System.out.println(mianji();,练习 class Aint x,y;void setA(int x1,int y1)x=x1;y=y1;int getx()return x;int gety()return y;,public class leishuxinglianxipublic static void main(Stringargs)int x,y;A a=new A();a.setA(10,20);x=a.getx();y=a.gety();System.out.println(x=+x+y=+y);x=a.x;y=a.y;System.out.println(x=+x+y=+y);a.x=100;a.y=200;System.out.println(x=+x+y=+y);x=a.getx();y=a.gety();System.out.println(x=+x+y=+y);,
链接地址:https://www.31ppt.com/p-5335208.html