版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、新型軟件開發(fā)原理與工具 第一篇 Java,主講:顧曦 電話Email:guxi 武漢科技大學 機械自動化學院 2015,第六講 多態(tài),0、漸進式開發(fā),問題域 描述,解域 步驟,目標,計劃,問題分解,細節(jié)與處理,分析與設計:由抽象到具體,及擴展,運行:具體問題具體解決,漸進式(迭代式)開發(fā)符合人們認識和處理事物時的習慣。,結合已有,Java的支撐技術,組合與繼承 Object 抽象類、接口 運行時類型識別 final,1、組合與繼承,1.0 組合,將對象引用置于新的class中,public class arrTest private score S=new score
2、(); ,arrTest,S,1.1 繼承,從抽象到具體,使對象更有層次,提高代碼的可重用性 子類從父類中繼承方法和屬性 子類可以定義新的屬性和方法。,class childClass extends parentClass /body ,示例,public class Person public String name; public String getName() return name; public class Employee extends Person public int employeeNumber; public int getEmployeeNumber() retur
3、n employeeNumber; public class Manager extends Employee public String responsibilities; public String getResponsibilities() return responsibilities; ,類定義,測試( InhtTest ),public class InhtTest public static void main(String args) Employee li = new Employee(); = Li Ming; li.employeeNumber = 123
4、456; System.out.println(li.getName(); System.out.println(li.getEmployeeNumber(); Manager he = new Manager(); = He Xia; he.employeeNumber = 543469; he.responsibilities = Internet project; System.out.println(he.getName(); System.out.println(he.getEmployeeNumber(); System.out.println(he.getResp
5、onsibilities(); ,設置父類屬性 調用父類方法,,結果,上例Person中增加一個私有屬性: private sex; 可以在InhtTest中用 li. sex = “女”方式賦值和取值嗎? 演示 結論: 子類不能直接訪問從父類中繼承的私有屬性及方法,但可使用公有(及保護)方法進行訪問,1.2 重寫(overriding),概念:子類重新定義從父類繼承來的屬性及方法,父類的屬性和方法則被隱藏和覆蓋。 即子類定義了與父類同名的屬性或方法的。,class A1 int x = 2; int doplus() class B1 extends A1 int x=100; int do
6、plus() ,13,子類聲明了與父類同樣(返回類型,方法名稱,參數(shù)的個數(shù)及類型)的方法。 重寫的訪問權限可以比被覆蓋的寬松,但是不能更為嚴格 重寫的應用場合 子類中實現(xiàn)與父類相同的功能,但采用不同的算法或公式 在名字相同的方法中,要做比父類更多的事情 在子類中需要取消從父類繼承的方法 當子類執(zhí)行它自己聲明的方法時,所操作的就是它自己聲明的變量;調用從父類繼承的方法,則操作的是從父類繼承的屬性。,方法的重寫,14,必須重寫的方法 子類必須覆蓋父類中的抽象方法,否則子類自身也成為抽象類. 不能重寫的方法 基類中聲明為final的終結方法 基類中聲明為static 的靜態(tài)方法 在子類中使用被覆蓋的
7、屬性或方法 super.屬性 super.方法();,重寫的注意事項,示例(A1/B1),public class A1 int x = 2; int doPlus() x=x+2; return x; ,public class B1 extends A1 int x=100; int doPlus() x=x+2; x+= super.doPlus() + super.x ; return x; public static void main(String args) B1 b=new B1(); System.out.println( b.doPlus() ); ,16,組合與繼承,“包
8、含”關系用組合來表達 如果在新類內部使用現(xiàn)有類的特性,通常應選擇組合。 “屬于”關系用繼承來表達 取得一個現(xiàn)成的類,并制作它的一個特殊版本。通常,這意味著我們準備使用一個常規(guī)用途的類,并根據特定需求對其進行定制,2、Object 類,18,2.1 Object 類,Java程序中所有類的直接或間接父類 Object類定義了所有對象必須具有的狀態(tài)和行為: public final Class getClass() 獲取當前對象所屬的類信息,返回Class對象 public String toString() 返回當前對象本身的有關信息,按字符串對象返回 public boolean equals
9、(Object obj) 比較兩個對象是否是同一對象,是則返回true protected Object clone( ) 生成當前對象的一個拷貝,并返回這個復制對象 public int hashCode() 返回該對象的哈希代碼值 protected void finalize() throws Throwable 定義回收當前對象時所需完成的資源釋放工作,19,兩個對象具有相同的類型,及相同的屬性值,則稱二者相等(equal) 如果兩個引用變量指向的是同一個對象,則稱這兩個變量(對象)同一(identical) 兩個對象同一,則肯定相等 兩個對象相等,不一定同一 比較運算符“=” 判斷的
10、是這兩個對象是否同一,Object類的相等和同一,20,示例:判斷兩個對象是否同一 public class Exam4_7 public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 123456, 100.00f); /b = a; if (a = b) System.out.println(YES); else System.out.println(NO); 運行的結果為“NO”,原因是使用等
11、號“=”判斷的是兩個對象是否同一,顯然a和b是兩個對象,21,所有類的該方法從Object繼承 用于檢查引用的相等性(檢查是否兩個引用是同一個內存中的對象), Object類中的 equals() 方法的定義如下: public boolean equals(Object x) return this = x; ,2.2 equals方法,22,當需要在實例中作其他比較時,需重寫該方法 比如:要判斷兩個對象各個屬性域的值是否相同 String類中已經重寫了Object類的Equals方法,以判別兩個字符串是否內容相同,equals方法的重寫,示例(equalsTest),重寫equals方法
12、目地:學號相同則equals。,public boolean equals (Object o) if(o instanceof student) student c = (student)o; Return studentNo= c.studentNo; else return false; ,24,final 方法,返回一個Class對象,用來代表對象隸屬的類。 通過Class 對象,你可以查詢Class對象的各種信息:比如它的名字,它的基類,它所實現(xiàn)接口的名字等。 void PrintClassName(Object obj) System.out.println(The Objects
13、 class is + obj.getClass().getName(); ,getClass方法,3、抽象類與接口,抽象類與接口的意義,包含抽象方法的類稱為抽象類,其本身不能實例化,只是為了繼承而定義的。 抽象類是類層次中較高層次的概括 抽象類包含抽象方法,也可以包括被它的所有子類共享的公共行為和公共屬性 強迫用戶生成更具體的實例,26,3.1 抽象類,代表一個抽象概念的類,不能實例化。 可包含常規(guī)類能夠包含的任何東西:構造方法,非抽象方法,屬性。 也可包含抽象方法,這種方法只有方法的聲明,而沒有方法的實現(xiàn),27,abstract class name abstract (.); . . .
14、 ,示例,可以將Person 類聲明為抽象類,28,抽象方法,語法:關鍵字abstract public abstract (.); 僅有方法頭,而沒有方法體 具體實現(xiàn)由當前類的不同子類在它們各自的類聲明中完成 抽象類可以包含抽象方法 目地:強迫子類完成指定的行為,規(guī)定其子類需要用到的“標準”行為,29,需注意的問題,一個抽象類的子類如果不是抽象類,則它必須為父類中的所有抽象方法書寫方法體,即重寫父類中的所有抽象方法 只有抽象類才能具有抽象方法,即如果一個類中含有抽象方法,則必須將這個類聲明為抽象類 除了抽象方法,抽象類中還可以包括非抽象方法,30,一個繪圖的例子,各種圖形都需要實現(xiàn)繪圖方法,
15、可在它們的抽象父類中聲明一個draw抽象方法 然后在每一個子類(extends)中重寫draw方法.,31,class Circle extends GraphicObject void draw() . . . class Rectangle extends GraphicObject void draw() . . . ,abstract class GraphicObject abstract void draw(); ,2.2 接口(interface),更進一步,所有方法都是抽象方法。用于創(chuàng)建有差別的或未知的或未指定的即插即用組件,interface Instrument5 int
16、i = 5; / 屬性為static ,多重繼承,Java是單根繼承體系 由于接口沒有任何實現(xiàn)細目,也就是說,接口不與任何存儲空間有關聯(lián),因此可以輕易合并多個接口,從而成為java的多重繼承(與C+的多重繼承比較)。,class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly public void swim() public void fly() ,4、運行時類型識別,4.1 運行時類型識別 (RTTI, Run-time type identification ),概念:編譯時并不知道數(shù)據類型,運行時確定對
17、象的真實類型。 編譯時 V.S. 運行時 編譯時類型 寫代碼時的預設類型 在程序的生命周期,編譯時類型不會因給定的實例而發(fā)生變化 運行時類型 編譯者無從知曉對象運行時類型,4.2 示例(edu.wust.RTTI. Shapes),public interface Shape void draw(); ,public class Circle implements Shape public void draw() System.out.println(Circle.draw(); ,public class Square implements Shape public void draw()
18、System.out.println(Square.draw(); ,public class Triangle implements Shape public void draw() System.out.println(Triangle.draw(); ,三個具體形狀,public class Shapes public static void main(String args) ArrayList s = new ArrayList(); s.add(new Circle(); s.add(new Square(); s.add(new Triangle(); for(Shape S:s
19、) S.draw(); ,輸出: Circle.draw() Square.draw() Triangle.draw(),測試,4.3 工廠模式,public class shapeFactory public static shapeCreator(int i) if (i=1) return new Circle(); else if (i=2) return new Square(); ,測試,public class factoryTest public static void main(String args) Shape c=shapeFactory.shapeCreator(1)
20、; c.draw(); ,4.4 Class 對象,每個類都有一個Class 對象 寫一個新類時,同時也會創(chuàng)建一個Class 對象(更恰當?shù)卣f,是保存在一個完全同名的.class 文件中) 在運行期,一旦我們想生成那個類的一個對象,用于執(zhí)行程序的Java 虛擬機(JVM)首先就會檢查那個類型的Class 對象是否已經載入。若尚未載入,JVM 就會查找同名的.class 文件,并將其載入。所以Java 程序啟動時并不是完全載入的,這一點與許多傳統(tǒng)語言都不同。 每個Class 只有在它需要的時候才會載入,而static 初始化工作是在類載入時執(zhí)行的。,Class c = null; try c =
21、 Class.forName(FancyToy); catch(ClassNotFoundException e) Class faces = c.getInterfaces(); for(int i = 0; i faces.length; i+)printInfo(facesi); Class cy = c.getSuperclass(); Object o = null; try o = cy.newInstance(); catch(InstantiationException e) catch(IllegalAccessException e) ,4.5 工廠模式2,public static Shape newShape(String sType) Shape s =null; try Class c = Class.forName(sType); /動態(tài)裝載類 s= (Shape)c.newInstance(); catch (Exception e) return null; ret
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)廢水零排放方案
- 建筑垃圾填埋場監(jiān)測與管理方案
- 城中村災害應急響應方案
- 道路施工過程中車輛管理方案
- 2026年食品藥品行業(yè)從業(yè)者食品安全法規(guī)知識練習
- 2026年教育行業(yè)崗位筆試專業(yè)知識集
- 2026年電腦網絡故障診斷網絡工程師必考專業(yè)知識題目集
- 2026年政府機構網絡安全策略制定與實施模擬題
- 縣情介紹教學課件
- 縣委決策流程培訓課件教學
- 2025福建省安全員C證考試(專職安全員)題庫附答案
- 中國話語體系中的國際傳播話語創(chuàng)新策略分析課題申報書
- 高標準基本農田建設項目監(jiān)理工作總結報告
- 2026中國電氣裝備集團有限公司高層次人才招聘筆試備考試題及答案解析
- 消防知識培訓宣傳課件
- 2025-2026學年通-用版英語 高一上學期期末試題(含聽力音頻答案)
- 2025年國家基本公共衛(wèi)生服務考試試題(附答案)
- 25秋蘇教三年級上冊數(shù)學期末押題卷5套(含答案)
- 局部晚期腫瘤免疫放療新策略
- 食品加工廠乳制品設備安裝方案
- 高考英語3500詞分類整合記憶手冊(含完整中文釋義)
評論
0/150
提交評論