Java网络编程基础 第4章 Java面向对象的程序设计.ppt
第四章第四章 JavaJava面向对象的程序设计面向对象的程序设计4.1 面向对象的理论基础面向过程面向过程 在一个结构体中定义窗口的大小、位置、颜色背景等属性,对窗口操作的函数与窗口本身的定义没有任何关系,如HideWindow,MoveWindow和MinimizeWindow,这些函数都需要接受一个代表要被操作的窗口参数,是一种谓语与宾语的关系。面向对象面向对象 定义窗口时,除了要指定在面向过程中规定的那些属性,如大小、位置、颜色、背景等外,还要制定该窗口可能具有的动作,如隐藏、移动、最小化等,这些函数被调用时,都是以某个窗口要怎样来使用的,是一种主语与谓语的关系。4.2 对象和类class person int name;boolean sextype;int age;void eat()void sleep();void work()计算机中的数据原型,即我们定义的类 现实生活中的对象 现实生活中的对象现实生活中的对象抽象得到类的定义抽象得到类的定义类实例化得到对象类实例化得到对象 现实世界现实世界 计算机中的数据计算机中的数据4.2 对象和类对象和类的关系对象是类的实例化类是对象的抽象电视机设计图电视机1电视机2电视机3类对象 什么是类:什么是类:类是描述对象的类是描述对象的“基本原型基本原型”,它定义一种对象所能拥有的,它定义一种对象所能拥有的数据和能完成的操作数据和能完成的操作(成员变量,方法成员变量,方法)。什么是对象:什么是对象:是类的一个实例,是一个实实在在的个体。是类的一个实例,是一个实实在在的个体。4.2 对象和类data数据元素数据元素 方方 法法一个例子:ageage是是属性属性,也叫,也叫成员变量成员变量;showAgeshowAge叫叫类的成员函数类的成员函数;showAgeshowAge方法可以直接访问同一个类中的方法可以直接访问同一个类中的ageage变量,如果该方法中有变量,如果该方法中有与成员变量同名的局部变量,该方法对这个变量名的访问是局部变与成员变量同名的局部变量,该方法对这个变量名的访问是局部变量,不再是成员变量。量,不再是成员变量。class Person int age;public void showAge()System.out.println(age);对象的产生:Person p1=new Person();执行后的内存状态:比较:int xx=new int30;执行后的内存状态:对象的使用:创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法)Class Class TestPersonTestPerson public static void main(String public static void main(String argsargs)Person p1=new Person();Person p1=new Person();Person p2=new Person();Person p2=new Person();p1.age=-30;p1.age=-30;p1.p1.showAgeshowAge();();p2.p2.showAgeshowAge();();对象的使用:上面程序运行的内存布局图如下:对象的生命周期:包包的概念的概念:为解决同一任务或子任务的类组成一个包为解决同一任务或子任务的类组成一个包由由包包、子子包包和和类类构构成成的的一一般般JavaJava程程序序的的树树型型结结构构,JavaJava程程序序保保存存在在文文件件系系统统时时,包包名名对对应应于于一一目目录录名名,子子包包名名对对应应于于目目录录的的子子目目录录,类类对应于它目录树型结构的结点。对应于它目录树型结构的结点。-包名包名1 1 -包名包名1_11_1 -类类1_1_11_1_1 -类类1_1_21_1_2 -类类1_1_31_1_3 -包名包名1_21_2 -类类1_2_11_2_1 -类类1_2_21_2_24.4.3 3 javajava的的包与类包与类4.3.1 类描述对象特征public class Pointpublic class Point public public int int x;/x;/成员变量说明,定义点的成员变量说明,定义点的x x坐标坐标public public int int y;/y;/成员变量说明,定义点的成员变量说明,定义点的y y坐标坐标public Point(public Point(intint X,X,intint Y)/Y)/带参数的构造方法;带参数的构造方法;x=X;y=Y;x=X;y=Y;public double distance()/public double distance()/计算点到原点的距离计算点到原点的距离 return Math.return Math.sqrtsqrt(x*x+y*y);(x*x+y*y);类首说明的形式如下:类首说明的形式如下:packagepackage说明说明 import import 说明说明 修饰符修饰符 class class 类名类名 extends extends 父类名父类名 implements implements 接口列表接口列表 1 1.类修饰符分类:类修饰符分类:friendlyfriendly(默认)默认)类只能被本包中的其他类使用类只能被本包中的其他类使用publicpublic(公共)公共)类能被所有的类访问,注意。类能被所有的类访问,注意。abstractabstract(抽象)抽象)类不能被实例化,含未实现的方法类不能被实例化,含未实现的方法finalfinal(最终)最终)类不能被继承,即不能有子类类不能被继承,即不能有子类2.2.extendsextends:实现单继承4.3.2 4.3.2 类首说明类首说明类体形式说明如下:类体形式说明如下:成员变量说明成员变量说明 构造方法说明构造方法说明 静态方法说明静态方法说明 方法说明方法说明 注意:注意:类体中说明都是可选的类体中说明都是可选的,也没有也没有先后顺序先后顺序之分之分4.3.2 4.3.2 类体类体说明形式:说明形式:修饰符修饰符 类型类型 成员变量名成员变量名1,1,成员变量名成员变量名n;n;修饰符两类:修饰符两类:1 1 访问修饰符:访问修饰符:默认默认的成员变量可以被定义同一包中的任何类访问;的成员变量可以被定义同一包中的任何类访问;publicpublic成员变量可以被项目文件中的任何方法所访问;成员变量可以被项目文件中的任何方法所访问;protectedprotected变量可以被有继承关系的类和同一包中的类的访问;变量可以被有继承关系的类和同一包中的类的访问;privateprivate成员变量只能在同一个类中定义的方法中使用,成员变量只能在同一个类中定义的方法中使用,此法安全此法安全 2 2 其它:其它:finalfinal(常量)、常量)、staticstatic(静态)静态)成员变量说明成员变量说明修饰符修饰符类内类内子类子类包内其他类包内其他类其他包内的类其他包内的类缺省缺省(friendly)publicprivateprotected变量的访问权限变量的访问权限在表格中:在表格中:表示允许访问,表示允许访问,表示禁止访问表示禁止访问 大小大小 public protected 缺省缺省private 1 1 用用staticstatic修饰的成员变量叫修饰的成员变量叫类变量类变量(或或静态变量静态变量),),而而没有没有用用staticstatic修饰的成员变量叫修饰的成员变量叫对象变量对象变量。2 2 staticstatic修饰的数据和方法不局限于所属的对象修饰的数据和方法不局限于所属的对象 所以它不需要创建对象就可以直接访问。所以它不需要创建对象就可以直接访问。static(static(静态静态)类的内部:类的内部:只用变量名即可访问只用变量名即可访问类的外部类的外部:1 1 对象变量:对象变量:只有在构造对象后才能访问到只有在构造对象后才能访问到 格式为格式为:对象名对象名.对象变量对象变量 2 2 类变量类变量:(1 1)通过类名访问通过类名访问 格式格式 :类名类名.类变量名类变量名 (2 2)通过对象名来访问通过对象名来访问成员变量使用成员变量使用例:例:classclass A A static static intint ax;ax;int ay;public classpublic class B B static static intint bxbx;int by;public static voidpublic static void mainmain(String(String argsargs)A.ax=5;A.ax=5;bxbx=A.ax+2;=A.ax+2;/访问类变量访问类变量(不需建对象不需建对象)A A1=A A1=newnew A();A();/创建类创建类A的一个对象的一个对象A1 B B1=B B1=newnew B();B();/创建类创建类B的一个对象的一个对象B1 A1.ay=6;A1.ay=6;/访问对象访问对象A1的成员变量的成员变量ay B1.by=A1.ax;B1.by=A1.ax;/访问对象访问对象B1的成员变量的成员变量by System.out.System.out.printlnprintln(A.ax+“”+B.(A.ax+“”+B.bxbx););/输出二变量的输出二变量的值值 System.out.System.out.printlnprintln(B1.(B1.bxbx+B1.by);+B1.by);/输出二变量的和输出二变量的和 /程序结束程序结束成员变量访问的例子成员变量访问的例子访问本类的类变量可省略类名访问类变量也可通过类对象名访问本类的类变量时,也可加上类名或类对象名实现类的封装性如果外面的程序可以随意修改一个类的成员变量,如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就像一个人的身高,会造成不可预料的程序错误,就像一个人的身高,不能被外部随意修改,只能通过各种摄取营养的不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。方法去修改这个属性。在定义一个类的成员(包括变量和方法)时,使在定义一个类的成员(包括变量和方法)时,使用用private关键字说明这个成员的访问权限,这个关键字说明这个成员的访问权限,这个成员就成了类的私有成员,该类能被这个类的其成员就成了类的私有成员,该类能被这个类的其他成员方法使用,而不能不其他的类中的方法所他成员方法使用,而不能不其他的类中的方法所调用。调用。实现类的封装性为了实现更好的封装性,我们通常将类的成员变量声名为了实现更好的封装性,我们通常将类的成员变量声名为为private,在通过在通过public的方法来对这个变量进行访问。的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是取这个成员变量操作,另外一个是setXxx()用来对这个用来对这个成员变量赋值。成员变量赋值。一个类通常就是一个小的模块,我们应该让模块仅仅公一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他一切内容。我开必须要让外界知道的内容,而隐藏其他一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求修改或操作另一个模块的数据,模块设计追求强内聚强内聚(许多功能尽量在类的内部独立完成,不让外面干预),(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合弱耦合(提供给外部尽量少的方法调用)。(提供给外部尽量少的方法调用)。构造方法构造方法构造方法的作用:构造方法的作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成的初始化工作的代码。这就好像我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是,每个“人”一出生就会自动完成“洗澡”,程序不必再在每个人刚出生是一个一个告诉他们要“洗澡”了。作用:作用:专门用于专门用于创建类对象创建类对象的方法。的方法。形式:形式:修饰符修饰符 方法名(方法名(形式参数列表形式参数列表)throwsthrows异常列表异常列表 方法体方法体 调用:调用:创建对象时被创建对象时被JavaJava编译器编译器自动调用自动调用的。的。当构造一个类的实例时,便以其主要完成以下工作:当构造一个类的实例时,便以其主要完成以下工作:为对象分配内存空间为对象分配内存空间初始化对象中的成员变量的值初始化对象中的成员变量的值调用对象的构造方法调用对象的构造方法一个类的构造方法可以有多个,他们具有一个类的构造方法可以有多个,他们具有相同的方法名相同的方法名,编,编译器会根据参数的类型及个数来判断使用哪个构造方法。译器会根据参数的类型及个数来判断使用哪个构造方法。构造方法说明构造方法说明注意:没有返回值类型(void也不行)1 1)缺省的构造方法:无参数缺省的构造方法:无参数2 2)自定义构造方法自定义构造方法:可带、也可不带参数可带、也可不带参数用户定义的构造方法可以带有或不带有参数用户定义的构造方法可以带有或不带有参数 构造函数分类:构造函数分类:自定义构造方法自定义构造方法p1=new person(“tom”,78),该代码会做这该代码会做这样几件事:样几件事:创建指定的类的新实例对象创建指定的类的新实例对象在堆内存中为实例对象分配内存空间,并调用在堆内存中为实例对象分配内存空间,并调用指定的类的构造方法指定的类的构造方法最后将实例对象的首地址赋值给引用变量最后将实例对象的首地址赋值给引用变量p1p1=new person(“tom”,78)的内存变化过程分析this是什么?如果如果func2方法被调用,一定是事先已经有了一个存在方法被调用,一定是事先已经有了一个存在的对象,的对象,func2作为那个对象的方法被使用。作为那个对象的方法被使用。在在func2内部能引用别的对象,同样也能引用内部能引用别的对象,同样也能引用func2所所属的那个对象。属的那个对象。在在func2中,自己所属的那个对象的引用名称是什么呢中,自己所属的那个对象的引用名称是什么呢?this关键字在关键字在java程序里的作用和它的词义很接近,程序里的作用和它的词义很接近,它在函数内部就是这个函数所属的对象的引用变量。它在函数内部就是这个函数所属的对象的引用变量。this引用句柄所在的位置每个成员方法内部,都有一个this引用变量,指向调用这个方法的对象,类中的成员方法与this之间的关系如图this引用句柄的应用一个类中的成员方法可以直接调用同类中的其他一个类中的成员方法可以直接调用同类中的其他成员,其实我们在一个方法内部使用成员,其实我们在一个方法内部使用“this.其其他成员他成员”的引用方式和直接用的引用方式和直接用“其他成员其他成员”的效的效果是一样的,那果是一样的,那this还有多大的作用呢?在下面还有多大的作用呢?在下面的情况下,我们还是的情况下,我们还是非得用非得用this关键字不可关键字不可的:的:让类的成员变量名和对其赋值的成员方法的参数让类的成员变量名和对其赋值的成员方法的参数变量变量同名同名是必要的;是必要的;在一个构造方法里在一个构造方法里调用其他的构造方法调用其他的构造方法,不是用,不是用构造方法名,而是用构造方法名,而是用this(参数列表的形式),参数列表的形式),根据其中的参数列表,选择相应的构造方法。根据其中的参数列表,选择相应的构造方法。方法首部说明 方法体 方法的调用 方法说明及调用方法说明及调用说明形式:说明形式:修饰符修饰符 返回值类型返回值类型 方法名(方法名(形参列表形参列表throws throws 异常列表异常列表 修饰符分类:修饰符分类:v 访问修饰符:访问修饰符:缺省、缺省、publicpublic、protectedprotected、privateprivatev 非访问修饰符:非访问修饰符:staticstatic:静态方法静态方法 abstractabstract:抽象方法,无方法体抽象方法,无方法体 finalfinal:最终方法,子类不能改变其方法实现最终方法,子类不能改变其方法实现 nativenative:本地方法,即方法实现与本机系统有关本地方法,即方法实现与本机系统有关 synchronizedsynchronized(同步):执行前要给方法设置同步机制同步):执行前要给方法设置同步机制1.方法首部说明方法首部说明一定要有返回类型(1)(1)方法体方法体 方法体是由一对大括号括起来的一段代码,格式如下:方法体是由一对大括号括起来的一段代码,格式如下:/方法体开始方法体开始 实现方法的代码段实现方法的代码段 /方法体结束方法体结束 方法体也可以是一个分号方法体也可以是一个分号“;”,表示无具体方法(方,表示无具体方法(方法还没有实现,即只是一个方法框架。法还没有实现,即只是一个方法框架。注意:注意:只有方法的修饰符中有只有方法的修饰符中有abstractabstract或或nativenative时,方法时,方法才可无方法体。才可无方法体。2.2.方法体方法体returnreturn语句用于从当前方法中退出,返回到调用该方法的语句用于从当前方法中退出,返回到调用该方法的语句处继续程序的执行。其格式如下:语句处继续程序的执行。其格式如下:格式格式1 1:return return 表达式;表达式;格式格式2 2:return;return;格式格式1 1返回一个值给调用该方法的语句,返回值的数据返回一个值给调用该方法的语句,返回值的数据类型必须与方法声明中的返回值类型一致。可以使用强制类型必须与方法声明中的返回值类型一致。可以使用强制类型转换来使类型一致;类型转换来使类型一致;格式格式2 2用于返回类型为用于返回类型为voidvoid的方法中,使用该语句以结的方法中,使用该语句以结束方法,返回调用处。束方法,返回调用处。(2)(2)returnreturn语句语句returnreturn语句通常用在一个方法体的语句通常用在一个方法体的最后最后,以退出该方法,以退出该方法并返回一个值。并返回一个值。!在在JavaJava中,中,单独的单独的returnreturn语句语句用在一个方法体的用在一个方法体的中间中间时时,会产生编译错误会产生编译错误,因为这时有一些语句执行不到。因为这时有一些语句执行不到。例如:例如:intint method(method(intint num)num)returnreturn num;num;将导致编译错误将导致编译错误,因为它将使后面的语句执行不到因为它将使后面的语句执行不到 (2)(2)returnreturn语句语句(2)(2)returnreturn语句语句可以通过把可以通过把returnreturn语句嵌入到某些语句语句嵌入到某些语句(如如if-else)if-else)来使来使程序在未执行完方法中的所有语句时退出,例如:程序在未执行完方法中的所有语句时退出,例如:intint method(method(intint num)num)if if(num(num0)0)returnreturn num;num;可能执行可能执行,也可能不执行也可能不执行,取决于取决于num的值的值 成员变量分为对象变量和类变量。同样地,成员方法也成员变量分为对象变量和类变量。同样地,成员方法也有对象方法和类方法之分,其意义与对象变量、类变量一样。有对象方法和类方法之分,其意义与对象变量、类变量一样。即类方法是属于整个类的,而对象方法是属于类中的某个对即类方法是属于整个类的,而对象方法是属于类中的某个对象的。象的。由于由于类方法是属于整个类的,并不属于类的哪个对象,类方法是属于整个类的,并不属于类的哪个对象,所类方法的方法体中不能有与类的对象有关的内容。即类方所类方法的方法体中不能有与类的对象有关的内容。即类方法体有如下限制:法体有如下限制:(1)(1)类方法中不能引用对象变量;类方法中不能引用对象变量;(2)(2)类方法中不能调用类的对象方法;类方法中不能调用类的对象方法;(3)(3)在类方法中不能使用在类方法中不能使用supersuper、thisthis关键字。关键字。如果违反这些限制,就会导致程序编译错误。如果违反这些限制,就会导致程序编译错误。(3)3)类方法(类方法(staticstatic)和类方法相比,对象方法几乎没有什么限制:和类方法相比,对象方法几乎没有什么限制:(1)(1)对象方法中可以引用对象变量,也可以引用类变量;对象方法中可以引用对象变量,也可以引用类变量;(2)2)对象方法中可以调用类方法;对象方法中可以调用类方法;(3)(3)对象方法中可以使用对象方法中可以使用supersuper、thisthis关键字。关键字。在程序设计中,一些通用的、公用型的方法与类的在程序设计中,一些通用的、公用型的方法与类的对象无关,因此常常被作为对象无关,因此常常被作为类方法类方法实现。实现。JavaJava类库中类库中MathMath类,其中多数的数学运算操作都被定义成静态方法。因此,类,其中多数的数学运算操作都被定义成静态方法。因此,可以使用类方法把一些通用的、公用型的方法放在合适的可以使用类方法把一些通用的、公用型的方法放在合适的类中,从而很好地将它们组织起来。应用程序中的主方法类中,从而很好地将它们组织起来。应用程序中的主方法mainmain就是类方法。就是类方法。(3)3)类方法(类方法(staticstatic)(3)3)类方法(类方法(staticstatic)main()方法是静态的,因此方法是静态的,因此JVM在执行在执行main()方法是不创建方法是不创建main()方法所在的类的实方法所在的类的实例对象,因此在例对象,因此在main()方法中,我们不能方法中,我们不能直接访问该类中的非静态成员,必须创直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。个对象去访问类中的非静态成员。外部调用外部调用类方法类方法 1.1.类名类名.类方法名类方法名(实型参数列表实型参数列表)2.2.对象名对象名.类方法名类方法名(实型参数列表实型参数列表)对象方法:对象方法:对象名对象名.对象方法名对象方法名(实型参数列表实型参数列表)3 3.方法的调用方法的调用内部调用:内部调用:直接调用直接调用1 1)类方法中不能引用对象变量)类方法中不能引用对象变量2 2)在类方法中不能使用)在类方法中不能使用super,thissuper,this关键字关键字3 3)类方法不能调用对象方法)类方法不能调用对象方法4.4.递归方法递归方法 如果一个方法的方法体中又调用自身,则这种如果一个方法的方法体中又调用自身,则这种方法被称为方法被称为直接递归直接递归方法。如果一个方法通过调用方法。如果一个方法通过调用其它方法而间接地调用到自身,则被称为其它方法而间接地调用到自身,则被称为间接递归间接递归方法方法。JavaJava中递归方法的编写方法与中递归方法的编写方法与C+C+中递归函数中递归函数的编写方法是完全一样的。下面用一个实例来说明的编写方法是完全一样的。下面用一个实例来说明它。它。4.4.递归方法递归方法例例4.3 4.3 用递归方法求用递归方法求1+2+3+1+2+3+n n。程序编写方法分析:程序编写方法分析:假设编写了一个成员方法假设编写了一个成员方法sum(n)sum(n)用于求出用于求出1+2+1+2+n n,则调用则调用sum(n-1)sum(n-1)就可求出就可求出1+2+3+(1+2+3+(n-1)n-1)。于是,求于是,求 sum(n)sum(n)可用可用“求出求出sum(n-1)sum(n-1)后再加上后再加上n”n”的方法实现。即的方法实现。即sum(n)sum(n)方法的方法体就是调用方法的方法体就是调用sum(n-1)sum(n-1)再加上再加上n n。程序如下:程序如下:importimport java.java.ioio.*;.*;public classpublic class SumSum public static public static int int sum(sum(intint n)n)if if(n1)(n0;i-)i=num;i0;i-)strstr.append(.append(chch););returnreturn strstr.toStringtoString();();总结:总结:null,thisnull,this和和supersuper public voidpublic void drawRectdrawRect()()forfor(intint i=length;i0;i-)i=length;i0;i-)/用字符用字符“#”“#”绘制绘制(填满填满)一个矩一个矩形形 System.out.System.out.pringlnpringln(makeStringmakeString(#,width);(#,width);在在这个类的构造方法中并没有写新的程序,而是调用了这个类的构造方法中并没有写新的程序,而是调用了父类的构造函数,用于初始化实例变量。父类的构造函数,用于初始化实例变量。总结:总结:null,thisnull,this和和supersuper4.5 4.5 接口接口接口的概念接口的概念 4.5.1 4.5.1 接口的说明接口的说明 4.5.2 4.5.2 接口的使用接口的使用 4.5.3 4.5.3 接口与类的比较接口与类的比较接口的概念接口的概念概念概念概念概念:就是一些常量和抽象方法的定义的集合,它是一个设计框架作用:作用:作用:作用:使设计与实现分离注意:注意:注意:注意:接口可以继承:一个接口可以继承多个其它的接口;接口中的方法要用类来实现;一个类可以实现多个接口。接口与类的比较接口与类的比较接口类只能单继承,而接口可以接口类只能单继承,而接口可以多继承多继承。类中的方法可以是具体的,也可以抽象的。接类中的方法可以是具体的,也可以抽象的。接口中的方法都是口中的方法都是抽象抽象的。的。接口中的方法要接口中的方法要用类来实现用类来实现,一个类可以实现,一个类可以实现多个接口。多个接口。4.5.1 4.5.1 接口的说明接口的说明接口首说明接口首说明接口首说明接口首说明 pubic interface pubic interface 接口名接口名 extendsextends 接口序列接口序列 接口体接口体接口体接口体 像类一样,编译好的接口保存在像类一样,编译好的接口保存在ClassClass文件中。文件中。接口名前接口名前有有pubicpubic修饰符,则任何一个类都可以调用该接口修饰符,则任何一个类都可以调用该接口接口名前接口名前没有没有pubicpubic修饰符,则只有那些与本接口在同一个包中的修饰符,则只有那些与本接口在同一个包中的类才能访问该接口。类才能访问该接口。接口体说明接口的成员接口体说明接口的成员常量和抽象方法。常量和抽象方法。常量说明常量说明 抽象方法说明抽象方法说明 变量:变量:默认为默认为public static finalpublic static final 抽象方法:抽象方法:默认为默认为public abstractpublic abstract4.5.1 4.5.1 接口的说明接口的说明4.5.1 4.5.1 接口的说明接口的说明接口体说明注意:接口体说明注意:(1 1)接口中的成员变量)接口中的成员变量(常量常量)说明说明 声明形式:声明形式:修饰符修饰符 类型名类型名 变量名;变量名;接口中的成员变量的修饰符都只能用接口中的成员变量的修饰符都只能用publicpublic、staticstatic、finalfinal,而且也都隐含着修饰符而且也都隐含着修饰符,所以修饰符是不必写所以修饰符是不必写的。就是说,接口中的成员变量都是的。就是说,接口中的成员变量都是公用的静态最终公用的静态最终变量,即公用的静态常量。变量,即公用的静态常量。例如:例如:在接口中,下面这行代码:在接口中,下面这行代码:intint STEP=5;STEP=5;等同于:等同于:public static finalpublic static final intint STEP=5;STEP=5;(2 2)接口中的方法接口中的方法接口中说明的方法都是抽象方法,其声明的形式为:接口中说明的方法都是抽象方法,其声明的形式为:修饰符修饰符 方法返回值类型方法返回值类型 方法名方法名(参数列表参数列表);由于接口中的方法都是抽象的方法,所以方法体仅仅是一由于接口中的方法都是抽象的方法,所以方法体仅仅是一个分号个分号“;”。方法的修饰符只能是方法的修饰符只能是publicpublic、abstractabstract。接口中所有接口中所有的方法都隐含着修饰符的方法都隐含着修饰符publicpublic、abstractabstract,所以,所以,加不加加不加修饰符是一样的。修饰符是一样的。(只是为了和以前版本的只是为了和以前版本的JavaJava兼容,所以兼容,所以才保留这两个修饰符在接口中对方法的使用才保留这两个修饰符在接口中对方法的使用)例例4.12 4.12 接口中的方法说明接口中的方法说明 intint increment(increment(intint x)x);接口自己不提供方法的实现,其中的方法必须由类实现接口自己不提供方法的实现,其中的方法必须由类实现 类修饰符类修饰符 classclass类名类名 extendsextends子句子句 implements implements 子句子句 implementsimplements子句的形式如下:子句的形式如下:implements implements 接口名列表接口名列表4.5.2 4.5.2 接口的使用接口的使用例例 4.13 4.13 接口的使用接口的使用interfaceinterface MyInterfaceMyInterface voidvoid display();display();classclass MySampleMySample implementsimplements MyInterfaceMyInterface publicpublic voidvoid display()display()System.out.System.out.printlnprintln(“Display!”);(“Display!”);补充:注意 在多重继承的情况下,如果子接口被某各类扩展,那么,这个类必须实现子接口以及所有该子接口的父接口中定义的方法。而且,在实现这些方法时,要使方法的名字、返回值、入口参数一一对应。例:interface first interface second interface third extends first,second class test implements third1 1 存在原因:存在原因:抽象数据的需要抽象数据的需要2 2 形式:形式:某些方法只需说明方法首部,而不需说明其方法体某些方法只需说明方法首部,而不需说明其方法体3 3 特点特点:其方法体只能由其子类来完成;其方法体只能由其子类来完成;抽象类不能创建任何对象;抽象类不能创建任何对象;完全用来被继承;完全用来被继承;如果类中的某一方法是抽象的,整个类就必须被如果类中的某一方法是抽象的,整个类就必须被说明成抽象的说明成抽象的!4.6 4.6 抽象类和抽象方法抽象类和抽象方法例例4.7 4.7 图形抽象类图形抽象类abstract classabstract class Shape Shape abstract doubleabstract double area();area();protected protected voidvoid draw()System.out.draw()System.out.printlnprintln(“test”);(“test”);classclass Rectangle Rectangle extendsextends Shape Shape intint widthwidth,length;length;punlicpunlic double double area()area()return return width*lengthwidth*length 4.6 4.6 抽象类和抽象方法抽象类和抽象方法4.4.7.7.1 1 包说明包说明 4.4.7.7.2 2 包的层次结构包的层次结构4.7.3 4.7.3 包的使用包的使用 4.8.3 4.8.3 包小结包小结使用包可以提供控制访问的范围。使用包可以提供控制访问的范围。4.74.7 包包包说明语句总是源程序文件中的第一个语句包说明语句总是源程序文件中的第一个语句格式:格式:package package 包名;包名;包名由分离的字段组成,段与段之间用包名由分离的字段组成,段与段之间用.隔开隔开4.4.7.7.1 1 包说明包说明问题:问题:在在缺省缺省情况下,系统会为每一个源文件创建一个情况下,系统会为每一个源文件创建一个无名包无名包,但它,但它不能被其他包所引用不能被其他包所引用。为此需要创。为此需要创建有名字的包。建有名字的包。在在JavaJava中中,包采用如下的层次结构:包采用如下的层次结构:子包子包 类文件和接口文件类文件和接口文件(一个类或一个接口编译后都产生一个相应的字节(一个类或一个接口编译后都产生一个相应的字节码文件)码文件)4.4.7.7.2 2 包的层次结构包的层次结构4.7.2 4.7.2 包的层次结构包的层次结构 由于包的层次结构类似文件夹的层次结构,所以,为由于包的层次结构类似文件夹的层次结构,所以,为了实现上的简单,了实现上的简单,JavaJava对包的存储作了一定的规定。对包的存储作了一定的规定。系统中所有的系统中所有的JavaJava包、类的源文件、字节码文件都必包、类的源文件、字节码文件都必须存放在单一文件夹下或它的子文件夹中。在实际的须存放在单一文件夹下或它的子文件夹中。在实际的JavaJava开发环境中,开发环境中,通常提供了一个名为通常提供了一个名为CLASSPATHCLASSPATH的的环境变量,这个环境变量中包含了一系列的路径名,环境变量,这个环境变量中包含了一系列的路径名,它们就是存储它们就是存储JavaJava类、接口和包的路径类、接口和包的路径。系统将按照。系统将按照环境变量环境变量CLASSPATHCLASSPATH中路径出现的先后顺序逐个搜索,中路径出现的先后顺序逐个搜索,来寻找某个类、接口或包。以下是一个来寻找某个类、接口或包。以下是一个Windows Windows 环境环境变量的例子:变量的例子:CLASSPATH=C:JDKlib;C:JDKCLASSPATH=C:JDKlib;C:JDKsrcsrc;1 1 绝对引用绝对引用 使用包名,类名前缀。使用包名,类名前缀。2 2 相对引用相对引用 利用利用importimport加载需要的类加载需要的类 加载整个包加载整个包4.4.7.7.3 3 包的使用包的使用4