第14次 第4章 抽象类、接口、包_第1页
第14次 第4章 抽象类、接口、包_第2页
第14次 第4章 抽象类、接口、包_第3页
第14次 第4章 抽象类、接口、包_第4页
第14次 第4章 抽象类、接口、包_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

补充:对象引用和对象的区别对象引用:对象名,存放对象实际的存储地址。即:对象引用的值是地址。只要使用类声明,对象引用便存在。对象:特指类实例化后的一个特例,例如使用Student类实例化一个Student对象,我们讨论对象时更多的是关注其中的数据,比如:姓名、年龄等。对象需要使用new创建后才会生成,此时,内存会给对象分配一块存储空间。Studentstu=newStudent();24.4多态性的实现多态性是指使用相同类型的对象引用调用同一个签名的成员方法,却执行不同的代码段的现象。若要实现多态性,需要具备下面两个条件。若得到多态性的操作,父类和子类必须至少包含一个签名完全一样的成员方法。多态性作用于子类,它是依赖于类层次结构中的一项新功能。总结:不同类型的对象与引用的赋值1父类引用可以指向子类对象;但子类引用不能指向父类对象,也不能指向其他子类对象;举例1.已知类关系如下:ClassEmployee{}ClassManagerextendsEmployee{}ClassDirectorextendsEmployee{}则下列语句正确的是:()。A.Employeee=newManager(); B.Directord=newManager();C.Directord=newEmployee(); D.Managerm=newDirector();4课堂练习classParent{}classDerivedOneextendsParent{}classDerivedTwoextendsParent{}关于以下表达式,说法正确的是?Parentp=newParent();DerivedOned1=newDerivedOne();DerivedTwod2=newDerivedTwo();d1=(DerivedOne)d2;A. 编译和运行均报告“非法”B. 编译通过,运行时报告“非法”C. 编译运行均能通过如果父类引用指向了子类对象,使用父类引用访问父类和子类都有的方法(事实上,是子类覆盖了父类的方法)时,实际调用的子类中的方法。总结:不同类型的对象与引用的赋值2举例classAclass{voidgo(){System.out.println("Aclass");}}publicclassBclassextendsAclass{voidgo(){System.out.println("Bclass");}publicstaticvoidmain(Stringargs[]){Aclassa=newAclass();

Aclassa1=newBclass();a.go();

a1.go();}}父类引用虽然可以指向子类对象,但不能直接通过父类引用来调用子类中所特有public的成员方法,而是需要将该父类引用强制转换成子类引用才能调用子类中的方法。它可以直接调用父类中public的成员方法;补充:不同类型的对象与引用的赋值3举例classParent{}classChildextendsParent{ publicStringgetChild(){ Stringname="child";returnname;}

publicstaticvoidmain(Stringargv[]){

Parentp=newChild(); //插入代码 }}以下哪个选项的代码插入注释语句“//插入代码”处可以完成调用getChild()方法使程序输出为字符串child?A.System.out.println(p.getChild());B.System.out.println();C.System.out.println((Parent)p.getChild());D.System.out.println(((Child)p).getChild());9104.5抽象类抽象类:是对类进行高层抽象的结果,可实例化的类是抽象概念的具体表现。在Java语言中,用抽象类表示概念性的事物,用类表示可实例化的实体类别;11在Java语言中,抽象类就是用abstract修饰符声明的类。[Modifier]abstractclassclassName……{//成员变量和成员方法}其中的成员方法既可以是抽象的,也可以是一般的。Java语言中抽象类的定义12抽象方法所谓抽象方法是指在类定义中,只被声明原型,而不定义方法体的成员方法。[Modifier]abstractreturnTypemethodName(parameterList)其中,abstract是声明抽象方法的关键字,

returnType是返回类型,

methodName是抽象方法的名称,

parameterList是参数列表。由于抽象方法是不完整的成员方法,因此,它只能出现在抽象类中,但是不能出现在一般类中。13

Animal、Dog、Cat、Duck类关系的UML类图

抽象类举例14Animal类publicabstractclassAnimal{protectedStringtype;//种类

protectedStringname;//名称

protectedStringbreed;//品种

publicAnimal(Stringtype,Stringname,Stringbreed){this.type=newString(type);=newString(name);this.breed=newString(breed);}publicStringtoString(){return"Thisisa"+type+"\nIt's"+name+"the"+breed;}

publicabstractvoidsound();//抽象方法}15Animal的几个子类publicclassDogextendsAnimal{……

publicvoidsound(){System.out.println("WoofWoof");}}publicclassCatextendsAnimal{……

publicvoidsound(){System.out.println("Miiaooww");}}

classDuckextendsAnimal{……

publicvoidsound(){System.out.println("Quackquackquack");}}TestAnimal类publicclassTestAnimal{publicstaticvoidmain(String[]args){Animal[]theAnimals={newDog("Rover","Poodle"),newCat("Max","Abyssinian"),newDuck("Daffy","Aylesbury")};for(inti=0;i<theAnimals.length;i++){theAnimals[i].sound();}}}1617任何包含抽象方法的类都必须被定义成抽象类但抽象类中允许有非抽象方法;由于抽象类不是一个完整的类,因此不能够被实例化抽象类主要用来派生子类,且在子类中必须覆盖抽象类中的所有抽象方法,以便完善它们的定义static、private和final修饰符不能应用于抽象方法和抽象类中。使用抽象类时,需要注意下面几点:练习找出以下程序中的错误。abstractclassA{ abstractvoidf(){};publicabstractvoidk();}classBextendsA{

voidf(){ System.out.print("Iamsubclass");} voidk(){ System.out.print("Iamsubclass");}publicstaticvoidmain(String[]args){ Aa=newA(); a.f();a.k(); }}

18抽象方法不应该有方法体;子类中实现的抽象方法的访问属性应与父类中访问属性一致或更多权限。抽象类不能实例化。接口是特殊的抽象类,它侧重于描述概念的所具备的功能和具体属性(成员变量为常量),但不实现。例如:洗衣机的接口 interfaceWasher{ publicvoidstartUp();//启动 publicvoidletWaterIn();//进水 publicvoidwashClothes();//洗衣 publicvoidletWaterOut();//排水 publicvoidstop();//停止 }194.6接口定义接口的基本格式为:[public]interface

interfacename{

常量声明;

抽象方法声明;}接口的访问属性或者为”public”或者”缺省”;定义接口的关键字是interface而不是class;常量必须为publicstaticfinal,在接口中可以省略;成员方法必须是抽象方法,在接口中也可以省略publicabstract。接口具有继承性,可通过extends关键字声明父接口,但不能被实例化。204.6接口接口举例1:计量单位转换系数publicinterface

Conversions{//各种计量单位转换接口 doubleCM_TO_MM=10;//1厘米=10毫米

doubleTON_TO_KILOGRAM=1000;//1吨=1000千克

doublePOUND_TO_GRAM=453.5924;

//1磅=453.5924克}21相当于:publicstaticfinal

doubleCM_TO_MM=10;判断以下接口的定义是否正确?publicinterfaceA{

intCONST=1;//合法,CONST默认为public,static,final类型

voidmethod();//合法,method()默认为public,abstract类型

publicabstractvoidmethod2();//method2()显示声明为public,abstract类型

}22判断以下接口的定义是否正确?publicinterfaceA{

intvar;//错,var是常量,必须显示初始化

voidmethod(){...};//错,接口中只能包含抽象方法

protectedvoidmethod2(); //错,接口中的方法必须是public类型

staticvoidmethod3(){...}; //错,接口中不能包含静态方法

}23接口的使用接口的使用分为3个步骤:定义接口实现接口使用接口2425接口举例2:

Comparable接口publicinterfaceComparable

{//比较两个对象大小

intcompareTo(ObjectotherObject); }compareTo的含义:将调用这个方法的对象与参数带入的对象otherObject进行比较,如果前者小,返回-1;如果相等返回0;否则,返回1。26接口是一种用来声明常量和操作行为格式的特殊抽象类,在接口中声明的所有成员方法都是抽象方法,因此接口不能实例化;需要构造一个类,并在该类中覆盖接口中的所有方法,以便将其完善,通常,称此为某个类实现接口。4.6.2接口的实现Comparable接口的实现27以职工类(Employee)实现Comparable接口为例EmployeeprivateStringname;privatedoublesalary;privateStringdepartment;//成员变量的更改器//成员变量的获取器publicStringtoString()publicintcompareTo(ObjectotherObject)Employee实现Comparable接口publicclassEmployeeimplements

Comparable{ privateStringname; //姓名

privatedoublesalary; //工资

privateStringdepartment; //部门

……

//构造方法

…… //其他成员方法

publicintcompareTo(ObjectotherObject)

{……}}28compareTo方法的实现publicintcompareTo(ObjectotherObject)

{ //定义3个可能的返回值的所满足的条件

Employeeother=(Employee)otherObject;if(salary<other.salary)return-1;//比较工资多少

if(salary==other.salary)return0;elsereturn1;}}2930Comparable接口的使用Employeee1=newEmployee("Wang",4000.0,"Software");Employeee2=newEmployee("Sun",3000.0,"Math");switch(pareTo(e2)){case-1:System.out.println("<");break;case0:System.out.println("==");break;case1:System.out.println(">");break;}运行的结果是?练习下面的程序输出的结果是()publicclassAimplementsB{publicstaticvoidmain(Stringargs[]){inti;Ac1=newA();i=c1.k;System.out.println("i="+i);}}interfaceB{intk=10;}A)i=0B)i=10C)程序有编译错误D)i=true补充:

