Java 實(shí)用程序設(shè)計(jì)(西電版)第4章 Java高級(jí)特性_第1頁
Java 實(shí)用程序設(shè)計(jì)(西電版)第4章 Java高級(jí)特性_第2頁
Java 實(shí)用程序設(shè)計(jì)(西電版)第4章 Java高級(jí)特性_第3頁
Java 實(shí)用程序設(shè)計(jì)(西電版)第4章 Java高級(jí)特性_第4頁
Java 實(shí)用程序設(shè)計(jì)(西電版)第4章 Java高級(jí)特性_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、,第 4 章 Java 高級(jí)特性,4.1 靜態(tài)變量、 方法與初始化程序塊 4.2 final關(guān)鍵字與常量 4.3 抽象類與接口 4.4 枚舉類型 4.5 內(nèi)部類,4.1 靜態(tài)變量、方法與初始化程序塊有些情況下,一方面,我們可能希望為某一個(gè)成員變量分配單一的存儲(chǔ)空間,而不需要考慮到底要?jiǎng)?chuàng)建多少個(gè)對(duì)象,甚至不需要?jiǎng)?chuàng)建任何對(duì)象。另一方面,我們可能還希望某個(gè)方法不跟任何對(duì)象實(shí)例相關(guān)聯(lián),不需要任何對(duì)象實(shí)例也能調(diào)用這個(gè)方法。通過static關(guān)鍵字可以實(shí)現(xiàn)這兩方面的需求。,1. 靜態(tài)變量靜態(tài)變量指的是在類的成員變量聲明中帶有static關(guān)鍵字的變量。對(duì)于一個(gè)類,無論創(chuàng)建出多少個(gè)該類的實(shí)例對(duì)象,靜態(tài)變量都只占

2、用一份存儲(chǔ)區(qū)域,這份存儲(chǔ)區(qū)域在虛擬機(jī)的方法區(qū)內(nèi)(詳見附錄2)。static關(guān)鍵字不能應(yīng)用于局部變量,只能應(yīng)用于成員變量。,2. 靜態(tài)方法靜態(tài)方法指的是在類的成員方法聲明中帶有static關(guān)鍵字的方法。在第3.3節(jié)對(duì)this關(guān)鍵字的介紹中已經(jīng)指出,在實(shí)例成員方法的內(nèi)部存在一個(gè)表示“調(diào)用方法的那個(gè)對(duì)象”的引用。這個(gè)引用在方法內(nèi)部由this關(guān)鍵字代表,而且它在靜態(tài)方法中不存在。因此,我們也就能理解靜態(tài)方法的特點(diǎn),靜態(tài)方法就是沒有this引用的方法。,3. 靜態(tài)初始化程序塊在類定義中,不屬于任何方法體且以static關(guān)鍵字修飾的語句塊稱為靜態(tài)語句塊。由于靜態(tài)語句塊中的語句常用來對(duì)靜態(tài)變量進(jìn)行初始化,因

3、而又稱為靜態(tài)初始化程序塊。,4. 靜態(tài)數(shù)據(jù)的初始化對(duì)靜態(tài)成員變量進(jìn)行正確的初始化是類裝載器體系結(jié)構(gòu)(附錄2)基本功能的一部分。從程序設(shè)計(jì)的角度,我們需要知道,對(duì)一個(gè)類的靜態(tài)成員的顯式初始化,以及該類的所有靜態(tài)初始化程序塊都是在Java虛擬機(jī)裝載這個(gè)類的時(shí)候執(zhí)行的。當(dāng)一個(gè)類的字節(jié)碼被從.class文件中裝載到Java虛擬機(jī)中(通常在虛擬機(jī)的方法區(qū)中)時(shí),靜態(tài)成員變量的存儲(chǔ)空間就已經(jīng)被開辟,這些初始化動(dòng)作隨之完成,靜態(tài)成員的初始化也就完成了。,5. 靜態(tài)方法的重寫從重寫規(guī)則上講,Java語言要求子類不能把父類的靜態(tài)方法重寫為非靜態(tài),也不能把父類的非靜態(tài)方法重寫為靜態(tài),但子類可以定義與父類靜態(tài)方法的

