《Java實用程序設計(西電版)第4章Java高級特性》由會員分享,可在線閱讀,更多相關《Java實用程序設計(西電版)第4章Java高級特性(68頁珍藏版)》請在裝配圖網上搜索。
1、1 第 4 章 Java 高級特性第 4 章 Java 高 級 特 性4.1 靜態(tài)變量、 方法與初始化程序塊4.2 final關鍵字與常量4.3 抽象類與接口4.4 枚舉類型4.5 內部類 2 第 4 章 Java 高級特性 4.1 靜 態(tài) 變 量 、 方 法 與 初 始 化 程 序 塊有些情況下,一方面,我們可能希望為某一個成員變量分配單一的存儲空間,而不需要考慮到底要創(chuàng)建多少個對象,甚至不需要創(chuàng)建任何對象。另一方面,我們可能還希望某個方法不跟任何對象實例相關聯(lián),不需要任何對象實例也能調用這個方法。通過static關鍵字可以實現(xiàn)這兩方面的需求。 3 第 4 章 Java 高級特性1. 靜 態(tài)
2、 變 量靜態(tài)變量指的是在類的成員變量聲明中帶有static關鍵字的變量。對于一個類,無論創(chuàng)建出多少個該類的實例對象,靜態(tài)變量都只占用一份存儲區(qū)域,這份存儲區(qū)域在虛擬機的方法區(qū)內(詳見附錄2)。static關鍵字不能應用于局部變量,只能應用于成員變量。 4 第 4 章 Java 高級特性 5 第 4 章 Java 高級特性 6 第 4 章 Java 高級特性2. 靜 態(tài) 方 法靜態(tài)方法指的是在類的成員方法聲明中帶有static關鍵字的方法。在第3.3節(jié)對this關鍵字的介紹中已經指出,在實例成員方法的內部存在一個表示“調用方法的那個對象”的引用。這個引用在方法內部由this關鍵字代表,而且它在靜
3、態(tài)方法中不存在。因此,我們也就能理解靜態(tài)方法的特點,靜態(tài)方法就是沒有this引用的方法。 7 第 4 章 Java 高級特性 8 第 4 章 Java 高級特性 9 第 4 章 Java 高級特性3. 靜 態(tài) 初 始 化 程 序 塊在類定義中,不屬于任何方法體且以static關鍵字修飾的語句塊稱為靜態(tài)語句塊。由于靜態(tài)語句塊中的語句常用來對靜態(tài)變量進行初始化,因而又稱為靜態(tài)初始化程序塊。 10 第 4 章 Java 高級特性 11 第 4 章 Java 高級特性 12 第 4 章 Java 高級特性4. 靜 態(tài) 數(shù) 據(jù) 的 初 始 化對靜態(tài)成員變量進行正確的初始化是類裝載器體系結構(附錄2)基本
4、功能的一部分。從程序設計的角度,我們需要知道,對一個類的靜態(tài)成員的顯式初始化,以及該類的所有靜態(tài)初始化程序塊都是在Java虛擬機裝載這個類的時候執(zhí)行的。當一個類的字節(jié)碼被從.class文件中裝載到Java虛擬機中(通常在虛擬機的方法區(qū)中)時,靜態(tài)成員變量的存儲空間就已經被開辟,這些初始化動作隨之完成,靜態(tài)成員的初始化也就完成了。 13 第 4 章 Java 高級特性 14 第 4 章 Java 高級特性 15 第 4 章 Java 高級特性 16 第 4 章 Java 高級特性 17 第 4 章 Java 高級特性 18 第 4 章 Java 高級特性5. 靜 態(tài) 方 法 的 重 寫從重寫規(guī)則
5、上講,Java語言要求子類不能把父類的靜態(tài)方法重寫為非靜態(tài),也不能把父類的非靜態(tài)方法重寫為靜態(tài),但子類可以定義與父類靜態(tài)方法的聲明相同的方法,如例4-6的mtd2()。 19 第 4 章 Java 高級特性 20 第 4 章 Java 高級特性 21 第 4 章 Java 高級特性 4.2 final關 鍵 字 與 常 量final關鍵字是Java中的常用關鍵字,用來表示類不能被繼承、變量的值不能更改、成員方法不能被重寫。 22 第 4 章 Java 高級特性1. 在 成 員 方 法 聲 明 中 使 用 final在成員方法的聲明中使用final關鍵字,目的是禁止任何子類重寫這個方法,這樣,在
6、繼承的過程中,該方法的行為就不會改變。 23 第 4 章 Java 高級特性2. 在 類 聲 明 中 使 用 final當在類聲明中使用final關鍵字時,表明不允許任何其他類繼承該類。由于final的類不允許被繼承,因而該類的方法也就無法被重寫(繼承是重寫的前提),因此,final類中的所有方法實際上都被隱含指定為final的。 24 第 4 章 Java 高級特性3. 在 變 量 和 方 法 參 數(shù) 中 使 用 final當一個成員變量或局部變量被聲明為final的,那么變量一旦被賦值就不能改變。對于基本類型的final變量,變量值不能改變。對于引用類型的final變量,一旦引用被初始化指
7、向一個對象實例,就無法再讓它指向另一個對象實例。但是,對象實例所包含的內容卻是可以更改的,Java也沒有提供任何使得對象實例作為整體恒定不變的途徑。對于數(shù)組類型的final變量,效果與引用類型的變量類似。 25 第 4 章 Java 高級特性 26 第 4 章 Java 高級特性 27 第 4 章 Java 高級特性 28 第 4 章 Java 高級特性 29 第 4 章 Java 高級特性 30 第 4 章 Java 高級特性 4.3 抽 象 類 與 接 口接口提供了一種將“做什么”與“怎么做”分離的手段。抽象類可以認為是介于普通的類與接口之間的一種中間狀態(tài)。 31 第 4 章 Java 高
8、級特性1. 抽 象 類在圖3-1(b)所示的例子中,創(chuàng)建“形狀”類型的目的可能不是使用它的行為,而是為它的所有子類創(chuàng)建一個統(tǒng)一的接口。不同子類可以用不同的方式表示此接口,這一接口表示了所有子類的共同部分和共通特征。 32 第 4 章 Java 高級特性所謂抽象方法,指的是只有方法聲明而沒有方法體的方法。抽象方法在聲明時必須加上關鍵字abstract,例如:abstract void f(); 33 第 4 章 Java 高級特性 34 第 4 章 Java 高級特性 35 第 4 章 Java 高級特性 36 第 4 章 Java 高級特性2. 接 口接口的直覺含義是:所有實現(xiàn)了接口的類的行為
9、都像接口所指定的那樣。因此,任何使用某個特定接口的代碼都知道應該調用該接口的哪些方法,而且也只需要知道這些即可??梢哉f,接口代表了使用類的客戶代碼與提供服務的類之間的協(xié)議。接口規(guī)定了類的行為的基本形式,而不涉及具體的實現(xiàn)細節(jié)。實現(xiàn)一個接口的類將具有接口所規(guī)定的行為。 37 第 4 章 Java 高級特性創(chuàng)建一個接口需要使用Interface關鍵字。接口的一般形式如下:public interface 接口名 extends 父接口列表 接口體 38 第 4 章 Java 高級特性接口體可以包含常量定義和方法定義兩部分。常量定義形如:類型 常量名=常量值;接口體中的方法定義形如:返回類型 方法名
10、(參數(shù)列表); 39 第 4 章 Java 高級特性 40 第 4 章 Java 高級特性 41 第 4 章 Java 高級特性 42 第 4 章 Java 高級特性在接口定義后,可能需要在某些情況下對接口進行擴展,即增加新的常量定義和方法聲明,例如,向例4-11的Shape1中加入move()方法:interface Shape1 void draw();void erase();String what();void move(); 43 第 4 章 Java 高級特性這種直接向接口中添加新的方法聲明的方式可能會產生問題:如果已經有一些類實現(xiàn)了原先的Shape1接口,那么添加move()方法
11、使得這些類由具體類變?yōu)榱顺橄箢?,要想?chuàng)建這些類型的對象實例,就必須在這些類中也實現(xiàn)move()方法,從而增加了開發(fā)復雜度且引入了不可靠性。一種可靠的方法是通過創(chuàng)建接口的子接口來實現(xiàn)對接口的擴展,例如:interface MovableShape extends Shape1 void move(); 44 第 4 章 Java 高級特性3. 多 重 繼 承接口的一個重要功能是幫助實現(xiàn)多重繼承。接口允許人們通過創(chuàng)建一個能夠被向上轉型為多種基類的類型,來實現(xiàn)一種類似多重繼承變種的特性。 45 第 4 章 Java 高級特性 圖4-1 Java的多重繼承方式 46 第 4 章 Java 高級特性 4
12、7 第 4 章 Java 高級特性 48 第 4 章 Java 高級特性 4.4 枚 舉 類 型 1. 枚 舉 類 型 的 概 念從J2SE 5.0開始,枚舉類型被引入Java語言中。這一語法在C語言和C+中早已具備,但Java提供的枚舉類型的功能更加完備。在引入枚舉類型之前,Java需要通過創(chuàng)建整型常量集來實現(xiàn)類似枚舉類型值的效果。在引入枚舉類型后,Java程序可以通過關鍵字enum將一組具名的值的有限集合創(chuàng)建為一種新的類型。 49 第 4 章 Java 高級特性一個枚舉類型的典型定義如下:public enum Grade FRESHMAN,SOPHOMORE,JUNIOR,SENIOR又
13、如 public enum Season SPRING,SUMMER,F(xiàn)ALL,WINTER 50 第 4 章 Java 高級特性使用枚舉類型時,往往要定義枚舉類型的變量,這個變量是引用類型,引用到某個枚舉常量的對象實例。例如:Grade grade= Grade.JUNIOR; 51 第 4 章 Java 高級特性2. 枚 舉 類 型 的 行 為枚舉類型隱含繼承java.lang.Enum類,因此無法再繼承其他的類。也由于這一繼承關系,編譯器在創(chuàng)建枚舉類型時會自動添加一些有用的行為。 52 第 4 章 Java 高級特性 53 第 4 章 Java 高級特性 54 第 4 章 Java 高級
14、特性 55 第 4 章 Java 高級特性3. 自 定 義 方 法 與 方 法 重 寫如果將枚舉類型看做一個類,那么可以向其中添加新的方法以及新的成員變量,甚至可以添加新的構造方法,這些成員變量和方法共同構成枚舉體。這樣,枚舉類型的一般形式就變?yōu)?public enum 枚舉類型名 implements 接口列表 枚舉常量定義; 枚舉體定義 56 第 4 章 Java 高級特性 57 第 4 章 Java 高級特性 58 第 4 章 Java 高級特性 4.5 內 部 類1. 內 部 類 的 創(chuàng) 建 和 使 用所謂內部類,是指定義在另一個類的內部的類。內部類的作用是將一些邏輯相關的類組織起來,
15、并控制位于內部的類的可見性。創(chuàng)建內部類的方式就是將類A的定義置于另一個類B的內部。這時,B稱為A的外包類,A稱為B的內部類。 59 第 4 章 Java 高級特性 60 第 4 章 Java 高級特性 61 第 4 章 Java 高級特性 62 第 4 章 Java 高級特性 63 第 4 章 Java 高級特性2. 局 部 內 部 類在一個方法或語句塊的作用域內創(chuàng)建的類稱為局部內部類。在方法和語句塊之外無法訪問局部內部類,方法的返回類型也不能是內部類,但可以是內部類的父類。這時,如果方法返回一個內部類的對象引用,那么會進行向上轉型。 64 第 4 章 Java 高級特性 65 第 4 章 J
16、ava 高級特性3. 匿 名 內 部 類匿名內部類的形式類似于在創(chuàng)建一個類的對象時給出對該類的定義。 66 第 4 章 Java 高級特性例 4-19 AnonymousInner.java: 匿 名 內 部 類 的 使 用 。 67 第 4 章 Java 高級特性 68 第 4 章 Java 高級特性在例4-19中,buildDescription()方法中定義了一個匿名內部類,該類以Description類作為父類。在繼承Description類的同時,該類還重寫了Description類的Print()方法。在新的Print()方法中,通過super關鍵字調用Description類的Print()方法,然后輸出一個字符串,該字符串包含從Description繼承來的desc成員,還包含字符串s2。匿名內部類調用默認的構造方法創(chuàng)建對象實例,由于父類Description只有一個帶參數(shù)的構造方法,因而匿名內部類通過參數(shù)列表傳入一系列適合的參數(shù)給Description的構造方法。由于Print()的調用是發(fā)生在buildDescription()之后,因而s2必須是final的才能被Print()正確訪問。