接口的继承关系

1.接口的单继承2.接口的多重继承1.接口的单继承。interfaceA{voidF1();}interfaceBextendsA{voidF2();}说明:接口B将继承接口A中的所有变量和方法,这种接口之间的继承称为单继承。接口之间的继承与类的继承一样使用关键字extends。2.接口的多重继承在Java语言中,不支持类的多重继承。但是支持接口的多重继承,其语法格式如下:

interface接口名extends接口名1,接口名2,…可见接口的多重继承只是在单继承的基础上再加上几个接口,并把这些接口用逗号分隔开。35接口是一种特殊形式的抽象类,它主要用来组织公用的常量,并统一操作行为的格式,通常它被应用在两个主要方面:用接口包装常量。可以将各式各样的常量放在接口中,让每个使用这些常量的类对象实现这个接口,从而达到享有这些常量的目的统一同类事物的操作接口。使用接口是为了解决Java语言中不支持多重继承的问题。接口的主要应用抽象类与接口的比较36抽象类接口共同点二者都可具有抽象方法,都不能实例化,但都可以有自己的声明,并能引用子类或实现类对象。不同点属性变量可以有变量不能有,只能是静态常量。成员方法可以有具体方法(而且具体方法可以调用抽象方法)。如果有方法,则全部是抽象方法。实现策略必须有子类继承必须有实现类实现扩展性弱强课堂练习1.关于接口的声明和实现,以下描述正确的是

