版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第六章多 態(tài) 性學(xué)習(xí)目標(biāo)理解多態(tài)性的概念理解繼承層次結(jié)構(gòu)中對象間的關(guān)系區(qū)分抽象類與具體類抽象類和抽象方法的聲明和使用接口的聲明和實(shí)現(xiàn)final類和final方法嵌套類的概念和使用基本數(shù)據(jù)類型的包裝類6.1 多態(tài)性概念和實(shí)例 多態(tài)性(Polymorphism)在超類中定義的屬性或行為,被子類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在超類及其各個(gè)子類中具有不同的語義。定義Shape s; s.draw(); /s調(diào)用draw()方法,s指向?qū)ο蟛煌瑫嫵霾煌膱D形(圓或矩形或三角形)多態(tài)性也是泛指在程序中同一個(gè)符號在不同的情況下具有不同解釋的現(xiàn)象。 Circled
2、raw() Triangle Rectangledraw()Shapevoid draw();draw()6.1 多態(tài)性概念和實(shí)例 6.1 多態(tài)性概念和實(shí)例(續(xù))實(shí)現(xiàn)多態(tài)性的條件:繼承抽象方法引用Shape (抽象類)public abstract void draw ();Circle public void draw () ./畫圓 Rectanglepublic void draw () ./畫矩型 Shape s;Circle c1=new Circle();Rectangle r1=new Rectangle();s=c1;s.draw() ; /畫圓 s=r1;s.draw();
3、/ /畫矩型 6.2 繼承層次結(jié)構(gòu)中對象間的關(guān)系繼承層次結(jié)構(gòu)中的子類對象可以視為超類的對象,這樣就可以將子類對象賦給超類變量。然而,超類對象并不是其任何子類的對象,即不能將超類對象賦給子類引用。6.2 繼承層次結(jié)構(gòu)中對象間的關(guān)系(續(xù))例如:Point3 point = new Point3( 30, 50 );Circle4 circle = new Circle4( 120, 89, 2.7 );Point3 pointRef = circle; (允許)Point3 pointRef=new Circle4(120,12,0) (允許)pointRef.toString(); /call
4、Circle4.toString();pointRef=point; pointRef.toString() /call Point.toString();Circle circle= point; / 不允許,編譯出錯 Circle4Point3與引用變量指向的對象相關(guān)強(qiáng)制類型轉(zhuǎn)換下列語句組是將point對象強(qiáng)制轉(zhuǎn)換成Circle對象,circle. getX() 語句是正確的,而circle. getRadius()語句在運(yùn)行時(shí)會產(chǎn)生錯誤。因?yàn)閏ircle引用指向的point對象根本無getRadius方法。Point3 point = new Point3( 30, 50 );Circl
5、e circle=(Circle) point;circle. getX() ;circle. getRadius() ; /run-time error 例6-1中的例子舉例說明了繼承層次結(jié)構(gòu)中對象間的關(guān)系。6.2 繼承層次結(jié)構(gòu)中對象間的關(guān)系 (續(xù))例6-2 超類對象的引用賦給一個(gè)子類類型的變量/HierarchyRelationshipTest2.javapublic class HierarchyRelationshipTest2 public static void main( String args ) Point3 point = new Point3( 30, 50 ); Cir
6、cle3 circle; circle = point; /超類對象的引用賦給一個(gè)子類類型的變量,是不允許的。 6.3 抽象類和抽象方法 6.3.1 抽象類和具體類的概念 6.3.2 抽象方法的聲明 6.3.3 抽象類的聲明 6.3.4 抽象類程序設(shè)計(jì)的舉例 6.3.1 抽象類和具體類的概念抽象類:每個(gè)抽象類中至少包含一個(gè)抽象方法。抽象類只能作為繼承層次結(jié)構(gòu)中的超類,所以這些類稱為抽象超類。不能實(shí)例化抽象類的對象。抽象類的目的是提供一個(gè)合適的超類,以派生其他類。具體類:用于實(shí)例化對象的類。這種類實(shí)現(xiàn)它們聲明的所有方法。抽象超類是一般類,它們僅僅指定子類的共同點(diǎn),并不創(chuàng)建出真實(shí)的對象。例如,如果
7、我們要“繪制形狀”,那我們將繪制什么形狀呢?具體類為實(shí)例化對象提供了合理的細(xì)節(jié)。 6.3.2 抽象方法的聲明用關(guān)鍵字abstract聲明抽象方法:public abstract void draw();抽象方法并不提供實(shí)現(xiàn)。包含抽象方法的類必須聲明為抽象類。抽象超類的所有具體子類都必須為超類的抽象方法提供具體實(shí)現(xiàn)。6.3.3 抽象類的聲明使用關(guān)鍵字abstract聲明抽象類。形如:public abstract class Shape .抽象類通常包含一個(gè)或多個(gè)抽象方法(靜態(tài)方法不能為抽象方法)。抽象超類不能實(shí)例化。但可以使用抽象超類來聲明引用變量,用以保存抽象類所派生的任何具體類的對象。程序
8、通常使用這種變量來多態(tài)地操作子類對象。6.3.4 抽象類程序設(shè)計(jì)的舉例例6-3 抽象類的程序設(shè)計(jì)示例該例子所使用到的類的層次結(jié)構(gòu)如圖6-1所示。類的層次以抽象超類Shape為開始,派生出Point類,然后由Point類派生出Circle類,再由Circle類派生出Cylinder類。其中Shape以斜體字出現(xiàn)表示它是抽象類。圖6-1 Shape類的層次結(jié)構(gòu)6.4 接口的聲明和實(shí)現(xiàn) 6.4.1 接口的概念 6.4.2 接口的聲明6.4.3 接口的實(shí)現(xiàn)6.4.4 接口的程序設(shè)計(jì)舉例 6.4.1 接口的概念接口:用于聲明一組類的公共操作的接口。接口由常量和一組抽象方法組成。接口中不包括變量和有具體實(shí)
9、現(xiàn)的方法。接口只是聲明了功能是什么(方法頭),而并沒有定義如何實(shí)現(xiàn)這個(gè)功能,功能的實(shí)現(xiàn)(即方法體)是在繼承這個(gè)接口的各個(gè)子類中完成的.接口支持多重繼承,在Java中,通常把對接口功能的繼承稱為“實(shí)現(xiàn)(implement)”。 接口與抽象類到底有什么區(qū)別:(1)接口不能實(shí)現(xiàn)任何方法,而抽象類可以。(2)類可以實(shí)現(xiàn)許多接口,但只有一個(gè)父類。(3)接口不是類分級結(jié)構(gòu)的一部分,沒有聯(lián)系的類可以實(shí)現(xiàn)相同的接口。6.4.1 接口的概念(續(xù))6.4.2 接口的聲明定義接口的一般格式如下: public interface 接口名 extends 父接口名列表 /常量聲明 public final stati
10、c 類型 變量名=常量值; /抽象方法聲明 public abstract 返回類型 方法名(參數(shù)列表); 接口支持多重繼承:接口的定義舉例:6.4.2 接口的聲明(續(xù))public interface StockWatcherfinal String sunTicker=SUNW; final String oracleTicker=ORCL; final String ciscoTicker=CSCO; void valueChanged(String tickerSymbol,double newValue);public interface Shape public final sta
11、tic double PI=3.1416; public abstract void draw( Graphics g);6.4.3 接口的實(shí)現(xiàn)為了使用接口,要編寫實(shí)現(xiàn)接口的類。如果一個(gè)類實(shí)現(xiàn)一個(gè)接口,且實(shí)現(xiàn)接口中聲明的所有方法時(shí),那么這個(gè)類才是具體的類,否則它還是一個(gè)抽象的類。具體的類才能用來定義對象,抽象的類是不能實(shí)例化的。為了聲明一個(gè)類來實(shí)現(xiàn)一個(gè)接口,在類的聲明中要包括一條implements語句。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,因此可以在implements后面列出由類實(shí)現(xiàn)的接口系列,這些接口以逗號分隔。class ClassName extends ParentClass implement
12、s interface1,interface2 /接口中方法的實(shí)現(xiàn)6.4.4 接口的程序設(shè)計(jì)舉例下面舉例說明接口的使用。該例子中各類之間的層次關(guān)系如圖6-1,僅僅區(qū)別在于用接口Shape替代了抽象超類Shape。例6-4接口程序設(shè)計(jì)示例public interface Shape /聲明了Shape接口 public double getArea(); /聲明getArea方法 public double getVolume(); /聲明getVolume方法 public String getName(); /聲明getName方法Shape類的層次結(jié)構(gòu)6.5 final方法和final類
13、常量: 變量聲明為final,說明該變量是常量,不能在聲明后進(jìn)行修改,并且在聲明時(shí)必須對它進(jìn)行初始化。final方法:方法的聲明中有final。子類不能重載超類中聲明為final的方法。因?yàn)樽宇惒豢赡苤剌dprivate方法,所以聲明為private的方法隱式地為final方法。聲明為static的方法也隱式地為final方法,因?yàn)橹荒苤剌d非靜態(tài)方法。final類:類的聲明中包含final。 final類為不能為超類。final類中所有方法都隱式地為final方法。String類是final類的一個(gè)例子。不能擴(kuò)展該類,使用字符串的程序可以調(diào)用String對象在Java API中指定的函數(shù)。將類聲
14、明為final還可以防止程序員創(chuàng)建繞過安全限制的子類。6.6 嵌套類 6.6.1 內(nèi)部類的概念6.6.2 內(nèi)部類的聲明6.6.3 匿名內(nèi)部類聲明6.6.4 嵌套類的程序設(shè)計(jì)舉例6.6.1 內(nèi)部類的概念嵌套在其它類里面的類稱為內(nèi)部類(inner class)。外層的類成為外部類(outer class).內(nèi)部類主要用于事件處理。6.6.2 內(nèi)部類的聲明內(nèi)部類的聲明格式如下:修飾符 class outerClass修飾符 class innerClass例子6-5 內(nèi)部類使用的例子 TestWindow.java 程序的顯示界面使用javax.swing包中的JFrame類生成。定義擴(kuò)展JFram
15、e的子類TestWindow. 程序運(yùn)行輸出結(jié)果如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class TestWindow extends JFrame private JLabel aLabel; private JTextField aField, displayField; private JButton computeButton; / set up GUI public TestWindow() / call JFrame constructor to set title bar
16、string super( 內(nèi)部類的使用:計(jì)算一個(gè)數(shù)的平方 ); / use inherited method getContentPane to get windows content pane Container container = getContentPane(); container.setLayout( new FlowLayout() ); / change layout aLabel = new JLabel( Input a: ); aField = new JTextField( 10 ); container.add( aLabel ); container.add(
17、aField ); / set up displayField displayField = new JTextField( 30 ); displayField.setEditable( false ); container.add( displayField ); / set up computeButton computeButton = new JButton( Compute ); container.add( computeButton ); / create an instance of inner class ActionEventHandler ActionEventHand
18、ler handler = new ActionEventHandler(); computeButton.addActionListener( handler ); / end constructorpublic static void main( String args ) TestWindow window = new TestWindow(); window.setSize( 400, 140 ); window.setVisible( true ); / end main/ inner class declaration for handling JButton events pri
19、vate class ActionEventHandler implements ActionListener / method to handle action events public void actionPerformed( ActionEvent event ) String a=aField.getText( ); /取用戶輸入的字符串?dāng)?shù) int ai=Integer.parseInt(a); /轉(zhuǎn)換成整型值 ai=ai*ai; /計(jì)算其平方 String b=String.valueOf(ai); /整型值轉(zhuǎn)換成字符串 displayField.setText( The squ
20、are of +a+ is: + b ); / end method actionPerformed / end inner class ActionEventHandler / end class TestWindow /abstract method 在組件上打回車鍵激發(fā)ActionEvent事件,調(diào)用actionPerformed方法的執(zhí)行例子: / TestWindow1.javaprivate class ActionEventHandler implements ActionListener / method to handle action events public void
21、actionPerformed( ActionEvent event ) if ( event.getSource() = exitButton ) System.exit( 0 ); / terminate the application / user pressed Enter key in hourField else if ( event.getSource() = aField ) String a=event.getActionCommand() ; int ai=Integer.parseInt(a); ai=ai*ai; String b=String.valueOf(ai);
22、 displayField.setText( The square of a is: + b ); / end method actionPerformed / end inner class ActionEventHandlerevent.getSource():返回用戶正在交互的GUI組件名event.getActionCommand():返回用戶正在交互的GUI組件的內(nèi)容/abstract method 在組件上打回車鍵激發(fā)ActionEvent事件,調(diào)用actionPerformed方法的執(zhí)行6.6.3 匿名內(nèi)部類聲明匿名內(nèi)部類:是指定義的內(nèi)部類沒有類名,所以當(dāng)程序中使用匿名內(nèi)部類時(shí),
23、在定義匿名內(nèi)部類的地方創(chuàng)建該類的一個(gè)對象。匿名內(nèi)部類的聲明格式如下:new InterfaceName() /define inner class例子: TestWindow2.java (新)aField.addActionListener( /register aField event handler new ActionListener() /anonymous inner class / method to handle action events public void actionPerformed( ActionEvent event ) String a=event.getAc
24、tionCommand() ; int ai=Integer.parseInt(a); ai=ai*ai; String b=String.valueOf(ai); displayField.setText( The square of a is: + b ); / end method actionPerformed /end of anonymous inner class ); /end call to addActionListener exitButton.addActionListener( /register exitButton event handler new Action
25、Listener() /anonymous inner class / method to handle action events public void actionPerformed( ActionEvent event ) System.exit( 0 ); / end method actionPerformed /end of anonymous inner class ); /end call to addActionListener6.6.4 嵌套類的程序設(shè)計(jì)舉例該程序包含兩個(gè)文件Time.java和TimeTestWindow.java。Time.java文件定義了一個(gè)Tim
26、e類。TimeTestWindow.java文件中定義了一個(gè)內(nèi)部類ActionEventHandler和一個(gè)匿名內(nèi)部類。通過內(nèi)部類和匿名內(nèi)部類來處理用戶對時(shí)間的設(shè)置事件。在聲明和使用嵌套類時(shí),應(yīng)該注意以下事項(xiàng):(1)包含嵌套類的類在編譯時(shí),將為每個(gè)類產(chǎn)生單獨(dú)的.class文件。嵌套類文件名為OuterClassName$InnerClassName.class。匿名內(nèi)部類的文件名為OuterClassName$#.class,#從1開始,編譯時(shí),每遇到一個(gè)匿名內(nèi)部類,#遞增1。(2)帶有名稱的內(nèi)部類可以聲明為public、protected、包訪問或private,并且它們的使用限制與其他類成員相同。(3)內(nèi)部類能以O(shè)uterClassName.this的形式訪問其外部類的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年“新九論”學(xué)習(xí)心得體會例文(3篇)
- 2025年湖南貨運(yùn)從業(yè)資格證新政
- 2025年濰坊b2貨運(yùn)資格證多少道題
- 二零二五版籃球場地租賃及賽事門票銷售合同3篇
- 2025版體檢服務(wù)信息化建設(shè)合作合同協(xié)議2篇
- 2024跨國公司研發(fā)中心合作合同
- 二零二五年度城市綜合體消防安全管理代理服務(wù)合同3篇
- 二零二五年度合同擔(dān)保制度標(biāo)準(zhǔn)合同范本匯編3篇
- 2025版天然氣發(fā)電機(jī)組購銷合同范本3篇
- 2025年度個(gè)人對公司借款及稅收優(yōu)惠合同規(guī)范4篇
- 無人化農(nóng)場項(xiàng)目可行性研究報(bào)告
- 《如何存款最合算》課件
- 社區(qū)團(tuán)支部工作計(jì)劃
- 拖欠工程款上訪信范文
- 2024屆上海市金山區(qū)高三下學(xué)期二模英語試題(原卷版)
- 《wifi協(xié)議文庫》課件
- 《好東西》:女作者電影的話語建構(gòu)與烏托邦想象
- 一年級下冊數(shù)學(xué)口算題卡打印
- 2024年中科院心理咨詢師新教材各單元考試題庫大全-下(多選題部分)
- 真人cs基于信號發(fā)射的激光武器設(shè)計(jì)
- 2024年國信證券招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論