4、聲明相同的方法,如例4-6的mtd2()。,4.2 final關(guān)鍵字與常量final關(guān)鍵字是Java中的常用關(guān)鍵字,用來表示類不能被繼承、變量的值不能更改、成員方法不能被重寫。,1. 在成員方法聲明中使用final在成員方法的聲明中使用final關(guān)鍵字,目的是禁止任何子類重寫這個(gè)方法,這樣,在繼承的過程中,該方法的行為就不會(huì)改變。,2. 在類聲明中使用final當(dāng)在類聲明中使用final關(guān)鍵字時(shí),表明不允許任何其他類繼承該類。由于final的類不允許被繼承,因而該類的方法也就無法被重寫(繼承是重寫的前提),因此,final類中的所有方法實(shí)際上都被隱含指定為final的。,3. 在變量和方法參數(shù)

5、中使用final當(dāng)一個(gè)成員變量或局部變量被聲明為final的,那么變量一旦被賦值就不能改變。對(duì)于基本類型的final變量,變量值不能改變。對(duì)于引用類型的final變量,一旦引用被初始化指向一個(gè)對(duì)象實(shí)例,就無法再讓它指向另一個(gè)對(duì)象實(shí)例。但是,對(duì)象實(shí)例所包含的內(nèi)容卻是可以更改的,Java也沒有提供任何使得對(duì)象實(shí)例作為整體恒定不變的途徑。對(duì)于數(shù)組類型的final變量,效果與引用類型的變量類似。,4.3 抽象類與接口接口提供了一種將“做什么”與“怎么做”分離的手段。抽象類可以認(rèn)為是介于普通的類與接口之間的一種中間狀態(tài)。,1. 抽象類在圖3-1(b)所示的例子中,創(chuàng)建“形狀”類型的目的可能不是使用它的行

6、為,而是為它的所有子類創(chuàng)建一個(gè)統(tǒng)一的接口。不同子類可以用不同的方式表示此接口,這一接口表示了所有子類的共同部分和共通特征。,所謂抽象方法,指的是只有方法聲明而沒有方法體的方法。抽象方法在聲明時(shí)必須加上關(guān)鍵字abstract,例如:abstract void f();,2. 接口接口的直覺含義是:所有實(shí)現(xiàn)了接口的類的行為都像接口所指定的那樣。因此,任何使用某個(gè)特定接口的代碼都知道應(yīng)該調(diào)用該接口的哪些方法,而且也只需要知道這些即可。可以說,接口代表了使用類的客戶代碼與提供服務(wù)的類之間的協(xié)議。接口規(guī)定了類的行為的基本形式,而不涉及具體的實(shí)現(xiàn)細(xì)節(jié)。實(shí)現(xiàn)一個(gè)接口的類將具有接口所規(guī)定的行為。,創(chuàng)建一個(gè)接口

7、需要使用Interface關(guān)鍵字。接口的一般形式如下:public interface 接口名 extends 父接口列表 接口體,接口體可以包含常量定義和方法定義兩部分。常量定義形如:類型 常量名=常量值;接口體中的方法定義形如:返回類型 方法名(參數(shù)列表);,在接口定義后,可能需要在某些情況下對(duì)接口進(jìn)行擴(kuò)展,即增加新的常量定義和方法聲明,例如,向例4-11的Shape1中加入move()方法:interface Shape1 void draw();void erase();String what();void move();,這種直接向接口中添加新的方法聲明的方式可能會(huì)產(chǎn)生問題:如果已經(jīng)