。A.接口声明的方法只有声明没有实现

B.接口声明中的变量都必须写明final和staticC.如果一个接口由多个类来实现,则这些类在实现该接口中的方法时采用统一的代码D.如果一个类实现接口,则必须实现该接口中的所有方法,但方法未必申明为public37课堂练习2.下面程序运行的结果是

。interfaceInterfaceA{ Strings="good"; voidf(); }classClassAimplementsInterfaceA{ publicvoidf(){ System.out.print(s); }}

classClassB{ voidg(InterfaceAa){ a.f(); } }publicclassE{ publicstaticvoidmain(String[]args){ ClassBb=newClassB(); b.g(newClassA()); }}A.good B.编译正确,但无运行结果C.编译错误:b.g(newClassA()) D.以上都不对38课堂练习1.下列有关抽象类与接口的叙述中正确的是哪一个

。A.抽象类中不可以有非抽象方法,接口中也必须有抽象方法B.抽象类中可以有非抽象方法,接口中也可以有非抽象方法C.接口中的方法必须是抽象方法D.抽象类中的变量定义时必须初始化,而接口中不是39404.7包包是类和接口的集合。从资源管理的角度,可以将“包”理解为文件夹(目录)。将所有的类和接口按功能分别放置在不同的包中主要有两点好处:一是便于将若干个已存在的类或接口整体地添加到程序代码中;二是避免出现类名冲突的现象。41创建一个包就是用包的名称在文件系统下创建一个目录。在创建的目录下,既可以存放类文件或接口文件,也可以包含子目录,这些子目录是该包中的子包。创建一个包且将类文件放入其中的语法格式为:

packagepackageName;//

packageName是包名在NetBeans中,如果将类文件放入默认包,则没有包语句;如果将类文件放入指定的包中,类文件中会自动生成包语句。4.7.1创建包42对于在包中具有public访问属性的类或接口,可以通过导入语句(import)将其添加到程序代码中。导入语句的基本格式为import后跟包名序列及类名。

importuserPackage.*;userPackage是包名,.*代表将包中的所有类和接口都加载进来。

importuserPackage1.userPackage2.userPackage3.*;这条语句表示将userPackage1包中的子包userPackage2的子包userPackage3中的所有类和接口加载进来。4.7.2加载包引用不同包中的类434.8应用举例设计二人游戏二人游戏:由两名选手参与的游戏。比如:象棋、跳棋和五子棋等分析:两人游戏中有哪些共同的数据和操作。数据:应包含标识两名选手的常量;记录下一步应该是哪位选手操作的成员变量。44游戏中的操作1.指定从哪位选手开始2.返回当前操作的选手3.改变当前操作的选手4.返回游戏规则;5.判断游戏是否结束;6.返回获胜选手;7.返回游戏的提示信息8.返回游戏当前状态;9.游戏操作;10.接受用户输入;11.报告游戏当前状态;12.游戏信息提示;45TwoPlayerGame(抽象类)46publicstaticfinalintPLAYER_ONE=1;publicstaticfinalintPLAYER_TWO=2;protectedbooleanonePlaysNext=true;publicvoidsetPlayer(intstarter)//指定从哪位选手开始publicintgetPlayer()//返回当前操作的选手publicvoidchangePlayer()//改变当前操作的选手publicabstractStringgetRules();//返回游戏规则publicabstractbooleangameOver();//返回游戏是否结束publicabstractStringgetWinner();

//返回获胜者

TwoPlayerGamesetPlayerpublicvoidsetPlayer(intstarter)//指定从哪位选手开始

{if(starter==PLAYER_TWO){onePlaysNext=false;}else{onePlaysNext=true;}}47getPlayerpublicintgetPlayer()//返回当前操作的选手

{if(onePlaysNext==true){returnPLAYER_ONE;}else{returnPLAYER_TWO;}}48changePlayer()publicvoidchangePlayer()//改变当前操作的选手

{onePlaysNext=!onePlaysNext;}49Game接口publicinterfaceGame{publicStringgetGamePrompt(); //返回游戏提示

publicStringreportGameState(); //返回游戏当前状态}50UIPlay接口publicinterfaceUIPlayextendsGame{voidplay(UserInterfaceui

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论