第5章面向对象的程序设计课件.ppt
第第5章章 面向对象的程序设计面向对象的程序设计 u 5.1【案例【案例14】统计学生成绩】统计学生成绩1相关知识相关知识u 5.2【案例【案例15】统计学生成绩】统计学生成绩2相关知识相关知识u 5.3【案例【案例16】修饰符的能力相关知识】修饰符的能力相关知识u 5.1【案例【案例14】统计学生成绩】统计学生成绩1相关知识相关知识1声明类声明类在在Java编程语言中,类就是一块模块,对象是在其类模块上建立起来的,就编程语言中,类就是一块模块,对象是在其类模块上建立起来的,就像根据建筑图纸来建楼,同样的图纸可用来建许多楼房,而每栋楼房是它自像根据建筑图纸来建楼,同样的图纸可用来建许多楼房,而每栋楼房是它自己的一个对象。可以这样说,己的一个对象。可以这样说,Java程序是由多个类构成的,而程序是由多个类构成的,而Java设计过程设计过程就是声明和应用类的过程,而类是域和相关方法的集合,其中域表明对象的就是声明和应用类的过程,而类是域和相关方法的集合,其中域表明对象的状态,方法表明对象的的行为。状态,方法表明对象的的行为。Java中的类可以分为两种情况,一种是系统声明的类,即中的类可以分为两种情况,一种是系统声明的类,即Java类库中的类,类库中的类,另一种是用户自定义的类。用户自定义类包括声明类和类中具体内容两个步另一种是用户自定义的类。用户自定义类包括声明类和类中具体内容两个步骤,下面将具体介绍如何通过骤,下面将具体介绍如何通过Java语言来创建自定义类。语言来创建自定义类。在在Java语言中,声明类的一般格式如下。语言中,声明类的一般格式如下。修饰符修饰符 class 类名类名 extends 父类名父类名 implements 接口名接口名 类的变量类的变量 构造方法构造方法 类的方法类的方法其中,其中,“类名类名”、“父类名父类名”和和“接口名接口名”必须是合法的标识符,带符号必须是合法的标识符,带符号的的选项可以省略。各选项的具体作用介绍如下。选项可以省略。各选项的具体作用介绍如下。(1)修饰符:在)修饰符:在Java程序中,关键字程序中,关键字class前的修饰符是用来限定所声明的前的修饰符是用来限定所声明的类的特性。现阶段,类的修饰符一般为类的特性。现阶段,类的修饰符一般为public,它表示该类可以被任何对象,它表示该类可以被任何对象或其他类来访问、调用。关于修饰符将在本章第或其他类来访问、调用。关于修饰符将在本章第3节中具体介绍。节中具体介绍。(2)类的父类:在)类的父类:在Java程序中,如果一个类是另一个类的子类,需要继承父程序中,如果一个类是另一个类的子类,需要继承父类的某些功能时,就要用类的某些功能时,就要用extends关键字来指明类的父类。例如,关键字来指明类的父类。例如,“电脑电脑”类类可以看作是可以看作是“电器电器”类的子类。类的子类。Java语言中,如果没有使用语言中,如果没有使用extends说明类说明类的父类,那么每个类都有一个默认的直接父类,它是的父类,那么每个类都有一个默认的直接父类,它是java.lang包中的包中的Object类。类。(3)实现接口:在)实现接口:在Java语言中,还有一个在语法上类似于类的概念,叫接口,语言中,还有一个在语法上类似于类的概念,叫接口,为了能够在类中使用接口,就需要用关键字为了能够在类中使用接口,就需要用关键字implements。在本章第。在本章第3节有接节有接口的详细讲解。口的详细讲解。 2构造方法构造方法构造方法(构造方法(Constructor Method)也称为构造函数,是一种特殊的方法。在)也称为构造函数,是一种特殊的方法。在创建对象时,使用关键字创建对象时,使用关键字new调用这个对象所属类的构造方法来完成对象实调用这个对象所属类的构造方法来完成对象实例变量的初始化。构造方法的格式如下。例变量的初始化。构造方法的格式如下。其中,其中,“语句体语句体”为初始化实例变量的赋值语句,可以使用参数值作为变量为初始化实例变量的赋值语句,可以使用参数值作为变量的初值,也可以直接给变量赋具体的数值。的初值,也可以直接给变量赋具体的数值。一般来说,构造方法具有以下几个特点。一般来说,构造方法具有以下几个特点。构造方法的方法名与其所在类的名称相同。构造方法的方法名与其所在类的名称相同。虽然构造方法没有返回值,但是也不能有虽然构造方法没有返回值,但是也不能有void关键字。关键字。构造方法的修饰符总是构造方法的修饰符总是public。构造方法的主要作用是完成对类对象实例变量的初始化工作。构造方法的主要作用是完成对类对象实例变量的初始化工作。例如,下面的语句是例如,下面的语句是People类的一种构造方法,一共给类的一种构造方法,一共给4个实例变量赋了初个实例变量赋了初值。当调用该构造方法时,就可以完成对值。当调用该构造方法时,就可以完成对4个实例变量的初始化。也就是说,个实例变量的初始化。也就是说,每个每个People类对象中的变量类对象中的变量name、gender、birth和和height具有相同的初始具有相同的初始值。值。public 类名类名(参数列表参数列表) 语句体语句体如果希望在创建对象时,其实例变量具有不同的初值,可以通过传递参数并如果希望在创建对象时,其实例变量具有不同的初值,可以通过传递参数并将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对应,例如,应,例如,People类的另一种构造方法如下:类的另一种构造方法如下:public People() name=李明李明; gender=M; birth=1977; height=1.85;public People(String initName,char initGender,int initBirth,double initHeight) name=initName; gender=initGender; birth=initBirth; height=initHeight;创建类的构造方法后,就可以在应用程序中创建类的实例变量了。例如,下创建类的构造方法后,就可以在应用程序中创建类的实例变量了。例如,下面的语句是在某个应用面的语句是在某个应用People类的程序中,使用上面的类的程序中,使用上面的2种构造方法分别创种构造方法分别创建了建了3个个People类的对象类的对象p1、p2和和p3。因为在第因为在第1条语句中没有参数,所以调用第条语句中没有参数,所以调用第1个构造方法,也就是说执行构造个构造方法,也就是说执行构造方法方法People()中的语句,中的语句,pl对象中的实例变量对象中的实例变量name的值为的值为李明李明、gender的的值为值为M、birth的值为的值为1977、height的值为的值为1.85。第。第2和和3条语句具有参数,则条语句具有参数,则分别调用第分别调用第2个构造方法,将参数值赋给相对应的实例变量。个构造方法,将参数值赋给相对应的实例变量。一般情况下,一个类中可以有一个或者多个构造方法,它们的方法名称相同一般情况下,一个类中可以有一个或者多个构造方法,它们的方法名称相同但是参数不同,相当于方法的重载。如果在声明类对象时没有声明任何构造但是参数不同,相当于方法的重载。如果在声明类对象时没有声明任何构造方法,系统会自动产生一个构造方法,无需声明,称为默认构造方法。默认方法,系统会自动产生一个构造方法,无需声明,称为默认构造方法。默认构造方法不带形式参数,并且方法体为空。例如,如果上面的构造方法不带形式参数,并且方法体为空。例如,如果上面的People类没有类没有声明构造方法,则系统产生的默认构造方法如下。声明构造方法,则系统产生的默认构造方法如下。People p1=new People();People p2=new People(张思安张思安,M,1987,1.72);People p3=new People(薛红薛红,F,1990,1.55);People() 3类的变量类的变量前面介绍过域是类或者对象的状态属性的总称。它可以是普通数据类型的变前面介绍过域是类或者对象的状态属性的总称。它可以是普通数据类型的变量,也可以是其他类的对象类型变量。域常见的有实例变量、静态变量、最量,也可以是其他类的对象类型变量。域常见的有实例变量、静态变量、最终变量和易失变量终变量和易失变量4种形式。介绍如下。种形式。介绍如下。(1)实例变量()实例变量(Instance Variable):实例变量用来存储某个类对象的状态):实例变量用来存储某个类对象的状态值。它必须在类内或任何方法外被定义,一般位于整个类语句体的最前端。值。它必须在类内或任何方法外被定义,一般位于整个类语句体的最前端。其修饰符可以是其修饰符可以是public或者或者private,但是不能使用,但是不能使用static。实例变量的使用。实例变量的使用范围是整个类,也就是说可以在类中的任何方法内被使用。实例变量是依据范围是整个类,也就是说可以在类中的任何方法内被使用。实例变量是依据其对象存在的,当运行程序创建对象的同时,也创建了其实例变量,当程序其对象存在的,当运行程序创建对象的同时,也创建了其实例变量,当程序运行完成,对象消失,其实例变量也同时消失。例如,下面的部分程序代码运行完成,对象消失,其实例变量也同时消失。例如,下面的部分程序代码声明了一个声明了一个People类的实例变量。类的实例变量。public class People public String name; public char gender; public int birth; public double height; 其中,实例变量其中,实例变量name、gender、birth和和height分别表示人的姓名、性别、分别表示人的姓名、性别、出生年份和身高。当创建出生年份和身高。当创建People类的对象时,每个对象的实例变量也是这类的对象时,每个对象的实例变量也是这4个变量,只是对象之间的变量值有可能不同。每一个个变量,只是对象之间的变量值有可能不同。每一个People类对象具有的实类对象具有的实例变量个数和名称是一样的,但是在内存中各自独立占据不同的位置,保存例变量个数和名称是一样的,但是在内存中各自独立占据不同的位置,保存的变量值各不相同。的变量值各不相同。(2)静态变量()静态变量(Static Variable):用修饰符):用修饰符static修饰的变量称为类静态修饰的变量称为类静态变量,也叫做静态变量或者类变量。静态变量是类的变量,不属于任何一个变量,也叫做静态变量或者类变量。静态变量是类的变量,不属于任何一个类的具体对象实例。它不保存在某个对象实例的内存空间中,而是保存在类类的具体对象实例。它不保存在某个对象实例的内存空间中,而是保存在类的内存空间的公共存储单元中。也就是说,不论一个类具有多少个对象,静的内存空间的公共存储单元中。也就是说,不论一个类具有多少个对象,静态变量只有一个,任何一个类的对象访问它,取得的都是相同的数值。同样态变量只有一个,任何一个类的对象访问它,取得的都是相同的数值。同样地,任何一个类的对象去修改它,也都是在对同一个内存单元进行操作。静地,任何一个类的对象去修改它,也都是在对同一个内存单元进行操作。静态变量可以通过类名直接访问,也可以通过对象来调用。采用这两种方法取态变量可以通过类名直接访问,也可以通过对象来调用。采用这两种方法取得的结果是相同的。得的结果是相同的。例如,下面的语句在例如,下面的语句在People类中声明一个静态变量类中声明一个静态变量language,用来表示人所,用来表示人所使用的语言。使用的语言。static String language=汉语汉语;然后在应用程序的然后在应用程序的main()方法中有如下语句。方法中有如下语句。在上面的语句中,在上面的语句中,p1和和p2是是People类的对象变量。第类的对象变量。第1个打印语句中的个打印语句中的pl.language调用调用People类的静态变量类的静态变量lanuage,其值为,其值为汉语汉语。然后通过。然后通过p2来改变变量来改变变量language的值为的值为“英语英语”,第,第2个打印语句的输出值为个打印语句的输出值为“英语英语”,这表示对象这表示对象p1和和p2访问的是同一个变量访问的是同一个变量language。再通过使用类名直接改变。再通过使用类名直接改变变量变量lanuage的值为的值为“法语法语”,最后一个打印语句的输出值为,最后一个打印语句的输出值为“法语法语”,这表,这表示通过类名和对象示通过类名和对象p1访问的是同一个变量访问的是同一个变量language。静态变量与实例变量虽然都是在类内、类中方法之外定义的变量,但是它们静态变量与实例变量虽然都是在类内、类中方法之外定义的变量,但是它们有着本质的不同。有着本质的不同。实例变量一般使用实例变量一般使用private或者或者public作为修饰符。每个类的对象都具有一套作为修饰符。每个类的对象都具有一套属于自己的、在类中定义的实例变量。每个对象只能修改或者访问其自身的属于自己的、在类中定义的实例变量。每个对象只能修改或者访问其自身的实例变量,不会影响其他对象的实例变量。实例变量,不会影响其他对象的实例变量。System.out.println(p1.language);p2.language=英语英语;System.out.println(p1.language);People.language=法语法语;System.out.println(p1.language);静态变量使用静态变量使用static修饰符。每个类的所有对象共同拥有一套类的静态变量。修饰符。每个类的所有对象共同拥有一套类的静态变量。类和其对象都可以修改或者访问静态变量。类和其对象都可以修改或者访问静态变量。(3)最终变量()最终变量(Final Variable):在编写程序时,可以给某些经常要使用):在编写程序时,可以给某些经常要使用的具有特殊含义或者内容复杂的常量,取一个类似于变量名的标识符,这样的具有特殊含义或者内容复杂的常量,取一个类似于变量名的标识符,这样就可以通过使用这个变量名称来引用其对应的常量,而不是每次直接输入常就可以通过使用这个变量名称来引用其对应的常量,而不是每次直接输入常量数值。这种做法的最主要目的是使程序更加清楚,利于其他人阅读、理解。量数值。这种做法的最主要目的是使程序更加清楚,利于其他人阅读、理解。使用修饰符使用修饰符final修饰的变量是最终变量,其保存的数据在程序的整个执行过修饰的变量是最终变量,其保存的数据在程序的整个执行过程中都不会改变。通常,在程中都不会改变。通常,在final前面再加上修饰符前面再加上修饰符static,那么这个变量的实,那么这个变量的实际含义就是常量。例如,际含义就是常量。例如,在程序中,给最终变量赋值以后,就不可以再以任何方式改变其值。在程序中,给最终变量赋值以后,就不可以再以任何方式改变其值。final修修饰符可以修饰局部变量,但也必须且只能赋值一次,它的取值在变量存在期饰符可以修饰局部变量,但也必须且只能赋值一次,它的取值在变量存在期间不会改变。间不会改变。(4)易失变量()易失变量(Volatile Variable):如果一个变量被):如果一个变量被volatile修饰符所修饰,修饰符所修饰,说明这个变量可能同时被几个线程所控制和修改,即这个变量不仅仅被当前说明这个变量可能同时被几个线程所控制和修改,即这个变量不仅仅被当前程序所掌握,在运行过程中可能存在其他未知的程序操作来影响和改变该变程序所掌握,在运行过程中可能存在其他未知的程序操作来影响和改变该变量的值。在使用当中,应该特别留意这些影响因素。量的值。在使用当中,应该特别留意这些影响因素。static final double pi=3.141592653589763;static final String str=str是最终变量是最终变量;通常,通常,volatile用来修饰接受外部输入的变量。例如,表示当前时间的变量将用来修饰接受外部输入的变量。例如,表示当前时间的变量将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间,所以可以把它声明为易失变量。间,所以可以把它声明为易失变量。4类的方法类的方法除了构造方法外,类中还有许多描述类行为的方法,这些方法中最常用的是除了构造方法外,类中还有许多描述类行为的方法,这些方法中最常用的是实例方法和静态方法两种。用实例方法和静态方法两种。用static修饰符修饰的方法为静态方法,又称为类修饰符修饰的方法为静态方法,又称为类方法。不用方法。不用static修饰的方法,则为实例方法。下面将分别具体介绍这两种方修饰的方法,则为实例方法。下面将分别具体介绍这两种方法。法。(1)实例方法()实例方法(Instance Method):实例方法属于每个对象,只能通过类):实例方法属于每个对象,只能通过类的对象调用。实例方法用来定义某个类的行为,也就是说类的对象所能进行的对象调用。实例方法用来定义某个类的行为,也就是说类的对象所能进行的操作与实例变量一样,实例方法的修饰符可以是的操作与实例变量一样,实例方法的修饰符可以是public或者或者private,但是,但是不能用不能用static。如果希望实例方法可以在类之外被访问,则使用。如果希望实例方法可以在类之外被访问,则使用public;如果;如果希望实例方法只在类内被访问,则使用希望实例方法只在类内被访问,则使用private。例如,下面的语句在例如,下面的语句在People类中声明了一个类中声明了一个age()方法,用来计算方法,用来计算People类类某个对象的年龄。某个对象的年龄。public int age() return 2005birth; /当前年份当前年份出生年份出生年份=年龄年龄(2)静态方法()静态方法(Static Method):与静态变量类似,静态方法的本质是属):与静态变量类似,静态方法的本质是属于整个类的,而不属于某个实例对象。因为静态方法属于类本身,所以只要于整个类的,而不属于某个实例对象。因为静态方法属于类本身,所以只要声明了类,它的静态方法就存在,就可以直接使用类来调用。需要调用某个声明了类,它的静态方法就存在,就可以直接使用类来调用。需要调用某个静态方法时,可以使用其所属的类的名称直接调用,也可以用类的某个具体静态方法时,可以使用其所属的类的名称直接调用,也可以用类的某个具体的对象名调用。的对象名调用。前面介绍的前面介绍的Math类中的类中的abs()、max()等方法,以及等方法,以及Integer类中的类中的parseInt()、parseDouble()等方法就是静态方法,直接用类名进行访问。等方法就是静态方法,直接用类名进行访问。在使用静态方法时要注意以下几个问题。在使用静态方法时要注意以下几个问题。使用使用static修饰的静态方法是属于某个类的,它在内存空间中的内容将随着类修饰的静态方法是属于某个类的,它在内存空间中的内容将随着类的声明而进行分配和装载,不被任何一个对象所单独拥有。的声明而进行分配和装载,不被任何一个对象所单独拥有。静态方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类静态方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类的静态变量,也就是说静态方法只能处理静态变量或者调用静态方法。的静态变量,也就是说静态方法只能处理静态变量或者调用静态方法。因为静态方法不能访问实例变量,所以在静态方法中不能使用关键字因为静态方法不能访问实例变量,所以在静态方法中不能使用关键字this。作为程序入口的作为程序入口的main()方法必须要用方法必须要用static来修饰,也是因为来修饰,也是因为Java运行时系运行时系统在开始执行一个程序前,并没有生成类的一个对象,它只能通过类名来调统在开始执行一个程序前,并没有生成类的一个对象,它只能通过类名来调用用main()方法,作方法,作为为程序的入口。程序的入口。5访问方法访问方法大多数情况下,使用大多数情况下,使用private修饰实例变量,使用修饰实例变量,使用pulic修饰实例方法。修饰实例方法。private修饰符表示只可以在其所在的类的内部被访问和调用,而修饰符表示只可以在其所在的类的内部被访问和调用,而public修饰修饰符则表示可以在其所在的类的内部或者外部被访问和调用。符则表示可以在其所在的类的内部或者外部被访问和调用。很显然如果实例变量和实例方法一样,都使用很显然如果实例变量和实例方法一样,都使用public来修饰,则可以更方便来修饰,则可以更方便地在应用程序中改变变量的值。但是为什么大多数程序都使用地在应用程序中改变变量的值。但是为什么大多数程序都使用private修饰实修饰实例变量,然后再通过实例方法来改变其值呢?下面以例变量,然后再通过实例方法来改变其值呢?下面以People类为例来解释原类为例来解释原因。因。p1是是People类的一个对象实例,因为类的一个对象实例,因为People类中实例变量均使用类中实例变量均使用public修饰,修饰,所以可以通过所以可以通过p1来访问其实例变量。假设应用程序中有下面一条语句:来访问其实例变量。假设应用程序中有下面一条语句:该语句将实例变量该语句将实例变量gender的值改变为的值改变为A。从常理上来说,一个人的性别只可。从常理上来说,一个人的性别只可能是男(能是男(M)或者女()或者女(F),),A是无意义的数值。但是因为变量是无意义的数值。但是因为变量gender的的修饰符是修饰符是public,所以无法限制其他应用程序在调用该变量时,赋予其数值,所以无法限制其他应用程序在调用该变量时,赋予其数值的范围。的范围。为了解决这个问题,可以将变量为了解决这个问题,可以将变量gender的修饰符设置为的修饰符设置为private,然后在,然后在Peopen类中添加如下的实例方法来控制变量类中添加如下的实例方法来控制变量gender中的数值。中的数值。p1.gender=A;在上面的实例方法中,参数在上面的实例方法中,参数c是其他应用程序赋予实例变量是其他应用程序赋予实例变量gender的值。在的值。在setGemder()方法中,当方法中,当c的值为的值为M或或F时,变量时,变量gender保存该值;否则保存该值;否则变量变量gender的值为一个空格,表示不清楚其性别。这种方法保证了不会出现的值为一个空格,表示不清楚其性别。这种方法保证了不会出现不符合常理的数值的情况。当然,可以在实例方法中编写任意语句,来保证不符合常理的数值的情况。当然,可以在实例方法中编写任意语句,来保证实例变量的值在某个特定范围之内。实例变量的值在某个特定范围之内。这种用来改变和获取使用这种用来改变和获取使用private修饰符修饰的实例变量值的方法称为访问方修饰符修饰的实例变量值的方法称为访问方法(法(Accessor Method)。为了与其他实例方法区别,一般使用)。为了与其他实例方法区别,一般使用set和和get再再加实例变量名称来作为该种方法的名称。例如,加实例变量名称来作为该种方法的名称。例如,setName()表示改变实例变表示改变实例变量量name的值,的值,getBirth()表示获取实例变量表示获取实例变量birth的值。此外,访问方法的修的值。此外,访问方法的修饰符必须为饰符必须为public。public void setGender(char c) if(c=M|c=F) gender=c; else gender=;例如,可以给例如,可以给People类添加如下的访问方法,类添加如下的访问方法, 用来改变和获取实例变量的值。用来改变和获取实例变量的值。当然在编写当然在编写People类时,并不是必须具有以类时,并不是必须具有以 上所有的访问方法,可以根据用户的需求范上所有的访问方法,可以根据用户的需求范 围来确定添加哪些访问方法或者合并哪些访围来确定添加哪些访问方法或者合并哪些访 问方法。例如,出生年份是不会改变的,那问方法。例如,出生年份是不会改变的,那 么就不需要么就不需要setBirth()方法。方法。此外,这些方法的内容并不是固定的,以上此外,这些方法的内容并不是固定的,以上 所给出的只是其最简单的语句体。要根据程所给出的只是其最简单的语句体。要根据程 序具体的要求,来编写方法中的语句。序具体的要求,来编写方法中的语句。public void setName(String newname) name=newName;public String getName() return name;public void setGender(char newGender) gender=newGender;public char getGender() return gender;public void setBirth(int newBirth) birth=newBirth;public int getBirth() return birth;public void setHeight(double newHeight) height=newHeight;public double getHeight() return height;6关键字关键字this关键字关键字this本身的作用是当需要在类的实例方法中指向调用该实例的对象时,本身的作用是当需要在类的实例方法中指向调用该实例的对象时,可以使用关键字可以使用关键字this。在大多数情况下,关键字。在大多数情况下,关键字this不是必须使用的,可以被不是必须使用的,可以被省略。例如,省略。例如,People类中的类中的setName()实例方法可以被写成如下形式。实例方法可以被写成如下形式。其中,其中,this表示当前调用该方法的表示当前调用该方法的People类对象。如果在应用程序中的语句类对象。如果在应用程序中的语句如下。如下。则则setName()方法中的关键字方法中的关键字this代表调用该方法的对象变量代表调用该方法的对象变量p。如果在应用。如果在应用程序中的语句如下。程序中的语句如下。则则setName()方法中的关键字方法中的关键字this代表调用该方法的对象变量代表调用该方法的对象变量per。 public void setName(String newName) this.name=newName;p.setName(赵炎赵炎);per.setName(姜玲姜玲);事实上,如果在事实上,如果在setName()方法中不使用关键字方法中不使用关键字this,程序同样可以正常地编,程序同样可以正常地编译和运行,所以在类似这种情况下一般省略译和运行,所以在类似这种情况下一般省略this。在。在Java语言中,系统会自语言中,系统会自动在调用所有实例变量和实例方法时与动在调用所有实例变量和实例方法时与this关键字联系在一起,因此,在一关键字联系在一起,因此,在一般情况下,不需要使用关键字般情况下,不需要使用关键字this。但是,在某些特定的情况下,关键字。但是,在某些特定的情况下,关键字this是必不可少的,下面介绍两种最常见的情况。是必不可少的,下面介绍两种最常见的情况。(1)局部变量与实例变量同名:关键字)局部变量与实例变量同名:关键字this最常见的应用是在类的构造方法最常见的应用是在类的构造方法和实例方法中解决局部变量与实例变量同名的问题。例如下面一段程序。和实例方法中解决局部变量与实例变量同名的问题。例如下面一段程序。public class People private String name; private char gender; private int birth; private double height; public People(String name,char gender,int birth,double height) name=name; gender=gender; birth=birth; height=height; 在上面的一段程序中,共有在上面的一段程序中,共有name、gender、birth和和height 4个实例变量。个实例变量。在构造方法中的在构造方法中的4个参数的变量名称与实例变量的名称一一对应相同。在参数个参数的变量名称与实例变量的名称一一对应相同。在参数名或者局部变量名与实例变量同名的时候,由于参数变量和局部变量的优先名或者局部变量名与实例变量同名的时候,由于参数变量和局部变量的优先级高,所以在方法体中参数名或者局部变量名将隐藏同名的实例变量。这种级高,所以在方法体中参数名或者局部变量名将隐藏同名的实例变量。这种情况在情况在Java语言中是不允许的。如果想使实例变量和方法的参数或方法本身语言中是不允许的。如果想使实例变量和方法的参数或方法本身定义的局部变量同名的话,就需要用一种方法使实例变量与和其同名的方法定义的局部变量同名的话,就需要用一种方法使实例变量与和其同名的方法参数或局部变量区分开来,这就要使用到参数或局部变量区分开来,这就要使用到this关键字。关键字。下面的下面的People类构造方法可以合法地使用与实例变量名称相同的参数。类构造方法可以合法地使用与实例变量名称相同的参数。public People(String name,char gender,int birth,double height) this.name=name; this.gender=gender; this.birth=birth; this.height=height;当然也可以通过使用与实例变量名不同的参数名或者局部变量名来避免这个当然也可以通过使用与实例变量名不同的参数名或者局部变量名来避免这个问题。问题。(2)在构造方法中调用其他构造方法:关键字)在构造方法中调用其他构造方法:关键字this还有一个用法,就是在构还有一个用法,就是在构造方法的第造方法的第1条语句中使用关键字条语句中使用关键字this,来调用同一个类中的另一个构造方法,来调用同一个类中的另一个构造方法,其格式如下。其格式如下。格式:格式:例如,在下面的例如,在下面的People类中,有两个不同的构造方法类中,有两个不同的构造方法public People(String name,char gender)和和public People(String name,char gender,int birth,double height)。在第。在第1个构造方法中使用个构造方法中使用“this(name,gender,1980,1.50);”语句调用带有语句调用带有4个参数的第个参数的第2个构造方法,个构造方法,这实际是方法的一种重载现象。这实际是方法的一种重载现象。使用这种方法创建对象的好处是,不论应用程序如何调用构造方法,使用这种方法创建对象的好处是,不论应用程序如何调用构造方法,4个实例个实例变量都具有初值。如果在应用程序中使用变量都具有初值。如果在应用程序中使用“People p=new People(张三张三,M);”语句,就会先调用语句,就会先调用People类中的第类中的第1个构造方法,然后再自动调用第个构造方法,然后再自动调用第2个构造方法,并设置实例变量个构造方法,并设置实例变量birth和和height的初值为的初值为1980和和1.55。this(参数列表参数列表);public class People private String name; private char gender; private int birth; private double height; public People(String name,char gender) this(name,gender,1980,1.55); public People(String name,char gender,int birth,double height) name=name; gender=gender; birth=birth; height=height; 要注意的是,由修饰符要注意的是,由修饰符static修饰的静态变量不能使用修饰的静态变量不能使用this来调用。来调用。7对象数组对象数组对象数组的声明和创建与普通类型的数组完全一样,其格式也有以下两种。对象数组的声明和创建与普通类型的数组完全一样,其格式也有以下两种。格式格式1:格式格式2:创建对象数组的形式为:创建对象数组的形式为:对象数组与普通类型的数组的不同之处在于数组元素的初始化。因为对象数对象数组与普通类型的数组的不同之处在于数组元素的初始化。因为对象数组的每一个元素实际上就是类的一个对象,所以需要按照创建对象的方法来组的每一个元素实际上就是类的一个对象,所以需要按照创建对象的方法来初始化数组元素,也就是说需要使用关键字初始化数组元素,也就是说需要使用关键字new来调用类的构造方法。例如,来调用类的构造方法。例如,下面的应用程序使用下面的应用程序使用People类创建对象数组类创建对象数组ps。类名称类名称 数组名数组名;类名称类名称 数组名数组名;数组名数组名=new 类名称类名称数组元素的个数数组元素的个数;public class Exp public static void main(String args) People ps; ps=new Person2; ps0=new People(张三张三,M,1982,1.77); ps1=new People(李四李四,F,1977,1.89); u 5.2【案例【案例15】统计学生成绩】统计学生成绩2相关知识相关知识1类的继承类的继承继承是面向对象程序设计方法中的一种重要手段,通过继承可以更有效地组继承是面向对象程序设计方法中的一种重要手段,通过继承可以更有效地组织程序结构,明确类与类之间的关系,并充分利用已有的类来完成更复杂、织程序结构,明确类与类之间的关系,并充分利用已有的类来完成更复杂、深入的开发。深入的开发。(1)继承的概念:类的继承()继承的概念:类的继承(Inheritance)是面向对象程序设计中的一个)是面向对象程序设计中的一个重要特色。类继承也称为类派生,是指一个类可以继承其他类的所有内容,重要特色。类继承也称为类派生,是指一个类可以继承其他类的所有内容,包括变量和方法。被继承的类称为父类或者超类(包括变量和方法。被继承的类称为父类或者超类(Superclass),父类包括),父类包括所有直接或间接被继承的类。继承后产生的类称为子类或者派生类所有直接或间接被继承的类。继承后产生的类称为子类或者派生类(Subclass),子类继承父类的状态和行为,同时也可以修改父类的状态或),子类继承父类的状态和行为,同时也可以修改父类的状态或者重载父类的行为,并添加新的状态和行为。者重载父类的行为,并添加新的状态和行为。在在Java语言中,所有的类都是通过直接或间接地继承语言中,所有的类都是通过直接或间接地继承java.lang.Object得到得到的,并且可以在已有的大量类的基础上编写新的类。新编写的类如果继承了的,并且可以在已有的大量类的基础上编写新的类。新编写的类如果继承了已有的类,则除了具有父类中的所有变量和方法外,还要再添加自己本身特已有的类,则除了具有父类中的所有变量和方法外,还要再添加自己本身特有的变量或者方法。这种编程方法大大地提高了程序的可复用性,缩短了软有的变量或者方法。这种编程方法大大地提高了程序的可复用性,缩短了软件开发的周期。如果对新建的类再进行修改扩充,可以再派生出新的类。重