8、有一些類實(shí)現(xiàn)了原先的Shape1接口,那么添加move()方法使得這些類由具體類變?yōu)榱顺橄箢?,要想?chuàng)建這些類型的對(duì)象實(shí)例,就必須在這些類中也實(shí)現(xiàn)move()方法,從而增加了開發(fā)復(fù)雜度且引入了不可靠性。一種可靠的方法是通過創(chuàng)建接口的子接口來實(shí)現(xiàn)對(duì)接口的擴(kuò)展,例如:interface MovableShape extends Shape1 void move();,3. 多重繼承接口的一個(gè)重要功能是幫助實(shí)現(xiàn)多重繼承。接口允許人們通過創(chuàng)建一個(gè)能夠被向上轉(zhuǎn)型為多種基類的類型,來實(shí)現(xiàn)一種類似多重繼承變種的特性。,圖4-1 Java的多重繼承方式,4.4 枚 舉 類 型1. 枚舉類型的概念從J2SE 5.

9、0開始,枚舉類型被引入Java語言中。這一語法在C語言和C+中早已具備,但Java提供的枚舉類型的功能更加完備。在引入枚舉類型之前,Java需要通過創(chuàng)建整型常量集來實(shí)現(xiàn)類似枚舉類型值的效果。在引入枚舉類型后,Java程序可以通過關(guān)鍵字enum將一組具名的值的有限集合創(chuàng)建為一種新的類型。,一個(gè)枚舉類型的典型定義如下:public enum Grade FRESHMAN,SOPHOMORE,JUNIOR,SENIOR又如 public enum Season SPRING,SUMMER,F(xiàn)ALL,WINTER,使用枚舉類型時(shí),往往要定義枚舉類型的變量,這個(gè)變量是引用類型,引用到某個(gè)枚舉常量的對(duì)象實(shí)

10、例。例如:Grade grade= Grade.JUNIOR;,2. 枚舉類型的行為枚舉類型隱含繼承java.lang.Enum類,因此無法再繼承其他的類。也由于這一繼承關(guān)系,編譯器在創(chuàng)建枚舉類型時(shí)會(huì)自動(dòng)添加一些有用的行為。,3. 自定義方法與方法重寫如果將枚舉類型看做一個(gè)類,那么可以向其中添加新的方法以及新的成員變量,甚至可以添加新的構(gòu)造方法,這些成員變量和方法共同構(gòu)成枚舉體。這樣,枚舉類型的一般形式就變?yōu)?public enum 枚舉類型名 implements 接口列表 枚舉常量定義; 枚舉體定義,4.5 內(nèi) 部 類1. 內(nèi)部類的創(chuàng)建和使用所謂內(nèi)部類,是指定義在另一個(gè)類的內(nèi)部的類。內(nèi)部類

11、的作用是將一些邏輯相關(guān)的類組織起來,并控制位于內(nèi)部的類的可見性。創(chuàng)建內(nèi)部類的方式就是將類A的定義置于另一個(gè)類B的內(nèi)部。這時(shí),B稱為A的外包類,A稱為B的內(nèi)部類。,2. 局部?jī)?nèi)部類在一個(gè)方法或語句塊的作用域內(nèi)創(chuàng)建的類稱為局部?jī)?nèi)部類。在方法和語句塊之外無法訪問局部?jī)?nèi)部類,方法的返回類型也不能是內(nèi)部類,但可以是內(nèi)部類的父類。這時(shí),如果方法返回一個(gè)內(nèi)部類的對(duì)象引用,那么會(huì)進(jìn)行向上轉(zhuǎn)型。,3. 匿名內(nèi)部類匿名內(nèi)部類的形式類似于在創(chuàng)建一個(gè)類的對(duì)象時(shí)給出對(duì)該類的定義。,例4-19 AnonymousInner.java:匿名內(nèi)部類的使用。,在例4-19中,buildDescription()方法中定義了一個(gè)匿名內(nèi)部類,該類以Description類作為父類。在繼承Description類的同時(shí),該類還重寫了Description類的Print()方法。在新的Print()方法中,通過super關(guān)鍵字調(diào)用Description類的Print()方法,然后輸出一個(gè)字符串,該字符串包含從Descri

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論