Java核心技术上接口与内部类_第1页
Java核心技术上接口与内部类_第2页
Java核心技术上接口与内部类_第3页
Java核心技术上接口与内部类_第4页
Java核心技术上接口与内部类_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1Java核心技术(上)医药信息工程学院陈伟广东药学院2接口与内部类广东药学院接口interface是一个完成某些特定功能的类。接口用来描述类具有什么功能,而不给出功能的具体实现。一个类可以实现一个或多个接口publicinterfaceComparable{ intcompareTo(Objectother);}classEmployeeimplementsComparable{publicintcompareTo(Objectother){..... }}接口中的所有方法都自动地属于public.在实现类中必须把方法声明为public。接口不能声明为final。接口体中包含常量定义和方法定义两部分。接口只声明方法,方法由实现类完成实现,如果不定义方法,则该类是抽象类,加abstract关键字。classabstractEmployeeimplementsComparable{/*publicintcompareTo(Objectother){..... }*/}类实现一个接口需要1)将类声明为实现给定的接口2)对接口中的所有方法进行定义。示例接口的特性接口不是类,不能进行new。Comparablex=newComparable();//error,不能创建接口对象;可以声明接口变量,该变量可以指向一个实现了接口的类的对象Comparablex;x=newEmployee(...);//Employee类实现了Comparable接口可以使用instanceof操作符判断对象是否实现了某个接口if(anObjectinstanceofComparable){...}接口也可以被扩展(继承)。publicinterfaceMoveable{ voidmove(doublex,doubley);}publicinterfacePoweredextendsMoveable{ doublemilesPerGallon();}接口不能含有实例属性和静态方法,但可以包含常量(自动设为publicstaticfinal);publicinterfacePoweredextendsMoveable{doublemilesPerGallon();//方法自动设置为publicdoubleSPEED_LIMIT=120;//自动设为publicstaticfinal}一个类只能有一个超类,但可以实现多个接口(C++多继承)classEmployeeimplementsCloneable,Comparable{........}多接口用逗号分开接口与抽象类classEmployeeextendsPerson,Comparable//ERRORclassEmployeeextendsPersonimplementsComparable//OK接口主要为了使用多重继承,同时降低多继承的复杂性和提高效率。疑问:接口中能有构造方法吗?接口能继承(extends)另一个接口,能不能实现(implement)另一个或多个接口呢?接口与抽象类的区别1.接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。2.接口可以多继承,抽象类不行3.接口定义方法,不能实现,而抽象类可以实现部分方法。4.接口中基本数据类型为static,而抽类象不是的。5.接口不能有构造方法,抽象类可以有。6.接口不能有静态方法,抽象类可以有。7.在接口中凡是变量必须是publicstaticfinal,而在抽象类中没有要求。当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。对象克隆Employeeoriginal=newEmployee("johnPublic",50000);Employeecopy=original;copy.raiseSalary(10);//同时改了original对象Employeecopy=original.clone();copy.raiseSalary(10);//不改了original对象clone方法是Object类中的protected方法。对象克隆浅拷贝:当拷贝一个变量的时候,原始变量与拷贝变量引用同一个对象,这是一种浅拷贝,拷贝出来的对象仍然会对原对象产生影响。深拷贝:对象克隆,又称为深拷贝。指的是创建一个新对象,且新对象的状态与原始对象的状态相同,当克隆的新对象修改时,不会影响原来的对象的状态。publicEmployeeclone()throwsCloneNotSupportedException{//callObject.clone()Employeecloned=(Employee)super.clone();//clonemutablefieldscloned.hireDay=(Date)hireDay.clone();returncloned;}只有一个类实现了Cloneable接口才可以调用clone方法克隆。如果没有实现Cloneable接口,则会产生一个已检验异常(checkedexception)示例clonev1ch06.clone谨慎地实现子类的克隆。接口与回调回调(callback)是一种常见的程序设计模式。指出某个特定事件发生时应该采取的动作。典型应用就是事件处理。示例TimerTest.javaclassTimePrinterimplementsActionListener{publicvoidactionPerformed(ActionEventevent){Datenow=newDate();System.out.println("Atthetone,thetimeis"+now);Toolkit.getDefaultToolkit().beep();}}javax.swing.JOptionPane类staticvoidshowMessageDialog(Componentparent,Objectmessage)显示一个包含一条消息和一个OK按钮的对话框。这个对话框位于其parent组件的中央。如果parent为null,对话框将显示在屏幕的中央。javax.swing.Timer类Timer(intinterval,ActionListenerlistener)构造一个定时器,每隔interval毫秒钟通知listener一次voidstart()启动定时器,一旦启动成功,定时器将调用监听器的actionPerformedvoidstop()停止定时器。一旦停止成功,定时不再调用监听器的actionPerformedjava.awt.Toolkit类staticToolkitgetDefaultToolkit()获得默认的工具箱,工具箱包含有关GUI环境的变量。voidbeep()发出一声铃响内部类内部类,innerclass,是定义在另一个类中的类。内部类是一种编译器现象,与虚拟机无关,编译器将会把内部类翻译成用$分隔外部类名与内部类名的常规类文件,而虚拟机对此一无所知。内部类比常规类更加强大,最大的特点是内部类可以访问外部类的私有数据。非内部类的修饰符为public,abstract&final,而内部类可以有private修饰。内部类有三点原因被需要:内部类可以访问该类定义所在的作用域中的数据,包括private类型的。内部类可以对同一个包中的其他类隐藏起来。当想要定义一个回调函数且不想编写大量代码的时候,使用匿名内部类比较便捷。使用访问类访问对象状态publicclassTalkingClock{privteintinterval;privatebooleanbeep;publicTalkingClock(intinterval,booleanbeep){...}publicvoidstart(){...}publicclassTimePrinterimplementsActionListener{ publicvoidactionPerformed(ActionEventevent){ Datenow=newDate(); System.out.println("Atthetone,thetimeis"+now); if(beep)Toolkit.getDefaultToolkit().beep(); }}隐式引用指向外部类outer=TimePrinterinterval=1000TalkingClockbeep=true局部内部类publicvoidstart(){classTimePrinterimplementsActionListener{ publicvoidactionPerformed(ActionEventevent){ Datenow=newDate(); System.out.println("Atthetone,thetimeis"+now); if(beep)Toolkit.getDefaultToolkit().beep(); } }ActionListenerlistener=newTimePrinter();Timert=newTimer(interval,listener);t.start();}这个例子是在一个方法中定义局部类。局部类不能用public或private访问说明符进行声明。它的作用域被限定在声明这个局部类的块中。对外部世界完全隐藏起来。只能在start方法中使用,别的方法都不能够使用。由外部方法访问final变量局部类能够访问包含它们的外部类,还可以访问局部变量。不过那些局部变量必须被声明为final。publicvoidstart(intinterval,finalbooleanbeep){

