




已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第 5 章 繼承與多態(tài),主要內(nèi)容: 繼承 多態(tài) 接口和包,繼 承,繼承:子類利用父類中定義的方法和變量就像它們屬于子類本身一樣; (包括父類的私有屬性、私有方法,但不可見); 單重繼承:一個類只能有一個父類(Java、C#、VC+); 多重繼承:一個類可以有多個父類(標準C+);,圖 5-1 各種電話卡類及其間繼承關(guān)系,繼承的 優(yōu)點、目的,優(yōu)點:更有效地組織程序結(jié)構(gòu),明確類間關(guān)系; 目的:使程序結(jié)構(gòu)清晰,提高開發(fā)效率,降低編碼和維護工作量。,派 生 子 類,例5-1PhoneCard 類及其派生子類 abstract class PhoneCard abstract class None_Number_PhoneCard extends PnoneCard abstract class Number_PhoneCard extends PnoneCard 問題:第二行、第三行的類為什么是抽象類,能否去掉 abstract 關(guān)鍵字?,域 的 繼 承,子類繼承(擁用)父類的所有非私有(P9192頁各類擁有的域);,域 的 隱 藏,子類重新定義一個從父類繼承來的域變量(可以具有不同類型),稱為域的隱藏(指新定義的域變量隱藏了父類的同名變量)。 舉例:例5-2的簡化版;,abstract class A double m_a; abstract double sub(); double get() return m_a; class B extends A double m_a; double sub() m_a -=1; return m_a; double super_sub() super.m_a -=1; return super.m_a; ,public class Application1 public static void main(String args) B b = new B(); b.m_a = 100; System.out.println(b.get(); System.out.println(b.sub(); System.out.println(b.super_sub(); 輸出為: 0 99 -1;,b.m_a = 100; b.get() b.sub() b.super_sub(),問題:以下程序訪問的是父類還是子類?,要點: 1)被隱藏的父類域在子類對象中仍占有獨立的內(nèi)存空間; 2)子類可通過 super 關(guān)鍵字或繼承自父類的方法訪問或處理繼承自父類的域。,方法的 繼承 與 覆蓋,繼承:子類可繼承父類的所有非私有方法; 覆蓋(Override):子類重新定義與父類同名的方法(指非靜態(tài)方法,要求方法名、返回值和參數(shù)列表完全相同); 如果子類的非抽象方法覆蓋了父類的抽象方法,稱子類“實現(xiàn)”了父類的抽象方法。,abstract class A double m_a; abstract double sub(); double get() return m_a; class B extends A double m_a; double sub() m_a -=1; return m_a; double super_sub() super.m_a -=1; return super.m_a; double get() return m_a; ,/測試 public class Application1 public static void main (String args) B b = new B(); b.m_a = 100; System.out.println(b.get(); 輸出為:100,例域的隱藏、方法覆蓋、方法重載 class Point / 父類 int x = 0, y = 0 ; void move(int dx, int dy) x += dx ; y += dy ; class RealPoint extends Point / 子類 float x = 0.0f, y = 0.0f ; / 域的隱藏 void move(int dx, int dy) / 方法的覆蓋 System.out.println(“subclasss move“); move(float)dx, (float)dy); void move(float dx, float dy) / 方法的重載 x += dx; y += dy; ,public class Application1 public static void main(String args) RealPoint rp = new RealPoint(); System.out.println(“x:“ + rp.x + “ y:“ + rp.y); rp.move(1,1); System.out.println(“x:“ + rp.x + “ y:“ + rp.y); 輸出: x:0.0 y:0.0 subclasss move x:1.0 y:1.0,this,對當前對象的引用; 作用:1)調(diào)用當前對象的方法或域; 如:class Point int x = 0, y = 0 ; void move(int x, int y) this.x += x ; this.y += y ; 2)作為參數(shù)傳遞給其他對象或方法 如: input . addActionListener ( this ) ;,super 對當前對象的父類對象的引用; 作用:1)在構(gòu)造函數(shù)定義中用 super(參數(shù)列表) 調(diào)用父類的構(gòu)造函數(shù); public class apple extends fruits public apple(int price) super(price); 2)用super . 域名 引用父類的域; 例5-5 testSuper.java(第100頁) 問題:第六行:my200.balance = 50是訪問的哪一個類的balance? 第七行:my200.getBalance()是訪問的父類還是子類的函數(shù)?訪問的是父類還是子類的變量?,class SuperClass int x; . class SubClass extends SuperClass int y; . ,父類對象與子類對象的轉(zhuǎn)換,Public class UseSuperSub SuperClass sc,sc_ref; SubClass sb,sb_ref; sc = new SuperClass(); sb = new SubClass(); sc_ref = sb; / 對還是錯? / 父類引用可以指向子類對象; sb_ref = sc; / 對還是錯? / 錯,子類對象不能賦給父類引用;,class SuperClass int x; . ,class SubClass extends SuperClass int y; . ,int a = sc_ref.x; / 對或錯? / 對,以子類對象作為實際參數(shù)訪問父類變量; sb_ref = (SubClass) sc_ref;/對或錯? / 對,父類引用強制轉(zhuǎn)換成子類引用; sb_ref = (SubClass)sc; / 對或錯? / 編譯通過,但接著用sb_ref.y則錯; ,class SuperClass int x; . ,class SubClass extends SuperClass int y; . ,父類對象與子類對象的轉(zhuǎn)換 子類對象可以看作是其父類的對象; 父類對象不能被當作是其某一個子類的對象; 如果某個方法的形式參數(shù)是父類對象,可以使用子類對象作為實際參數(shù); 如果父類對象引用指向的實際是子類對象,可以采用強制類型轉(zhuǎn)換將父類對象引用轉(zhuǎn)化成子類對象引用;,引例: 函數(shù)功能:取絕對值(每一種類型對應(yīng)一個函數(shù)) 整數(shù): int i_abs(int i); 單精度: float f_abs(float f); 雙精度: double d_abs(double d); 面向?qū)ο螅?Math.abs( int i ); Math.abs( float f ); Math.abs( double d );,多態(tài) ( polymophism ),多態(tài) ( polymophism ),指的是一個程序(在同一個類或不同類中)包含多個名稱相同、但功能或具體實現(xiàn)不同的方法; 主要通過方法的覆蓋(不同類)、重載(同一類)實現(xiàn);,電話卡 域:剩余金額 方法:撥打電話 查詢金額,無卡號電話卡 域:電話機型號 方法:獲得 電話機型號,有卡號電話卡 域:卡號,密碼, 接入號碼,接通 方法:登錄交換機,IP 卡 域:有效時間 方法:撥打電話,200 卡 域:附加費用 方法:撥打電話 修改密碼,電話 IC 卡 方法:撥打電話,電話磁卡 域:使用地域 方法:撥打電話,繼承,繼承,繼承,繼承,繼承,繼承,撥打電話函數(shù)在各子類中得到覆蓋,同一個類中定義多個同名的方法(條件:形式參數(shù)個數(shù)、類型和順序不同); public class MyClass public static int abs(int p) return Math.abs(p); public static long abs(long p) return Math.abs(p); public static double abs(double p) return Math.abs(p); ,重載(overload),優(yōu)點: 1)提高程序的簡潔性; 2)通過接口操縱對象; P104/例5-6TestOverride.java 問題:這個例子是重載還是覆蓋?在哪兩個函數(shù)體現(xiàn)? P51 / boolean performDial() P63/ boolean performDial(long cn, int pass),構(gòu)造函數(shù) 重載,同一類中存在多個具有不同參數(shù)列表的構(gòu)造函數(shù); 例:P107;(參數(shù)的數(shù)目、類型、順序不同) 例:P108;(構(gòu)造函數(shù)的互相調(diào)用) 目的:滿足對象的不同初始化需求。,構(gòu)造函數(shù) 繼承,子類構(gòu)造函數(shù)總是先調(diào)用父類的構(gòu)造函數(shù); 原則: 子類繼承父類無參構(gòu)造函數(shù); 子類未顯式地調(diào)用父類的構(gòu)造函數(shù),實則先調(diào)用父類的無參數(shù)構(gòu)造函數(shù); 子類顯示調(diào)用父類的帶參數(shù)構(gòu)造函數(shù)(第一句);,設(shè)計總結(jié) 不定義構(gòu)造函數(shù)(缺省構(gòu)造函數(shù)); 定義構(gòu)造函數(shù),并調(diào)用父類的帶參構(gòu)造函數(shù); D200_Card( long cn, int pass, double b, double a) super(cn, pass, b);/必須是第一句 additoryFee = a; ,重載,實現(xiàn)多層次對象初始化; D200_Card( long cn, int pass, double a) D200_Card( long cn, int pass, double b, double a) P110/例5-7 ConstructorOverride.java問題:共調(diào)用了幾個構(gòu)造函數(shù)?,包 package 包名; 例 package A ; package A.B ; 作用: 默認的訪問規(guī)則:在同一程序包中出現(xiàn)的類才可以直接使用它的數(shù)據(jù)和方法。 組織和管理文件的方式:用以存放該包中所有類文件(. Class);,包 的引用,1) 使用包名、類名前綴 如:class myApplet extends java.applet.Applet; java.awt.Button btn = new java.awt.Button(“啟動”) ; 注:此方式是完整引用形式,但程序書寫不簡潔; 2) 加載需要使用的類(以后的程序可采用省略的書寫方式) 如: import java.applet.Applet; class myApplet extends Applet;,3) 加載整個包 如: import java . applet .* ; 假設(shè)有兩個類:java.awt.Button、 java.sw.Button; java.awt.Button btn = new java.awt.Button() ; java.sw.Button btn = new java.sw.Button() ; import java.awt.Button; Button btn = new Button() ;,CLASSPATH 環(huán)境變量 作用:指明所有缺省的類字節(jié)碼文件路徑(實驗一); (1)通過 autoexec.bat 文件或 DOS 命令設(shè)置,如: set CLASSPATH= . ; c:jdk1.2lib ; c:jdk1.2lib.classes.zip ; 其中,用“;”號隔開的各部分就是可能的路徑。,5.7 接口(interface) 定義:用來實現(xiàn)若干特定功能的一組對外接口和規(guī)范; 屬性:只能是常量; 方法:只能是抽象方法; 目的:實現(xiàn)多重繼承;,聲明 接口 接口的特征:由常量和抽象方法組成的特殊類; 語法: public interface 接口名 extends 父接口名列表 / 常量域聲明 public static final 域類型 域名 = 常量表; / 抽象方法聲明 public abstract native 返回值 方法名(參數(shù)列表)throw 異常列表;,P100:系統(tǒng)接口 DataInput 的定義: public interface java.io.DataInput public abstract boolean readBoolean ( ); public abstract byte readByte ( ); public abstract char readChar ( ); public abstract Double readDouble ( ); ,P119:A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南2025年湖南省市場監(jiān)督管理局所屬事業(yè)單位高層次人才招聘筆試歷年參考題庫附帶答案詳解
- 安徽電氣工程職業(yè)技術(shù)學院《機電系統(tǒng)設(shè)計》2023-2024學年第二學期期末試卷
- 阜新高等專科學?!都垬釉O(shè)計與工藝(三)》2023-2024學年第二學期期末試卷
- 天津商業(yè)大學《小學課堂組織與管理》2023-2024學年第二學期期末試卷
- 麗江師范高等??茖W?!渡锘瘜WG》2023-2024學年第二學期期末試卷
- 濮陽醫(yī)學高等專科學?!豆こ誊浖?yīng)用》2023-2024學年第二學期期末試卷
- 宜昌科技職業(yè)學院《舞蹈基礎(chǔ)訓練》2023-2024學年第二學期期末試卷
- 遼寧輕工職業(yè)學院《軟件文檔寫作》2023-2024學年第二學期期末試卷
- 上海中醫(yī)藥大學《漢俄翻譯》2023-2024學年第二學期期末試卷
- 廣州松田職業(yè)學院《軟件設(shè)計綜合訓練》2023-2024學年第二學期期末試卷
- 成都設(shè)計咨詢集團有限公司2025年社會公開招聘(19人)筆試參考題庫附帶答案詳解
- 2024年湖南省長沙市中考英語真題(原卷版)
- 2025年高三高考沖刺主題教育班會:《高三考前心理調(diào)適指南:減壓賦能 輕松備考》-2024-2025學年高中主題班會課件
- 九一八事變課件
- 小學一年級數(shù)學20以內(nèi)進位、退位加減法口算
- 2024年全國高中數(shù)學聯(lián)賽(浙江預賽)試題含參考答案
- 2024年浙江省中考英語試題卷(含答案解析)
- MOOC 理解馬克思-南京大學 中國大學慕課答案
- GB/T 5169.5-2020電工電子產(chǎn)品著火危險試驗第5部分:試驗火焰針焰試驗方法裝置、確認試驗方法和導則
- 說明書hid500系列變頻調(diào)速器使用說明書s1.1(1)
- 抗腫瘤藥物常見不良反應(yīng)的防治實用教案
評論
0/150
提交評論