![第04章接口、内部类和JavaAPI基础(信息学院2014级)_第1页](http://file4.renrendoc.com/view/b5c0a6a71a18ce2f497b05a8631b9391/b5c0a6a71a18ce2f497b05a8631b93911.gif)
![第04章接口、内部类和JavaAPI基础(信息学院2014级)_第2页](http://file4.renrendoc.com/view/b5c0a6a71a18ce2f497b05a8631b9391/b5c0a6a71a18ce2f497b05a8631b93912.gif)
![第04章接口、内部类和JavaAPI基础(信息学院2014级)_第3页](http://file4.renrendoc.com/view/b5c0a6a71a18ce2f497b05a8631b9391/b5c0a6a71a18ce2f497b05a8631b93913.gif)
![第04章接口、内部类和JavaAPI基础(信息学院2014级)_第4页](http://file4.renrendoc.com/view/b5c0a6a71a18ce2f497b05a8631b9391/b5c0a6a71a18ce2f497b05a8631b93914.gif)
![第04章接口、内部类和JavaAPI基础(信息学院2014级)_第5页](http://file4.renrendoc.com/view/b5c0a6a71a18ce2f497b05a8631b9391/b5c0a6a71a18ce2f497b05a8631b93915.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第4章接口、内部类和JavaAPI基础内容和要求:理解接口的作用,理解接口和实现接口的类的关系,掌握声明接口、一个类实现多个接口的声明和使用方法。理解内嵌类型的概念,掌握声明内部类的方法。熟悉Java语言包和实用包中的常用类。重点:接口和实现接口的类;JavaAPI
。第4章接口、内部类和JavaAPI基础4.1接口4.2内部类和内部接口4.3javaAPI基础(基础类库和工具类库)4.4泛型24.1接口与实现接口的类3接口定义:接口(interface)是一组抽象方法、常量常量和内嵌类型的集合。在Java中,接口是一种引用数据类型。与抽象类相似,接口采用抽象的形式(抽象方法)描述约定,接口只有被类实现后才有意义。抽象方法的具体实现由实现接口的类完成,实现接口的非抽象类必须重写接口中的所有抽象方法。接口的作用接口提供方法声明与方法实现相分离的机制,使多个类之间表现出共同的行为能力。接口中的一个抽象方法在实现接口的多个类中表现出多态性。41.声明接口[public]interface
接口[extends父接口列表]{[public][static][final]数据类型成员变量=常量值;[public][abstract]返回值类型成员方法[(参数列表)];}publicinterfaceArea{//可计算面积接口 publicabstractdoublearea(); //计算面积}publicinterfacePerimeter{//课计算周长接口publicabstractdoubleperimeter();}51.声明接口声明接口的说明接口中的成员变量都是常量,声明时必须赋值,默认修饰符为publicstaticfinal;不能声明实例成员变量。接口中的成员方法都是抽象的实例成员方法,默认修饰符为publicabstract,不能声明为static。接口中不能包含构造方法。接口的访问控制权限是public或缺省。接口没有任何具体的实现,也就不能创建实例。2.声明实现接口的类[修饰符]class类<泛型>[extends父类][implements接口列表]例如,publicclassRectangleimplementsAreapublicclassEllipseimplementsArea,Perimeter实现接口的非抽象类必须实现所有接口中的所有抽象方法,否则声明为抽象类7类实现接口说明:具体类必须实现(implements)接口的所有方法,且方法名字必须相同。如果一个具体类implements某个接口。却没有实现该接口的所有方法,在编译时将会产生语法错误,提示该类必须声明为abstract。一个类可以实现多个接口。89图4.1ClosedFigure类的继承关系publicabstractclassClosedFigureextendsFigureimplementsArea,PerimeterCloseFigure声明为了抽象类,所以可以不实现area和perimeter方法。声明柱体类Cylinder,实现Area和Volume接口publicclassCylinderextendsObjectimplements
Area,VolumepublicinterfaceVolume{//可计算体积接口publicabstractdoublevolume();//抽象方法,计算体积}3.接口是多继承的11publicinterfaceSolid
extendsArea,Volume//立体接口,继承Area和Volume接口publicclassGlobeextendsObjectimplementsSolid//球类,实现Solid接口Java中类是单继承、接口是多继承。4.接口是引用数据类型ClosedFigurefig=newEllipse(point,10,20); //父类对象fig引用椭圆子类实例Cylindercylinder=newCylinder(fig,10);//椭圆柱Areaar=cylinder;//ar引用实现Area接口的Cylinder类的实例Volumevol=cylinder;//Volume接口对象vol引用实 现Volume接口的Cylinder类的实例ar.area()
//运行时多态vol.volume()12ar只能访问area()方法vol只能访问volume()方法父类对象可以引用子类实例,但是只能访问父类声明的方法图4.4接口声明的抽象方法在实现该接口的多个类中表现出运行时多态性相同点:两者都包含抽象方法。两者都不能被实例化。两者都是引用数据类型。145.接口与抽象类比较抽象类约定多个子类之间共同使用的方法;接口约定多个互不相关类之间共同使用的方法。抽象类与子类之间采用单重继承机制;接口则实现了多重继承的功能。抽象类及其类中成员具有与普通类一样的访问权限;接口的访问权限有public和默认两种,接口中成员的访问权限均是public。抽象类中可以包含非抽象方法,也可以声明构造方法;接口中的方法全部是抽象方法,不能声明构造方法。抽象类中可以声明成员变量,子类可以对该成员变量赋值;接口中只能声明常量。15接口与抽象类的不同点6.单继承和多继承161)类的单继承的优点搜索路径是线性的接口的多继承不会影响线性搜索2)接口多态性实现更灵活图4.5多继承的“钻石继承”类型会导致二义性相对于多继承,Java的单继承在父类方法时更简单197.Java.lang中常用的接口20publicinterfaceCloneable{//可克隆接口}publicinterfaceComparable<T>{//可比较接口 publicintcompareTo(To);}PublicinterfaceRunnable{//线程可运行接口 publicabstractvoidrun();}publicinterfaceSerializable{//可序列化接口}其中Cloneable和Serializable接口称为标记接口,没有任何常量和方法Cloneable接口举例类实现Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。如果在没有实现Cloneable接口的实例上调用Object的clone方法,则会导致抛出CloneNotSupportedException异常。按照惯例,实现此接口的类应该使用公共方法重写Object.clone(它是受保护的)。publicclassCloneDemoimplementsCloneable{ publicStringname; publicintid; publicMyDatebirthday; ….. publicCloneDemoclone()throwsCloneNotSupportedException{ CloneDemocloned=(CloneDemo)super.clone(); cloned.birthday=(MyDate)birthday.clone(); returncloned; } …….}4.2内部类和内部接口22publicclassPixel//像素类,外层类型,外部类{publicstaticinterfaceColorConstant //颜色常量接口,静态内部接口,类型嵌套
publicstaticclassColorextendsObjectimplementsColorConstant//颜色类,静态内部类}内部类和内部接口:声明在其他类或接口内部的内嵌类型。类型嵌套:静态内嵌类型Pixel.Colorcolor=newPixel.Color(255,255,255);对象嵌套:实例内嵌类型内部类作为类型的特性内嵌类型不能与外层类型同名。内部类中可以声明成员变量和成员方法。内部类可以继承父类或实现接口。可以声明内部类为抽象类,该抽象类必须被其他内部类继承;内部接口必须被其他内部类实现。232.内部类作为成员的特性24使用点运算符“.”引用内嵌类型:外层类型.内嵌类型Pixel.Color内嵌类型具有类中成员的4种访问控制权限。当内部类可被访问时,才能考虑内部类中成员的访问控制权限。内嵌类型与其外层类型彼此信任,能访问对方的所有成员。内部接口总是静态的。内部类可声明是静态的或实例的,静态内部类能够声明静态成员,但不能引用外部类的实例成员;实例内部类不能声明静态成员。在实例内部类中,使用以下格式引用或调用外部类当前实例的成员变量或实例成员方法:
外部类.this.成员变量
//引用外部类当前实例的成员变量
外部类.this.实例成员方法(参数列表)//调用外部类当前实例的成员方法4.3JavaAPI基础4.3.1Java.lang包的基础类库4.3.2Java.util包的工具类库254.3.1java.lang包中的基础类库类名功能Object类Java类层次的根,其他类的祖先Math提供一组数学函数和常数Comparale接口约定对象比较大小的方法基本数据类型包装类8个基本类型的包装类String字符串类提供字符串的操作方法System和Runtime类系统和运行时类,提供访问系统和运行时环境资源Class类提供类名、父类即类所在包的信息Error、Excpetion处理异常和错误Thread类和Runnable接口提供多线程管理、多线程操作类及接口261.Object类packagejava.lang;publicclassObject{publicObject() //构造方法
publicfinalnativeClass<?extendsObject>getClass();
//返回当前对象所在的类
publicbooleanequals(Objectobj) //比较当前对象与obj是否相等publicStringtoString()//返回当前对象的信息字符串protectedvoidfinalize()throwsThrowable//析构方法}272.Math数学类publicfinalclassMathextendsObject{publicstaticfinaldoubleE=2.7182818284590452354;//常量
publicstaticfinaldoublePI=3.14159265358979323846;publicstaticdoubleabs(doublea) //求绝对值
publicstaticdoublemax(doublea,doubleb)//最大值
publicstaticdoublemin(doublea,doubleb)//最小值
publicstaticdoublerandom()//返回一个0.0~1.0之间的随机数…………..}283.Comparable可比较接口publicinterfaceComparable<T>{intcompareTo(To)//比较对象}其中,<T>是Comparable接口的参数,表示一个类。29MyDate类对象比较大小publicclassMyDateimplementsComparable<MyDate>
{publicintcompareTo(MyDated)//约定比较日期大小的规则,返回-1、0、1{if(this.year==d.year&&this.month==d.month&&this.day==d.day)return0;return(this.year>d.year||this.year==d.year&&this.month>d.month||this.year==d.year&&this.month==d.month&&this.day>d.day)?1:-1;}}30Comparable接口举例publicclassMyDateimplementsComparable<MyDate>//类声明{….publicstaticvoidmain(Stringargs[])
{MyDatedates[]={newMyDate(1995,12,5),newMyDate(2003,2,18),newMyDate(1998,6,18)};….Arrays.sort(dates);…}}4.基本数据类型的包装类328个Byte、Short、Integer、Long、Float、Double、Character、Boolean。基本数据类型的包装类8个Byte、Short、Integer、Long、Float、Double、Character、Boolean。publicfinalclassIntegerextendsNumberimplementsComparable<Integer>{publicstaticfinalintMIN_VALUE=0x80000000;//最小值常量,-231publicstaticfinalintMAX_VALUE=0x7fffffff;//最大值常量,231-1publicInteger(intvalue)//构造方法publicInteger(Strings)throwsNumberFormatExceptionpublicstaticintparseInt(Strings)throwsNumberFormatException //将字符串转换为整数,静态方法
publicbooleanequals(Objectobj)//覆盖Object类中方法publicStringtoString() //覆盖Object类中方法publicintcompareTo(IntegeranotherInteger)//比较两个对象的大小,返回两者之间的差值,实现Comparable接口中方法}335.String字符串类publicfinalclassStringextendsObjectimplementsjava.io.Serializable,Comparable<String>,CharSequence{publicString() //构造方法
publicString(Stringoriginal)publicStringtoString() //覆盖Object类中方法
publicintlength() //返回字符串的长度
publicbooleanequals(Objectobj) //比较字符串是否相等
publicbooleanequalsIgnoreCase(Strings)//忽略字母大小写
publicintcompareTo(StringanotherString) //比较字符串的大小,实现Comparable接口方法
publicintcompareToIgnoreCase(Stringstr) //比较字符串的大小,忽略字母大小写}346.StringBuffer字符串缓冲区类publicfinalclassStringBufferextendsAbstractStringBuilderimplementsjava.io.Serializable,CharSequence{publicStringBuffer() //构造方法
publicStringBuffer(Stringstr)publicappend(char[]str) //覆盖Object类中方法……….}String对象存储常量字符串,实例不能被修改,赋值过程会重新分配内存StringBuffer采用缓冲区存储可变长的字符串,可以改变字符串对象中的指定字符串。避免在运算时频繁申请内存。357.Class类操作类publicfinalclassClass<T>{publicStringgetName()//返回当前类名字符串
publicClass<?superT>getSuperclass(); //返回当前类的父类
publicPackagegetPackage() //返回当前类所在的包………..}this.getClass().getName()this.getClass().getSuperclass().getName()this.getClass().getPackage().getName()36获取一个类的Class方式ClassName.class类实例.getClass()方法类加载器Class.forName(“classname”)37Class<?>用法,?是通配符Class<Integer>cla;与Class<?>cl;
前一个表示cla只能指向Integer这种类型,而后一个cl表示可以指向任意类型。
cla=Integer.class可以,但cla=Double.class就不可以。
但是cl=Integer.class可以,cl=Double.class也可以8.System系统类和Runtime运行时类publicfinalclassSystemextendsObject{publicfinalstaticInputStreamin=nullInputStream();publicfinalstaticPrintStreamout=nullPrintStream();publicfinalstaticPrintStreamerr=nullPrintStream();publicstaticnativeviodarraycopy(Objectsrc,intsrc_pos,Objectdst,intdst_pos,intlength) //复制数组
publicstaticvoidexit(intstatus)//结束当前运行的程序
publicstaticnativelongcurrentTimeMillis();//获得当前日期和时间,毫秒数
publicstaticPropertiesgetProperties() //获得系统全部属性
publicstaticStringgetProperty(Stringkey)//获得指定系统属性}38System类提供访问系统资源和标准输入/输出流的方法,之前用到了in和out常量。Runtime运行时类publicclassRuntimeextendsObject{publicstaticRuntimegetRuntime() //返回与当前应用程序相联系的运行时环境
publiclongtotalMemory()//返回系统内存空间总量
publiclongfreeMemory() //返回系统内存剩余空间的大小publicProcessexec(Stringcommand,String[]envp)//在指定环境的单独进程中执行指定的字符串命令。
………….}39Runtime类可直接访问运行时资源Runtime类举例publicclassRuntimeDemo{publicstaticvoidmain(String[]args)throwsIOException{//获取与当前应用程序相联系的运行时环境,在当前应用程序运行另外一个程序
Runtimert=Runtime.getRuntime(); Processprocess=rt.exec("notepad.exe"); System.out.println("总内存:"+rt.totalMemory()+"空闲内存:"+rt.freeMemory());}}40启动了记事本程序,并在控制台输出:总内存:124780544空闲内存:1221797924.4java.util包中的工具类库1日期类2Comparator比较器接口3Arrays数组类4泛型411.日期类---DatepublicclassDateextendsObjectimplementsjava.io.Serializable,Cloneable,Comparable<Date>{publicDate() //构造方法,获得系统当前日期和时间的Date对象
{this(System.currentTimeMillis());}publicDate(longdate)//构造方法,以长整型值创建Date对象
publicvoidsetTime(longtime) //设置时间对应的长整型值
publiclonggetTime() //返回对象中的时间值
publicbooleanbefore(Datewhen) //判断是否在指定日期之前
publicbooleanafter(Datewhen) //判断是否在指定日期之后
publicintcompareTo(DateanotherDate)//比较两个日期}42由DateFormat控制日期输出格式日期类——CalendarpublicabstractclassCalendarextendsObjectimplementsSerializable,Cloneable,Comparable<Calendar>{publicstaticfinalintYEAR //年,常量
publicstaticfinalintMONTH //月
publicstaticfinalintDATE //日
publicstaticfinalintHOUR //时
publicstaticfinalintMINUTE //分
publicstaticfinalintSECOND //秒
publicstaticfinalintMILLISECOND //百分秒
publicstaticfinalintDAY_OF_WEEK //星期}43Calendar类publicabstractclassCalendarextendsObjectimplementsSerializable,Cloneable,Comparable<Calendar>{publicstaticCalendargetInstance() //创建实例
publicintget(intfield) //返回日期
publicfinalDategetTime()//返回对象中的日期和时间
publicfinalvoidsetTime(Datedate)//设置对象的日期和时间
publicfinalvoidset(intyear,intmonth,intdate)publicfinalvoidset(intyear,intmonth,intdate,inthour,intminute)}例如,Calendarnow=Calendar.getInstance();//获得实例intyear=now.get(Calendar.YEAR); //获得对象中的年份值【例4.5】月历。442.Comparator比较器接口publicinterfaceComparator<T>{publicabstractbooleanequals(Objectobj); //比较两个比较器对象是否相等
publicabstractintcompare(Tcobj1,Tcobj2);//指定比较两个对象大小的规则}【例4.4】Person类的多种比较规则。(1)约定多种比较对象大小的规则(2)约定多种比较对象相等的规则45Comparator比较器接口举例与comparable差别:
Comprator可以实现多个比较接口,而comparable接口只能按照一种方式比较。classTimeComparatorimplementsComparator<ExpressNumber>实现按时间排序classFromAddrComparatorimplementsComparator<ExpressNumber>实现按发件地址排序classToAddrComparatorimplementsComparator<ExpressNumber>实现按收件地址排序classNumComparatorimplementsComparator<ExpressNumber>实现按单号排序3.Arrays数组类比较两个数组是否相等publicstaticbooleanequals(int[]a,int[]b)publicstaticbooleanequals(Object[]a,Object[]b)填充publicstaticvoidfill(int[]a,intval)排序publicstaticvoidsort(Object[]a)publicstatic<T>voidsort(T[]a,Comparator<?superT>c)二分法(折半)查找publicstaticintbinarySearch(Object[]a,Objectkey)publicstatic<T>intbinarySearch(T[]a,Tkey,Comparator<?superT>c)474泛型1)泛型声明[修饰符]class类<类型参数列表>[extends父类][implements接口列表][public]interface接口<类型参数列表>[extends父接口列表][public][static]<类型参数列表>
返回值类型方法([参数列表])[throws异常类列表]48泛型举例publicclassGenericsDemo{publicstaticvoidmain(String[]args){ GStudent<Integer>iStud=newGStudent<Integer>(10,20,30); GStudent<String>sStud=newGStudent<String>("10","20","30"); System.out.println(iStud); System.out.println(sStud);}}classGStudent<T>{
TstudentName; TstudentNo; TseatNumber; publicGStudent(TstudentName,TstudentNo,TseatNumber){ this.studentName=studentName; this.studentNo=studentNo; this.seatNumber=seatNumber; } publicStringtoString(){ return"[studentName="+studentName+",studentNo="+studentNo +",seatNumber="+seatNumber+"]"; }}492)泛型的必要性Comparable<T>Comparable<String>scom="abc";//String实现Comparable<String>Comparable<Person>pcom=newPerson("李明",null,"男","","");//Person实现Comparable<Person>50Comparable<Person>与Comparable<Student>Personpvalue[]={newPerson(…)};sort(pvalue);//Person实现omparable<Person>Studentsvalue[]={newStudent(…),……};sort(svalue);//编译错,因为Student继承Person类,实现Comparable<Person>接口,
//没有实现Comparable<Student>接口,不满足TextendsComparable<T>语法publicclassStudentimplementsComparable<Student> //提供compareTo(Student)方法513)泛型的继承性及通配符Comparator<?>是所有Comparator<T>的父类型,“?”称为通配符,表示通配类型,代表能够匹配任何类型。“?”还有以下两种限定通配符用法:?extendsT//?表示T及其任意一种子类型,T称为?的上界?superT//?表示T及其任意一种父类型,T称为?的下界publicstatic<TextendsComparable<?superT>>voidsort(Tvalue[])publicstatic<T>voidsort(Tvalue[],Comparator<?superT>c)52小结理解接口的作用,理解接口和实现接口的类的关系,掌握声明接口、一个类实现多个接口的声明和使用方法。理解内嵌类型的概念,掌握声明内部类的方法。熟悉Java语言包和实用包中的常用类。理解泛型的作用和用法重点:接口和实现接口的类;JavaAPI
。531.什么是接口?接口的作用是什么?习题54【答】接口是一组抽象方法、常量和内嵌类型的集合。接口提供方法声明与方法实现相分离的机制,使实现接口的多个类表现出共同的行为能力。2.接口能否被实例化?为什么?接口中能否写构造方法?为什么?【答】接口不能被实例化,因为接口是声明的是抽象方法,没有方法体。接口中不能写构造方法,因为构造方法不能声明为抽象方法。3.接口对象引用谁的实例?【答】接口是引用类型,接口对象引用实现该接口的类的实例。4.什么是单重继承?什么是多重继承?类的层次体系为什么需要多重继承?单重继承有什么缺点?既然有缺点,为什么Java仍然采用单重继承?Java怎样实现多重继承?【答】单重继承就是一个类只能有一个父类。多继承就是可以有多个父类。现实中的对象往往表现出多种特性,用单重继承无法客观描绘,因此需要多重继承。但是C++的多重继承过于复杂,因此Java用“单重继承+接口”代替了多重继承,以提高运行效率,增加安全性,降低复杂性。5.怎样将数值类型的数据转换成字符串?怎样将字符串转换成数值类型的数据?【答】Integer类的静态方法parseInt()和实例方法intVal
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论