Java核心技術上接口與內(nèi)部類_第1頁
Java核心技術上接口與內(nèi)部類_第2頁
Java核心技術上接口與內(nèi)部類_第3頁
Java核心技術上接口與內(nèi)部類_第4頁
Java核心技術上接口與內(nèi)部類_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1Java核心技術(上)醫(yī)藥信息工程學院陳偉廣東藥學院2接口與內(nèi)部類廣東藥學院接口interface是一個完成某些特定功能的類。接口用來描述類具有什么功能,而不給出功能的具體實現(xiàn)。一個類可以實現(xiàn)一個或多個接口publicinterfaceComparable{ intcompareTo(Objectother);}classEmployeeimplementsComparable{publicintcompareTo(Objectother){..... }}接口中的所有方法都自動地屬于public.在實現(xiàn)類中必須把方法聲明為public。接口不能聲明為final。接口體中包含常量定義和方法定義兩部分。接口只聲明方法,方法由實現(xiàn)類完成實現(xiàn),如果不定義方法,則該類是抽象類,加abstract關鍵字。classabstractEmployeeimplementsComparable{/*publicintcompareTo(Objectother){..... }*/}類實現(xiàn)一個接口需要1)將類聲明為實現(xiàn)給定的接口2)對接口中的所有方法進行定義。示例接口的特性接口不是類,不能進行new。Comparablex=newComparable();//error,不能創(chuàng)建接口對象;可以聲明接口變量,該變量可以指向一個實現(xiàn)了接口的類的對象Comparablex;x=newEmployee(...);//Employee類實現(xiàn)了Comparable接口可以使用instanceof操作符判斷對象是否實現(xiàn)了某個接口if(anObjectinstanceofComparable){...}接口也可以被擴展(繼承)。publicinterfaceMoveable{ voidmove(doublex,doubley);}publicinterfacePoweredextendsMoveable{ doublemilesPerGallon();}接口不能含有實例屬性和靜態(tài)方法,但可以包含常量(自動設為publicstaticfinal);publicinterfacePoweredextendsMoveable{doublemilesPerGallon();//方法自動設置為publicdoubleSPEED_LIMIT=120;//自動設為publicstaticfinal}一個類只能有一個超類,但可以實現(xiàn)多個接口(C++多繼承)classEmployeeimplementsCloneable,Comparable{........}多接口用逗號分開接口與抽象類classEmployeeextendsPerson,Comparable//ERRORclassEmployeeextendsPersonimplementsComparable//OK接口主要為了使用多重繼承,同時降低多繼承的復雜性和提高效率。疑問:接口中能有構造方法嗎?接口能繼承(extends)另一個接口,能不能實現(xiàn)(implement)另一個或多個接口呢?接口與抽象類的區(qū)別1.接口是抽象類的變體,接口中所有的方法都是抽象的。而抽象類是聲明方法的存在而不去實現(xiàn)它的類。2.接口可以多繼承,抽象類不行3.接口定義方法,不能實現(xiàn),而抽象類可以實現(xiàn)部分方法。4.接口中基本數(shù)據(jù)類型為static,而抽類象不是的。5.接口不能有構造方法,抽象類可以有。6.接口不能有靜態(tài)方法,抽象類可以有。7.在接口中凡是變量必須是publicstaticfinal,而在抽象類中沒有要求。當你關注一個事物的本質(zhì)的時候,用抽象類;當你關注一個操作的時候,用接口。對象克隆Employeeoriginal=newEmployee("johnPublic",50000);Employeecopy=original;copy.raiseSalary(10);//同時改了original對象Employeecopy=original.clone();copy.raiseSalary(10);//不改了original對象clone方法是Object類中的protected方法。對象克隆淺拷貝:當拷貝一個變量的時候,原始變量與拷貝變量引用同一個對象,這是一種淺拷貝,拷貝出來的對象仍然會對原對象產(chǎn)生影響。深拷貝:對象克隆,又稱為深拷貝。指的是創(chuàng)建一個新對象,且新對象的狀態(tài)與原始對象的狀態(tài)相同,當克隆的新對象修改時,不會影響原來的對象的狀態(tài)。publicEmployeeclone()throwsCloneNotSupportedException{//callObject.clone()Employeecloned=(Employee)super.clone();//clonemutablefieldscloned.hireDay=(Date)hireDay.clone();returncloned;}只有一個類實現(xiàn)了Cloneable接口才可以調(diào)用clone方法克隆。如果沒有實現(xiàn)Cloneable接口,則會產(chǎn)生一個已檢驗異常(checkedexception)示例clonev1ch06.clone謹慎地實現(xiàn)子類的克隆。接口與回調(diào)回調(diào)(callback)是一種常見的程序設計模式。指出某個特定事件發(fā)生時應該采取的動作。典型應用就是事件處理。示例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,對話框?qū)@示在屏幕的中央。javax.swing.Timer類Timer(intinterval,ActionListenerlistener)構造一個定時器,每隔interval毫秒鐘通知listener一次voidstart()啟動定時器,一旦啟動成功,定時器將調(diào)用監(jiān)聽器的actionPerformedvoidstop()停止定時器。一旦停止成功,定時不再調(diào)用監(jiān)聽器的actionPerformedjava.awt.Toolkit類staticToolkitgetDefaultToolkit()獲得默認的工具箱,工具箱包含有關GUI環(huán)境的變量。voidbeep()發(fā)出一聲鈴響內(nèi)部類內(nèi)部類,innerclass,是定義在另一個類中的類。內(nèi)部類是一種編譯器現(xiàn)象,與虛擬機無關,編譯器將會把內(nèi)部類翻譯成用$分隔外部類名與內(nèi)部類名的常規(guī)類文件,而虛擬機對此一無所知。內(nèi)部類比常規(guī)類更加強大,最大的特點是內(nèi)部類可以訪問外部類的私有數(shù)據(jù)。非內(nèi)部類的修飾符為public,abstract&final,而內(nèi)部類可以有private修飾。內(nèi)部類有三點原因被需要:內(nèi)部類可以訪問該類定義所在的作用域中的數(shù)據(jù),包括private類型的。內(nèi)部類可以對同一個包中的其他類隱藏起來。當想要定義一個回調(diào)函數(shù)且不想編寫大量代碼的時候,使用匿名內(nèi)部類比較便捷。使用訪問類訪問對象狀態(tài)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局部內(nèi)部類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();}匿名內(nèi)部類匿名內(nèi)部類(anonymousinnerclass)假如只創(chuàng)建了這個類的一個對象,就不必命名了。這種類被稱為匿名類。由于匿名內(nèi)部類沒有名字,而構造器的名字必須和類名一致,所以匿名內(nèi)部類沒有構造器。因為沒有構造函數(shù),所以它必須完全借用父類的構造函數(shù)來實例化,換言之:匿名內(nèi)部類完全把創(chuàng)建對象的任務交給了父類去完成。匿名內(nèi)部類是要擴展或?qū)崿F(xiàn)父類或接口,所以只能是繼承一個類,重寫方法實現(xiàn)一個接口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();}}使用匿名內(nèi)部類例子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();}}直接用繼承在接口上使用匿名內(nèi)部類interfaceP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論