《第03章Java中的类与接口精选文档.ppt》由会员分享,可在线阅读,更多相关《第03章Java中的类与接口精选文档.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第03章Java中的类与接口本讲稿第一页,共三十九页【本章导读本章导读】lJava语言其中一个突出特点就是面向对象。所谓面向对象的方法学,就是使我们分析、设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法。包括:面向对象的分析(OOA,Object-OrientedAnalysis),面向对象的设计(OOD,Object-OrientedDesign),面向对象的程序设计(OOP,Object-OrientedProgram)。l本章主要介绍面向对象的基本概念,包括类与对象、抽象类、内部类、匿名类、接口和包等。目的是为以后的Java面向对象的编程打好基础。本讲稿第二页,共三十九页【本章
2、要点本章要点】l类与对象l抽象类l内部类l匿名类l接口l包本讲稿第三页,共三十九页3.1类与对象l3.1.1类的声明类的声明1、类的声明格式:、类的声明格式:类首声明定义类的名字、访问权限以及与其它类类首声明定义类的名字、访问权限以及与其它类的关的关系等。系等。类主体定义类的成员,包括变量(数据)和方法(行类主体定义类的成员,包括变量(数据)和方法(行为)为)本讲稿第四页,共三十九页3.1类与对象l3.1.2类首声明:classextendsimplementsclass:类定义的关键字;extends:表示类和另外一些类(超类)的继承关系;implements:表示类实现了某些接口;修饰符:
3、表示类访问权限(public)和类型说明(abstract、final);本讲稿第五页,共三十九页3.1类与对象3.1.3成员变量的声明格式:staticfinallstatic:表示是一个类成员变量(静态变量);lfinal:表示是一个常量;例:finaldoublePI=3.1415926;l修饰符:表示变量的访问权限(缺省访问friendly、public、protected和private)l作用域:整个类。同一类中的所有方法都可以对其访问。并可简单地通过名字来引用。(在方法体内定义的变量是局部变量,作用域只能在方法体内)本讲稿第六页,共三十九页3.1类与对象l3.1.3成员方法方法的
4、定义包括两部分:方法声明和方法体。一般格式为:方法声明部分方法体的内容本讲稿第七页,共三十九页3.1类与对象3.1.4对象的创建与引用对象的创建与引用1、对象的创建、对象的创建创建一个对象包括对象的声明和为对象分配成员变量两个步骤。创建一个对象包括对象的声明和为对象分配成员变量两个步骤。(1)对象的声明)对象的声明对象声明的一般格式为:对象声明的一般格式为:类的名字类的名字对象名字对象名字;如:如:RectrectangleOne;这里,这里,Rect是一个类的名字,是一个类的名字,rectangleOne是我们声明的对象的名字。是我们声明的对象的名字。用类声明的数据称为类类型变量,即对象,如
5、上述用类声明的数据称为类类型变量,即对象,如上述Rect类声明的对象类声明的对象rectangleOne。本讲稿第八页,共三十九页3.1类与对象1、对象的创建、对象的创建(2)为声明的对象分配成员变量为声明的对象分配成员变量,即是给变量分配内存空间。使用new运算符和类的构造方法为声明的对象分配成员变量,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的,你一定还记得构造方法的名字必须和类名相同这一规定),上述的Rect类提供了2个构造方法,下面都是合法的创建对象的语句:rectangleOne=newRect();本讲稿第九页,共三十九页3.1类与对象l2、对象的引用我
6、们已经知道,当用类创建一个对象时,成员变量被分配内存空间,这些内存空间称做该对象的实体或变量,而对象中存放着引用,以确保这些变量由该对象操作使用。因此,如果两个对象有相同的引用,那么就具有同样的实体。本讲稿第十页,共三十九页3.1类与对象l3.1.5类的继承与多态类的继承与多态只支持单重继承,不支持多重继承,只能从一个父类继承。l必须从一个类继承默认是从Object继承l如果类Sub是类Super的子类,则类Sub只继承超类Super中非private的成员变量和方法。l子类Sub中,包括两部分的内容:从超类Super中继承下来的变量和方法,自己新增加的变量和方法。本讲稿第十一页,共三十九页3
7、.1类与对象l3.1.5类的继承与多态类的继承与多态继承的语法修饰符class类名extends父类新属性;新方法;重载的方法;覆盖的方法;本讲稿第十二页,共三十九页3.1类与对象l3.1.5类的继承与多态类的继承与多态l多态是指同一个名字的若干个方法,有不同的实现(即方法体中的代码不一样)。l通过方法的重载和覆盖来实现多态性。l方法的重载一个类中,有若干个方法名字相同,但方法的参数不同,称为方法的重载。l不正确的方法重载publicvoidfunover(inta,floatb)publicintfunover(inta,floatb)本讲稿第十三页,共三十九页3.1类与对象l3.1.5类的
8、继承与多态类的继承与多态l对于多态,可以总结它为对于多态,可以总结它为:l(1)使用父类类型的引用指向子类的对象;l(2)该引用只能调用父类中定义的方法和变量;l(3)如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)l(4)变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。本讲稿第十四页,共三十九页3.2抽象类抽象类lJava也可以创建专门的类用来当作父类,这种类称为抽象类(abstractclass)。即用关键字abstract修饰类称为abstract类(抽象类)。抽象类有点
9、类似“模板”的作用,其目的是要你根据它的格式来修改并创建新的类。不能够通过抽象类直接创建对象,只能通过抽象类派生的新的类,再由新类创建对象。本讲稿第十五页,共三十九页3.2抽象类抽象类l在Java中,凡是用abstract修饰符修饰的类称为抽象类。它和一般的类不同之处在于:l(1)如果一个类中含有未实现的抽象方法,那么这个类就必须通过关键字abstract进行标记声明为抽象类。l(2)抽象类中可以包含抽象方法,但不是一定要包含抽象方法。它也可以包含非抽象方法和域变量,就像一般类一样。l(3)抽象类是没有具体对象的概念类,也就是说抽象类不能实例化为对象。l(4)抽象类必须被继承。子类为它们父类中
10、的所有抽象方法提供实现,否则它们也是抽象类。l定义一个抽象类的格式如下:labstractclass类名称ll./类的主体部分ll注意:在抽象类中,方法的定义可分为两种:一种是普通方法;另一种是抽象方法,此方法以abstract开头,且只声明了返回值的数据类型、方法名称、所需参数,但没有方法体。这样,抽象方法中的处理方式必须在子类中完全实现。本讲稿第十六页,共三十九页3.2抽象类抽象类l下面我们通过例子,学习抽象方法的使用。l例例3-11labstractclassfatherClassllabstractvoidabstractMethod();lvoidprintMethod()llSys
11、tem.out.println(fatherClassfunction!);lllclasschildClassextendsfatherClassllvoidabstractMethod()llSystem.out.println(childClassfunction!);lllpublicclassmainClassllpublicstaticvoidmain(Stringargs)llchildClassobj=newchildClass();lobj.printMethod();lobjabstractMethod();ll本讲稿第十七页,共三十九页3.2抽象类抽象类l例子运行的结果。
12、l在上面的程序中,首先定义了一个抽象类fatherClass,在这个抽象类中,声明一个抽象方法abstractMethod()和一个非抽象方法printMethod(),接着定义了fatherClass的子类childClass,在childClass中重写了abstractMethod()方法,随后,在主类mainClass中生成类childClass的一个实例,并将该实例引用返回到fatherClass类变量obj中。本讲稿第十八页,共三十九页3.3内部类l类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部
13、类的类成为内部类的外嵌类。内部类同类中声明的方法或成员变量一样,一个类把内部类看作是自己的成员。外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类可以用内部类声明对象,作为外嵌类的成员l在一个类的内部还可以定义类,这就是内部类,也称为嵌套类。本讲稿第十九页,共三十九页3.3内部类内部类本身是一个类,但它同时又是外部类一个成员。作为外部类的成员,它可以毫无限制地访问外部类的变量和方法,包括private成员。这和private的含义并不矛盾,因为private修饰符只是限制从一个类的外部访问该类成员的权限,而内部类在外部类内
14、部,所以它可以访问外部类的所有资源。本讲稿第二十页,共三十九页3.3内部类3.3.1内部类的分类l静态内部类、l成员内部类、l本地内部类l匿名内部类。本讲稿第二十一页,共三十九页3.4匿名类l匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。l这就要采用另一种形式的new语句,如下所示:lnewl这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。本讲稿第二十二页,共三十九页3.4匿名类lJava
15、中内部匿名类用的最多的地方也许就是在中内部匿名类用的最多的地方也许就是在Frame中加入中加入Listner了吧。了吧。l如下:如下:importjava.awt.*;importjava.awt.event.*;publicclassQFrameextendsFramepublicQFrame()this.setTitle(myapplication);addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)dispose();System.exit(0););this.setBounds(10,10,
16、200,200);本讲稿第二十三页,共三十九页3.4匿名类l内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。newWindowAdapter()publicvoidwindowClosing(WindowEvente)dispose();System.exit(0);new是建立一个WindowAdapter对象,后面一个表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。本讲稿第二十四页,共三十九页3.5接口lJava为了避免C+中随着多重继承所衍生的问题,因而限定类的继承只支持单重继承。但是实际中的较为复杂问题的解决有需要用到多重
17、继承,因此,Java通过接口来实现类间多重继承的功能。本讲稿第二十五页,共三十九页3.5.1接口的定义接口的定义lJava中声明接口的语法如下:中声明接口的语法如下:publicinterface接口名extends父接口名列表/接口体/常量域声明publicstaticfinal域类型域名常量值;/抽象方法声明publicabstractnative返回值方法名(参数列表)throw异常列表;l一个类只能有一个父类,但是类可以同时实现若干个接口。这种情况下如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。本讲稿第二十六页,共三十九页3.5.1接口的定义接口
18、的定义l定义接口可归纳为如下几点:定义接口可归纳为如下几点:(1)在Java中接口是一种专门的类型。用interface关键字定义接口。(2)接口中只能定义抽象方法,不能有方法体,一定是public修饰的。(3)接口中可以定义变量,但实际上是staticfinal修饰的常量。(4)接口中不能定义静态方法。l接口是简单的未执行的系列以及一些抽象的方法,你可能会思考究竟接口于抽象类有什么区别。了解它们的区别是相当重要的,它们之间的区别如下:(1)接口不能包含任何可以执行的方法,而抽象类可以。(2)类可以实现多个接口,但只有一个父类。(3)接口不是类分级结构的一部分,而没有联系的类可以执行相同的接口
19、。本讲稿第二十七页,共三十九页3.5.2接口的实现接口的实现l接口的声明仅仅给出了抽象方法,相当于程序开发早期的一组协议,而具体地实现接口所规定的功能,则需某个类为接口中的抽象方法书写语句并定义实在的方法体,称为实现这个接口。如果一个类要实现一个接口,那么这个类就提供了实现定义在接口中的所有抽象方法的方法体。本讲稿第二十八页,共三十九页3.5.2接口的实现接口的实现l一个类要实现接口时,请注意以下问题:l(1)在类的声明部分,用implements关键字声明该类将要实现哪些接口。l(2)如果实现某接口的类不是abstract抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方
20、法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。l(3)如果实现某接口的的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类任何一个非抽象的子类而言,它们父类所实现的接口中的所有抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。l(4)个类在实现某接口的抽象方法时,必须使用完全相同方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。l(5)接口的抽象方
21、法的访问限制符都已制定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。本讲稿第二十九页,共三十九页3.5.2接口的实现接口的实现l例例3-13linterfaceAllinta=1;llinterfaceBllintb=2;lpublicabstractvoidpp();llinterfaceMyInterfaceextendsA,B/接口的继承labstractclassAbstractInterfaceExamimplementsA,B/抽象类实现接口lpublicclassInterfaceExamimplem
22、entsA,B/一般类实现接口llstaticInterfaceExamobj=newInterfaceExam();lpublicstaticvoidmain(Stringargs)llSystem.out.println(继承接口A中的a=+obj.a);lobj.pp();llpublicvoidpp()/实现抽象方法pp()llSystem.out.println(继承接口AB中的ab=+obj.b);ll本讲稿第三十页,共三十九页3.5.3接口回调接口回调l接口回调是多态的另一种体现,接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以
23、调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称作对象功能的接口回调。不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。本讲稿第三十一页,共三十九页3.5.3接口回调接口回调l下面我们看看使用了接口的回调技术的例子。l例例3-14linterfaceShowMessagellvoidshowTradeMark();llclassTVimplementsShowMessagellpublicvoidshowTradeMark()llSystem.out.println(我是电
24、视机);lllclassPCimplementsShowMessagellpublicvoidshowTradeMark()llSystem.out.println(我是电脑);lllpublicclassExamplellpublicstaticvoidmain(Stringargs)llShowMessagesm;/声明接口变量。lsm=newTV();/接口变量中存放对象的引用。lsm.showTradeMark();/接口回调。lsm=newPC();/接口变量中存放对象的引用。lsm.showTradeMark();/接口回调。lll运行结果是:l我是电视机l我是电脑本讲稿第三十二页
25、,共三十九页3.6包l包是Java提供的文件组织方式。一个包对应一个文件夹,一个包中可以包括很多类文件,包中还可以有子包,形成包等级。Java把类文件放在不同等级的包中。这样一个类文件就会有两个名字:一个是类文件的短名字,另外一个是类文件的全限定名。短名字就是类文件本身的名字,全限定名则是在类文件的名字前面加上包的名字。本讲稿第三十三页,共三十九页3.6包3.6.1比目录更好的选择l可以把一个目录树转化为一个包*.jar文件l也可以把一个包文件还原为目录树l包就是目录树的化身ljava访问包中的东西就如同访问目录树一样。本讲稿第三十四页,共三十九页3.6包l为什么要打成包的格式?l简洁更容易下
26、载,拷贝;不容易损坏l平台无关避免平台对目录和文件名的限制l节省可以选择压缩,节约空间本讲稿第三十五页,共三十九页3.6包l如何打包?lbin目录下提供了实用的工具jar.exe能处理打包和解包的问题ljar-cvf包名待处理的目录或文件本讲稿第三十六页,共三十九页本章小结l类是Java语言面向对象编程的基本元素,它定义了一个对象的结构和功能。接口是Java语言中特有的数据类型,由于接口的存在,解决了Java语言不支持多重继承的问题。通过本章学习,要求掌握面向对象程序设计的基本概念、多态中的方法重载和覆盖、类的继承的概念和实现,理解继承、抽象类、接口和包的概念。本讲稿第三十七页,共三十九页习题
27、l一、选择题l1每个类初始化其成员变量的方法是?lA方法B.main()方法C.构造方法D.对象l2.当在类中定义两个或更多方法,它们有相同的名称而参数项不同时,这称为?lA继承B多态性C构造方法D方法重载l3构造方法何时被调用?lA类定义时B创建对象时lC调用对象方法时D使用对象变量时l4用来调用父类构造方法的关键字是?lAbaseBsuperCthisDextendsl5关于接口的定义和实现,以下描述正确的是?lA接口定义中的方法都只有定义,没有实现lB.接口定义中的变量都必须写明final和staticlC.如果一个接口由多个类来实现,则这些类在实现该接口中的方法时,应采用统一的代码lD
28、.如果一个类实现一个接口,则必须实现该接口中的所有方法,但方法未必声明为public本讲稿第三十八页,共三十九页习题l二、编程题l1定义一个类Point,代表一个点,public属性有x和y,方法有显示点坐标show(),构造方法由两个参数分别给x、y赋值,在main方法中构造两个对象,再创建一方法getMiddle()为取两个点所构成线段的中点坐标。l2定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle、正方形类Square、圆类Circle,根据各自的属性,用showArea方法求出各自的面积;在main方法中构造中3个对象,调用showArea方法。l3设计一个汽车类Vehicle,属性有车轮个数wheels和车重weight;小车类Car是Vehicle类的子类,外加属性:载人数loader;卡车类Trunk是Car类的子类,外加属性:载重量payLoad。l要求:1、每个类都有构造方法,对成员变量赋初值。2、子类必须调用父类的构造方法。3、每一个类都有一个show()方法输出各类中的属性信息。4、建立Trunk类对象,输出相关信息。本讲稿第三十九页,共三十九页