classTimePrinterimplementsActionListener{

publicvoidactionPerformed(ActionEventevent){

Datenow=newDate(); System.out.println("Atthetone,thetimeis"+now); if(beep)Toolkit.getDefaultToolkit().beep(); } }ActionListenerlistener=newTimePrinter();Timert=newTimer(interval,listener);t.start();}匿名内部类匿名内部类(anonymousinnerclass)假如只创建了这个类的一个对象,就不必命名了。这种类被称为匿名类。由于匿名内部类没有名字,而构造器的名字必须和类名一致,所以匿名内部类没有构造器。因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,换言之:匿名内部类完全把创建对象的任务交给了父类去完成。匿名内部类是要扩展或实现父类或接口,所以只能是继承一个类,重写方法实现一个接口classTalkingClock{/***Startstheclock.*@paramintervaltheintervalbetweenmessages(inmilliseconds)*@parambeeptrueiftheclockshouldbeep*/publicvoidstart(intinterval,finalbooleanbeep){

ActionListenerlistener=newActionListener(){publicvoidactionPerformed(ActionEventevent){Datenow=newDate();System.out.println("Atthetone,thetimeis"+now);if(beep)Toolkit.getDefaultToolkit().beep();}};Timert=newTimer(interval,listener);t.start();}}使用匿名内部类例子abstractclassPerson{publicabstractvoideat();}classChildextendsPerson{publicvoideat(){System.out.println("eatsomething");}}publicclassDemo{publicstaticvoidmain(String[]args){Personp=newChild();p.eat();}}abstractclassPerson{publicabstractvoideat();}publicclassDemo{publicstaticvoidmain(String[]args){

Personp=newPerson(){publicvoideat(){System.out.println("eatsomething");}};p.eat();}}直接用继承在接口上使用匿名内部类interfaceP

温馨提示

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

评论

0/150

提交评论