Java語言程序設計_抽象類和接口 (1)_第1頁
Java語言程序設計_抽象類和接口 (1)_第2頁
Java語言程序設計_抽象類和接口 (1)_第3頁
Java語言程序設計_抽象類和接口 (1)_第4頁
Java語言程序設計_抽象類和接口 (1)_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java Programming第7講 抽象類和接口1內 容抽象類通用超類對象的類型識別對象的類型轉換接口嵌套類2抽象類抽象類(abstract class)使用關鍵字abstract定義不能被實例化的類public abstract class Animal Animal aAnimal = new Animal();錯3抽象方法抽象方法(abstract method)聲明了,但沒有被實現(xiàn)的方法沒有方法體抽象類通過抽象方法為其子類定義公共接口遲早要派生出一個非抽象的子類,實現(xiàn)了全部抽象方法,從而生成該類型的對象抽象方法不能指定為private或static或final因為此類方法不能在子類

2、中重新定義,即不能被覆蓋public abstract class Animal public abstract void sound(); 4抽象類與抽象方法抽象類可以不包含抽象方法使用abstract就可以定義抽象類包含抽象方法的類一定是抽象類抽象方法可以是在自己內部聲明的抽象類的子類也可以是抽象類也可以是從超類繼承的抽象類的子類也可以不實現(xiàn)繼承的抽象方法5抽象類與多態(tài)從 類 的角度分離接口和實現(xiàn)基類定義公共接口子類實現(xiàn)該接口sound()Animalsound()Dogsound()Catsound()Duck定義了一個公共接口實現(xiàn)公共接口6通用超類通用超類java.lang.Objec

3、t是所有定義的類的超類不需要明確指定Object類型的變量可以存儲任何類型對象的引用Object obj;Object objArray;Object7Object的方法成員Object只有下面的方法成員被所有的類繼承public String toString() /返回描述對象的String對象public boolean equals(Object obj) /比較兩對象的引用public int hashCode() /計算對象的散列碼,并以int類型返回public final Class getClass() /返回一個Class對象,以識別對象的類public final voi

4、d notify() /喚醒一個與當前對象關聯(lián)的線程public final void notifyAll() /喚醒所有與當前對象關聯(lián)的線程public final void wait() /導致一個線程等待當前對象中發(fā)生的變化protected Object clone() /復制當前對象protected void finalize() /在銷毀對象時被調用,用于清理工作8Object的toString()方法toString()方法舉例注釋Animal的toString()方法Animal繼承Object的toString()方法編譯運行TestPolymorphism可以看到Obje

5、ct的toString()方法如何輸出對象Dog19821f對象的類名對象的散列碼9確定對象的類型Class類型的對象getClass()方法會返回一個Class類型的對象用來識別一個對象的類型class TryClass public static void main(String args) System.out.println(new Dog(小黑).getClass().getName(); Object str = A String; System.out.println(str.getClass().getName(); Dogjava.lang.String類Class的成員,返

6、回完整的類名(帶包名)Class對象返回對象實際對應的類10Class對象Class類型的對象在系統(tǒng)裝載程序(類文件)時自動為每個類創(chuàng)建Class對象不能自己創(chuàng)建Class對象,因為類Class沒有提供構造函數(shù)class TryClass public static void main(String args) throws ClassNotFoundException System.out.println(Dog.class); System.out.println(int.class); System.out.println(Integer.class.getName(); System.

7、out.println(Class.forName(java.lang.String); class Dogintjava.lang.Integerclass java.lang.String獲得類的Class對象 .class .class Class.forName()11Class對象利用Class對象檢測對象的類型每個類都有唯一的Class對象Animal pet = new Duck(“小鴨”);if (pet.getClass() = Duck.class) 兩者引用同一個對象12instanceof運算符利用instanceof運算符檢測對象的類型判斷一個對象是否是某一個類的實例

8、Spaniel obj = new Spaniel(小狗);if (obj instanceof Animal) System.out.println(該對象是Animal的實例); if (obj instanceof Dog) System.out.println(該對象是Dog的實例); if (obj instanceof Spaniel) System.out.println(該對象是Spaniel的實例); 該對象是Animal的實例該對象是Dog的實例該對象是Spaniel的實例13對象的復制用從Object繼承的方法clone()復制對象要求被復制對象的類允許被復制該類必須實現(xiàn)

9、Cloneable接口生成一個與當前對象類型相同的新的對象新對象中的每個成員域都設置成與當前對象對應的成員域相同的值如果成員域是引用類型,那么他所引用的對象并不被復制舉例讓類Dog實現(xiàn)Cloneable接口,使其對象可被復制public class Dog extends Animal implements Cloneable 14對象的復制舉例舉例定義類TryClone創(chuàng)建一個Dog對象調用該對象的Clone()方法復制一個Dog對象class TryClone public static void main(String args) throws CloneNotSupportedExce

10、ption Dog aDog = new Dog(白雪); System.out.println(創(chuàng)建了一個對象:n+aDog); Dog bDog = (Dog)aDog.clone(); System.out.println(復制了一個對象:n+bDog); 15對象的類型強制轉換可以把一個對象的類型強制轉換為另一種類型當前對象的實際類型和新類型必須位于相同的派生類層次結構中一個是另一個的超類AnimalCatDogDuckObjectSpaniel向上類型轉換向下類型轉換對象的引用16向上類型轉換向上類型轉換(upcasting)需要執(zhí)行多態(tài)的方法時,把對象的引用存儲在基類類型的變量中忽

11、略特定類型的細節(jié)把可能擁有多個子類的對象傳遞給方法編譯器會在必要時為對象自動插入強制類型轉換Spaniel aPet = new Spaniel(“白雪”);Animal theAnimal = (Animal)aPet;可以省略不寫17向下類型轉換向下類型轉換(downcasting)為了執(zhí)行特定類的方法擴展了類,打算向下類型轉換訪問擴展部分Java在運行時用instanceof進行類型轉換檢查要轉換到的類必須是該對象的實際類型或超類Dog aDog = (Dog)theAnimal;Dog是theAnimal對象的超類18對象的類型強制轉換舉例舉例修改類Duck的定義,增加方法layEgg

12、()該方法是Duck類特有的public class Duck extends Animal public void layEgg() System.out.println(下蛋); 19對象的類型強制轉換舉例舉例定義類TestCastclass TestCast public static void main(String args) Duck aDuck = new Duck(唐納, 美國鴨); Animal aPet = aDuck; aPet.layEgg(); /不能編譯 (Duck)aPet).layEgg();此處只能調用Animal中聲明的(多態(tài))方法20對象的類型強制轉換舉例

13、分析layEgg()sound()Animalsound()Dogsound()Catsound()DuckAnimal aPet;可以訪問Animal定義的公共接口(Duck)aPet).layEgg();可以訪問Duck定義的擴展接口擴展接口公共接口21使用final修飾符final此物不準動修飾數(shù)據(jù)成員以固定其值修飾方法成員以阻止被子類中的方法覆蓋修飾類以阻止派生出子類22接口接口(interface)接口聲明了一組方法,表示一個特定的公共接口這些方法都沒有定義方法體,即抽象的任何類都可以實現(xiàn)(implement)某個接口實現(xiàn)該接口的類要實現(xiàn)接口中的所有方法,即定義該方法的主體使用該接口

14、類型的變量來多態(tài)調用其中的方法舉例定義接口StockWatcher,股票觀察員聲明方法valueChanged(),某支股票的價格改變了public interface StockWatcher void valueChanged(String tickerSymbol, double newValue);23接口與抽象類接口好似一個純抽象類接口與抽象類的區(qū)別接口不能實現(xiàn)任何方法,而抽象類可以類可以實現(xiàn)許多接口,但只能有一個直接超類接口不是類層次結構的一部分,不相關的類可以實現(xiàn)相同的接口24定義接口定義接口存儲在.java文件中,編譯生成.class文件例如StockWatcher.java,

15、編譯后生成StockWatcher.classpublic interface StockWatcher /常量和方法的聲明接口的頭部接口的主體25接口的訪問屬性接口的訪問屬性public 可以被任何接口和類訪問空 可以被同一包中的接口和類訪問26接口的主體接口的主體包含所有方法和常量的聲明所有方法被隱式的聲明為 public和abstract類型常量被隱式的聲明為 public、static和final類型public interface StockWatcher String sunTicker = SUN; String oracleTicker = ORACLE; String cis

16、coTicker = CISCO; void valueChanged(String tickerSymbol, double newValue);不需要明確指定必須指定初值27接口的實現(xiàn)類實現(xiàn)接口使用關鍵字implements類繼承了接口聲明的常量類要么實現(xiàn)接口的所有方法,要么就是抽象類類必須為實現(xiàn)的方法指定public訪問屬性因為接口中的方法都是public的public class StockWatcherClass implements StockWatcher public void valueChanged(String tickerSymbol, double newValue)

17、 28接口的實現(xiàn)類實現(xiàn)多個接口類可以實現(xiàn)多個接口(Java的多重繼承)接口名用逗號隔開public class StockWatcherClassimplements StockWatcher, Cloneable 29接口的維護接口定義好之后,最好不要做修改一旦被修改,將使得已實現(xiàn)該接口的類無效可以通過創(chuàng)建新的接口來擴展public interface StockWatcher String sunTicker = SUN; String oracleTicker = ORACLE; String ciscoTicker = CISCO; void valueChanged(String t

18、ickerSymbol, double newValue); double currentValue(String tickerSymbol);public interface StockTracker extends StockWatcher double currentValue(String tickerSymbol);30接口的擴展接口的擴展在一個接口的基礎上定義新的接口派生擴展后的接口從原接口處獲得全部常量和方法接口的多重繼承一個接口可以繼承多個其他接口的成員注意:一個接口中聲明的方法與繼承的方法中如果兩個方法的簽名相同,那么其返回對象類型也必須相同。public interface

19、 MyStockWatcherextends StockWatcher, Cloneable 31接口的使用將接口作為類型使用定義一個新的接口,就是定義了一種新的類型能夠通過一組實現(xiàn)相同接口的類產(chǎn)生多態(tài)public class StockMonitor public void watchStock(StockWatcher watcher, String tickerSymbol, double delta) 一個對象有多種類型(名稱)類名:自身類,超類接口名:自身類實現(xiàn)的接口,超類實現(xiàn)的接口實現(xiàn)了StockWatcher接口的任何類的對象32接口的使用舉例舉例用接口RemoteControl

20、定義了一組家用電器應該具備的遙控操作定義類TV、VCR分別表示電視機和錄像機讓類TV和VCR實現(xiàn)接口RemoteControl那么就可以定義RemoteControl類型的變量rc引用TV和VCR對象變量rc類似一個通用遙控器,用它可以對TV和VCR對象(或任何實現(xiàn)了RemoteControl接口的類的對象)進行遙控操作33嵌套類嵌套類(nested class)在另一個類的內部定義的類嵌套類的內部還可以定義類舉例嵌套類InSide的類文件為OutSide$InSide.classpublic class OutSide public class InSide 頂層類:不是嵌套類。它也是InS

21、ide的外部類,可以直接引用類名InSide。是其外部類的成員??梢灾苯釉L問外部類中定義的成員。其外部引用名是: OutSide.InSide34非靜態(tài)嵌套類的對象創(chuàng)建非靜態(tài)嵌套類的對象在外部類的外部public class TryNestedClass public static void main(String args) OutSide outer = new OutSide(); /error: OutSide.InSide inner = new OutSide.InSide(); OutSide.InSide inner = outer.new InSide(); 沒有生成InSide對象生成與OutSide對象outer相關聯(lián)的InSide對象35非靜態(tài)嵌套類的對象創(chuàng)建非靜態(tài)嵌套類的對象在外部類的內部不能在外部類的靜態(tài)方法中使用關于非靜態(tài)嵌套類不能定義靜態(tài)成員非靜態(tài)類對象一定與一個外部類對象相關聯(lián)被稱為內部類(inner class)InSide inner = new InSide();36靜態(tài)嵌套類靜態(tài)嵌套類用static可以定義靜態(tài)成員在靜態(tài)方法中不能訪問外部類的非靜態(tài)成員public class OutSide public static cl

溫馨提示

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

評論

0/150

提交評論