《Java編程基礎(chǔ)》課件第5章 深入討論類_第1頁
《Java編程基礎(chǔ)》課件第5章 深入討論類_第2頁
《Java編程基礎(chǔ)》課件第5章 深入討論類_第3頁
《Java編程基礎(chǔ)》課件第5章 深入討論類_第4頁
《Java編程基礎(chǔ)》課件第5章 深入討論類_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章 深入討論類5.5 類的靜態(tài)成員

5.4 構(gòu)造方法

5.3 深入討論方法

5.2 引用賦值

5.1 對象的創(chuàng)建與銷毀

第5章 深入討論類(續(xù))5.9 包與訪問控制修飾符

5.8 抽象類與接口

5.7 繼承

5.6 表現(xiàn)多態(tài):方法重載

教學(xué)要求:理解:引用賦值,類的靜態(tài)成員,重載的概念,繼承、抽象類、接口的概念,包的作用,訪問控制修飾符的作用。掌握:對象的創(chuàng)建與使用,方法的定義和調(diào)用,構(gòu)造方法的使用,方法重載的使用,通過繼承創(chuàng)建新類,定義和使用接口,使用包,使用import。5.1 對象的創(chuàng)建與銷毀面向?qū)ο蟪绦蛟O(shè)計的核心是對象,程序是一系列對象的組合。單個對象能夠?qū)崿F(xiàn)的功能是有限的,應(yīng)用程序往往包含很多的對象,這些對象相互調(diào)用彼此的方法,交互作用以實現(xiàn)更高級、更復(fù)雜的功能。在程序中當(dāng)需要使用新對象時,應(yīng)進(jìn)行對象的創(chuàng)建,為其分配內(nèi)存空間,在對象完成了自己的功能后可以銷毀它以釋放占用的內(nèi)存。5.1 對象的創(chuàng)建與銷毀(續(xù))在Java中,利用new關(guān)鍵字可以創(chuàng)建類的對象,這是最常用的創(chuàng)建對象的方式。用new創(chuàng)建對象的語法格式如下所示:SomeClassob=newSomeClass(參數(shù)列表);new關(guān)鍵字后調(diào)用的是類的構(gòu)造方法。5.1 對象的創(chuàng)建與銷毀(續(xù))對象的創(chuàng)建過程主要包含了如下的步驟:

給對象分配內(nèi)存空間。若類的實例變量在定義時未賦初值,則將它們自動初始化為其所屬類型的默認(rèn)值。調(diào)用類的構(gòu)造方法進(jìn)行對象的初始化工作,若構(gòu)造方法中包含對實例變量賦值的語句,則為實例變量賦予相應(yīng)的初始值。注意:類的實例變量,指的是類中未被static修飾的成員變量。5.1 對象的創(chuàng)建與銷毀(續(xù))可以使用new來創(chuàng)建具體學(xué)生對象來,如:StudentaStudent=newStudent(“Tom”,19,”計算機(jī)”);對象創(chuàng)建之后,可通過訪問對象的變量或是調(diào)用對象的方法來使用對象5.1 對象的創(chuàng)建與銷毀(續(xù))訪問對象的變量

訪問對象的變量的一般格式如下:對象名.變量名通過訪問對象的變量可以修改對象的屬性值,如給學(xué)生改名:aS=“John”;需要注意的是:像這樣直接操縱對象的屬性的做法是不提倡的,更好的訪問方式是通過各個屬性的get和set方法來訪問。5.1 對象的創(chuàng)建與銷毀(續(xù))調(diào)用對象的方法

調(diào)用對象的方法的一般格式如下:對象名.方法名(參數(shù)列表)方法代表對象具有的行為,調(diào)用方法就相當(dāng)于實施行為,能實現(xiàn)一定的功能。比如,如果希望對這個學(xué)生的信息進(jìn)行修改,可以調(diào)用各個屬性的set方法來實現(xiàn):aStudent.setName(“John”);5.1 對象的創(chuàng)建與銷毀(續(xù))對象的銷毀

在Java的運(yùn)行時環(huán)境中,Java虛擬機(jī)提供了一個垃圾回收器線程,它負(fù)責(zé)自動周期性地檢測、回收那些無用對象所占用的內(nèi)存,這種內(nèi)存回收的機(jī)制被稱為自動垃圾回收(GarbageCollection),這也是Java顯著的特色之一。5.2 引用賦值同種基本數(shù)據(jù)類型的變量之間可以互相賦值,比如:

inti=3;intj=i;與此類似,同種類型的對象之間也可以賦值,比如:Studentstu1=newStudent();Studentstu2=stu1;不同的是:同種基本數(shù)據(jù)類型的變量之間的賦值是值的拷貝,內(nèi)容的拷貝。同種類型的對象之間的賦值叫引用賦值,不是拷貝對象的內(nèi)容。5.2 引用賦值(續(xù))對象名的引用作用如下圖所示:同種類型對象之間的賦值,是將一個對象名所代表的引用賦給另一個對象名,使得2個對象名具有相同的引用,那么這2個對象名可以訪問到同一個對象的存儲空間,這種對象的賦值就叫做引用賦值。

5.2 引用賦值(續(xù))空引用若對象只聲明了類型,而沒有創(chuàng)建,則對象的值為null,代表空引用,表示沒有指向任何的對象。這時候如果試圖使用對象,則會出錯,例如:Studentjane;System.out.println("學(xué)生姓名:"+jane.getName());使用空引用的對象,在運(yùn)行時會產(chǎn)生NullPointerException異常。

5.3 深入討論方法方法的定義、調(diào)用和返回

類的組成主要包括成員變量和成員方法2部分,成員變量描述屬性,成員方法描述行為。對象所具有的行為能力都是通過方法體現(xiàn)的。

方法的定義

在Java中,方法是類的組成部分之一,每個方法都屬于特定的類,方法的定義必須位于類體之中。方法定義的一般格式為:返回值類型方法名(形式參數(shù)列表){ //方法體}5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

左花括號{之前的部分為方法定義的頭部,主要包括返回值類型、方法名和形參列表。方法名,必須是合法的標(biāo)識符,應(yīng)按照J(rèn)ava的命名規(guī)范進(jìn)行命名,最好還能做到見名知意。返回值,如果方法執(zhí)行完后會帶回一個值,這個值就叫做返回值。返回值類型,表示該方法執(zhí)行完畢后帶回的值所屬的類型,可以是基本數(shù)據(jù)類型,也可以是對象類型。但如果方法只是完成一定的操作而沒有帶回任何的值,則返回值類型應(yīng)該聲明為void。形式參數(shù)列表代表的是:使用這個方法實現(xiàn)一定功能時需要傳遞給方法的若干數(shù)據(jù),可以是0個,也可是多個,各個參數(shù)之間要用逗號“,”分隔,每個參數(shù)都必須帶上類型的聲明。{和}之間是方法體,包含若干的可執(zhí)行語句,用于實現(xiàn)方法的功能。方法定義時的可缺省部分這里并未列出,后面的章節(jié)將討論到其它部分。5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

一個合法的方法聲明

intadd(inta,intb){ intsum=0; sum=a+b; returnsum;}

add()方法實現(xiàn)求2個加數(shù)的和值,當(dāng)需要使用該功能時,應(yīng)調(diào)用add()方法,提供2個實際的加數(shù)分別傳給形式參數(shù)a和b,方法體結(jié)束之前通過returnsum;語句將計算得到的和值帶回給調(diào)用者。5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

方法的調(diào)用方法由類的對象,用圓點運(yùn)算符“.”來調(diào)用,方法調(diào)用的格式為:對象名.方法名(實際參數(shù)列表)方法定義時,方法名后()中的參數(shù)稱為形式參數(shù),代表該方法在執(zhí)行時需要哪些數(shù)據(jù)。在發(fā)生方法調(diào)用時,執(zhí)行流程將轉(zhuǎn)去執(zhí)行方法體。5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

在調(diào)用方法時,應(yīng)注意如下幾點:實際參數(shù)應(yīng)與形式參數(shù)的個數(shù)、類型、順序均保持一致。實際參數(shù)的值將對應(yīng)地傳給形式參數(shù)。若方法定義時未定義任何形式參數(shù),則調(diào)用方法時參數(shù)列表留空,但是()一定不能省。若方法定義時的返回值類型非void,則方法調(diào)用就相當(dāng)于是同類型的一個值(因為有返回值的方法必會用return返回一個同類型的值)。若方法定義時的返回值類型為void,則方法調(diào)用一定不能出現(xiàn)在賦值運(yùn)算符“=”的右邊。5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

方法的返回

發(fā)生方法調(diào)用時會轉(zhuǎn)去執(zhí)行方法體,方法體執(zhí)行完畢則從方法返回,表示方法調(diào)用結(jié)束,將返回到被調(diào)用處,如果有必要還可以返回值給調(diào)用者5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))

方法的返回

(續(xù))return語句的格式如下:return[表達(dá)式];其后的表達(dá)式是可以缺省的部分,是否缺省視方法是否返回值而定。如果方法定義時聲明了返回值類型,就必須使用return表達(dá)式返回一個同類型的值。如果方法的返回值類型被聲明為void,則方法體中不能用return表達(dá)式帶回值。

5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))關(guān)于方法的定義、調(diào)用和返回的補(bǔ)充說明:

調(diào)用類的成員方法,一般需要先創(chuàng)建類的對象(調(diào)用類的靜態(tài)方法不用如此),再以對象名.方法名(實際參數(shù)列表)的格式調(diào)用。main()方法中可以創(chuàng)建自己所屬的類自身的對象。5.3 深入討論方法(續(xù))方法的定義、調(diào)用和返回(續(xù))方法的嵌套調(diào)用

如果將一個方法調(diào)用作為另一個方法的實際參數(shù),就形成了方法的嵌套調(diào)用。如果有形如:funa(funb(func(參數(shù)),其它參數(shù)),其它參數(shù))的多層嵌套調(diào)用,執(zhí)行時將從處于最內(nèi)層的方法調(diào)用開始,依次返回到上一層方法調(diào)用。即最先執(zhí)行func()方法,從func()返回后,將返回值傳給funb()方法的形參開始執(zhí)行funb(),從funb()返回后再將其返回值傳給funa()的形參,開始執(zhí)行funa()。5.3 深入討論方法(續(xù))從方法返回對象

方法的返回類型除了基本數(shù)據(jù)類型外,還可以是對象類型,即可以從方法返回對象。5.3 深入討論方法(續(xù))區(qū)別同名的局部變量與成員變量:this引用出現(xiàn)在類中各個不同位置的變量都是有其作用域的,在其作用范圍內(nèi),這個變量才能使用。在相同的作用范圍內(nèi),不能定義同名的變量。在類體中、方法外聲明的變量為類的成員變量,其作用域為整個類體。方法的形式參數(shù),以及方法體內(nèi)部聲明的變量,都屬于局部變量,作用域僅為方法體,一旦方法調(diào)用結(jié)束,這些局部變量也將消失。5.3 深入討論方法(續(xù))區(qū)別同名的局部變量與成員變量:this引用(續(xù))在類體中,引用成員變量時可以加上this引用:將this.

作為成員變量的前綴。那么在出現(xiàn)成員變量與局部變量同名的情況時,就可以區(qū)分了:使用了this引用的是成員變量,而無this引用的是局部變量。5.4 構(gòu)造方法在創(chuàng)建類的對象時將會調(diào)用構(gòu)造方法,構(gòu)造方法一般實現(xiàn)對類的成員變量進(jìn)行初始化的操作。

構(gòu)造方法不同于成員方法,從其定義形式上也可以體現(xiàn)出來:

構(gòu)造方法名必須與所屬的類名保持一致,包括大小寫(Java是大小寫敏感的語言)。構(gòu)造方法無返回類型,連void都沒有。類中可以沒有構(gòu)造方法,這個時候系統(tǒng)會自動為類添加一個無參且方法體為空的默認(rèn)構(gòu)造方法。形如:publicClassName(){ }如果類中包含了構(gòu)造方法,則用new調(diào)用構(gòu)造方法創(chuàng)建對象時,必須按照構(gòu)造方法定義的形式參數(shù)給出相應(yīng)的實際參數(shù)。5.5 類的靜態(tài)成員static關(guān)鍵字

static意為靜態(tài)的,Java中用static關(guān)鍵字來表示靜態(tài)的成員。靜態(tài)成員與非靜態(tài)成員,所處的存儲空間不同,生命期也不一樣。類中有static修飾的變量和方法叫做類的靜態(tài)變量、靜態(tài)方法,統(tǒng)稱為類的靜態(tài)成員。而無static修飾的則可相對的稱為動態(tài)成員5.5 類的靜態(tài)成員(續(xù))static關(guān)鍵字(續(xù))類的靜態(tài)成員的使用格式如下:類名.靜態(tài)變量名 類名.靜態(tài)方法(參數(shù)列表)類的靜態(tài)變量也稱作類變量或域(field),無static修飾的成員變量也稱作實例變量。無static修飾的成員方法也稱作實例方法。類的靜態(tài)成員,不依賴于類的實例,在不創(chuàng)建類對象的情況下就可以直接通過類名來訪問,并且這些靜態(tài)成員被類的所有實例所共享。

5.5 類的靜態(tài)成員(續(xù))

static變量靜態(tài)變量與實例變量的區(qū)別:Java虛擬機(jī)只給靜態(tài)變量分配1次內(nèi)存,靜態(tài)變量在內(nèi)存中只有一個拷貝,任何類的實例對靜態(tài)變量的修改都將有效。實例變量依賴于類的實例,即具體的對象,每創(chuàng)建一個對象,就為該對象的實例變量分配一次內(nèi)存,各個對象的實例變量占用不同的內(nèi)存空間,互不干擾,對象對各自實例變量的修改不會影響到其它對象的實例變量。在類的內(nèi)部,可以在任何方法內(nèi)部訪問靜態(tài)變量,在沒有變量重名的情況下靜態(tài)變量名前面可以不用帶前綴。5.5 類的靜態(tài)成員(續(xù))

static變量類的靜態(tài)變量主要有如下2個作用:能被類的所有實例共享,可以作為實例之間共享的數(shù)據(jù)。如果類的所有實例都需要一個相同的常量數(shù)據(jù)成員,可以把這個數(shù)據(jù)成員定義為靜態(tài)的,從而節(jié)省內(nèi)存空間。若要將變量的值固定成為常量,則應(yīng)在變量的類型前加上final關(guān)鍵字。5.5 類的靜態(tài)成員(續(xù))

static方法

方法的返回類型前有static關(guān)鍵字修飾的成員方法即為類的靜態(tài)方法。與靜態(tài)變量類似,類的靜態(tài)方法也不依賴于類的實例,不需要創(chuàng)建類的對象就可以通過類名來調(diào)用。

5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系

靜態(tài)方法是隨類加載的,只要類存在,靜態(tài)方法就可以調(diào)用、執(zhí)行。而實例變量、實例方法這些非靜態(tài)的成員都是依賴于類的實例的,必須在類對象存在的前提下,才可以使用實例變量和實例方法。因此,靜態(tài)方法體中不能使用無法確定是否存在的實例變量和實例方法。5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系

靜態(tài)方法是隨類加載的,只要類存在,靜態(tài)方法就可以調(diào)用、執(zhí)行。而實例變量、實例方法這些非靜態(tài)的成員都是依賴于類的實例的,必須在類對象存在的前提下,才可以使用實例變量和實例方法。因此,靜態(tài)方法體中不能使用無法確定是否存在的實例變量和實例方法。5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

publicclassStaticTest3{ inta=10; intb=20; publicstaticvoidmain(String[]args){ intsum=a+b; System.out.println("sum="+sum); } }錯誤:不能在靜態(tài)上下文中訪問非靜態(tài)的a和b。5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

在本例中,由于a和b均為非static的實例變量,它們在類的對象創(chuàng)建之后才會被分配內(nèi)存而存在,在靜態(tài)的main()方法中不能對其進(jìn)行引用。解決上述訪問問題的方法有2種:一種是將a和b改為static變量,則它們與main()方法一樣是靜態(tài)成員,都隨類加載,不依賴于對象的存在與否,在main()中可以訪問它們,在其它的靜態(tài)方法中也可以訪問。如下所示:staticinta=10;staticintb=20;5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

另一種解決方法是:靜態(tài)的main()方法中先創(chuàng)建類的對象,再用對象來訪問這些實例變量。如下所示:StaticTest3ob=newStaticTest3();intsum=ob.a+ob.b;

5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

如果在靜態(tài)方法中調(diào)用實例方法,又會出現(xiàn)什么情況呢。

publicclassStaticTest4{ publicstaticvoidmain(String[]args){

intsub=sub(13,5);

System.out.println("sub="+sub); } publicintsub(inta,intb){ returna-b; }}5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

同試圖在靜態(tài)方法中訪問非靜態(tài)的實例變量類似,此問題的出現(xiàn)也是因為非靜態(tài)的實例方法依賴于類的實例,故在靜態(tài)方法中不能調(diào)用實例方法。

解決方法有二:一是改sub()方法為靜態(tài)方法,如下所示:publicstaticintsub(inta,intb){ returna-b;}5.5 類的靜態(tài)成員(續(xù))

成員與靜態(tài)方法的關(guān)系(續(xù))

另一種解決辦法:靜態(tài)的main()中先創(chuàng)建類的對象,再調(diào)用實例方法如下所示:StaticTest4ob=newStaticTest4();intsub=ob.sub(13,5);反過來,沒有static修飾的實例方法中沒有這樣的限制,實例方法可以訪問類的靜態(tài)變量、調(diào)用靜態(tài)方法,也可以訪問實例變量、調(diào)用實例方法。

5.6 表現(xiàn)多態(tài):方法重載面向?qū)ο缶幊痰亩鄳B(tài)特征,簡單的說就是“對外一個接口,內(nèi)部多種實現(xiàn)”。有時候,一種功能可能會有多種不同的實現(xiàn)方式。Java支持方法重載(overload),可以在同一個類中定義多個名字相同但參數(shù)不同的方法。那么同一個方法名就是對外的統(tǒng)一接口,參數(shù)不同導(dǎo)致內(nèi)部實現(xiàn)也不同,方法重載是面向?qū)ο缶幊潭鄳B(tài)特征的一種表現(xiàn)形式。方法重載是編譯時的多態(tài),編譯器在編譯時刻確定具體調(diào)用哪個被重載的方法。5.6 表現(xiàn)多態(tài):方法重載(續(xù))如何定義和調(diào)用重載的方法

在Java中,定義重載的方法必須遵循以下原則:方法名相同,包括大小寫。方法的參數(shù)列表必須不同,也就是參數(shù)的類型、個數(shù)、順序至少有一項不同。編譯器將參數(shù)列表的不同作為重載的判定依據(jù)。方法的返回類型、修飾符可以相同,也可以不同,它們不作為重載的判定依據(jù)。5.6 表現(xiàn)多態(tài):方法重載(續(xù))構(gòu)造方法的重載

構(gòu)造方法也可以重載,這樣在創(chuàng)建對象時可以調(diào)用不同版本的構(gòu)造方法來進(jìn)行初始化操作。在構(gòu)造方法中可以使用this關(guān)鍵字調(diào)用其它版本的構(gòu)造方法,減少重復(fù)編碼。需要注意的是:重載構(gòu)造方法時,若要使用this調(diào)用其它版本的構(gòu)造方法,則該this調(diào)用語句必須作為構(gòu)造方法的方法體中的第一條語句。5.7 繼承繼承是實現(xiàn)代碼重用的一種有力手段。如果有多個類具有一些相同的屬性和方法,可以將這些相同的屬性和方法抽象出來定義為一個父類,在父類中定義這些屬性和方法,則具有這些屬性和方法的其它類可以從這個父類派生出來,不必再重新定義這些屬性和方法,稱這些派生而來的類為子類。

5.7 繼承(續(xù))類的繼承

在繼承關(guān)系中,被繼承的類稱為父類、超類或基類,其中定義了子類所共有的屬性和方法。由繼承方式創(chuàng)建的類稱為子類,子類將父類的屬性和方法繼承過來,不必重新定義,并且可根據(jù)需要增加新的屬性和方法。Java的所有類都直接或間接地繼承自java.lang.Object類。類定義沒有用extends繼承某個類時,實際上隱式繼承了Object類。5.7 繼承(續(xù))

類的繼承(續(xù))

在繼承關(guān)系中,被繼承的類稱為父類、超類或基類,其中定義了子類所共有的屬性和方法。由繼承方式創(chuàng)建的類稱為子類,子類將父類的屬性和方法繼承過來,不必重新定義,并且可根據(jù)需要增加新的屬性和方法。Java的所有類都直接或間接地繼承自java.lang.Object類。類定義沒有用extends繼承某個類時,實際上隱式繼承了Object類。5.7 繼承(續(xù))

類的繼承(續(xù))

5.7 繼承(續(xù))

類的繼承(續(xù))Java中類的繼承用關(guān)鍵字extends實現(xiàn),如下所示:classSonClassextendsSuperClass{ ……}5.7 繼承(續(xù))

super關(guān)鍵字

在繼承關(guān)系中,也存在類似的問題:若子類中定義了與父類同名的成員變量,則父類的成員變量被隱藏。若子類的方法中定義了與父類成員變量同名的局部變量,則父類的成員變量被隱藏。若子類中定義了與父類相同的成員方法(同方法名,同參數(shù)列表,同返回類型),則父類方法被覆蓋,在子類范圍內(nèi),父類方法不可見。5.7 繼承(續(xù))

super關(guān)鍵字(續(xù))

解決繼承關(guān)系中類變量或方法不可見的問題,需要使用關(guān)鍵字super。

super可以用來引用繼承自父類的成員。super的使用有如下幾種形式:super.變量名:引用父類成員變量。super.方法名(參數(shù)列表):調(diào)用父類成員方法。super(參數(shù)列表):調(diào)用父類構(gòu)造方法,在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法以實現(xiàn)對繼承自父類的成員變量的初始化,5.7 繼承(續(xù))

繼承中的final修飾符

出于安全考慮,類的實現(xiàn)細(xì)節(jié)不允許被改動,或者不允許子類覆蓋父類的某個方法,這時候就可以對類或成員方法使用final修飾符。final有不可改變的含義,可以用于修飾類、成員方法以及成員變量。5.7 繼承(續(xù))

繼承中的final修飾符(續(xù))

定義類時,在class關(guān)鍵字前可以加上final修飾符,則這個類將不能再派生子類,即不能被其它類所繼承。例如:publicfinalclassA{ ……}則類A不可被繼承。聲明類的成員方法時,在返回類型前可以加上final修飾符,則方法所屬的類被繼承時,這個方法不會被重寫。例如:publicfinalvoidmethod(){ ……}5.7 繼承(續(xù))

繼承中的final修飾符(續(xù))

final修飾成員變量與繼承無關(guān),它表示的是變量一經(jīng)賦值,其值將不能改變,也就是通過final可以定義常量,常量名一般全部大寫。例如:finalintMAX_NUM=100;如果程序中試圖修改由final修飾的MAX_NUM的值,將會產(chǎn)生編譯錯誤。

5.8 抽象類與接口抽象類與抽象方法

Java中可以用abstract修飾符修飾類和成員方法。用abstract修飾的類為抽象類。在類的繼承體系中,抽象類常位于頂層。抽象類不能被實例化,即不能創(chuàng)建抽象類的對象。用abstract修飾的方法為抽象方法,抽象方法沒有方法體,一般用來描述具有什么功能,而不提供具體的實現(xiàn)。5.8 抽象類與接口(續(xù))抽象類與抽象方法(續(xù))

以下代碼中AbstractClass為抽象類,它包含一個抽象方法method1()和一個具體方法(非抽象方法)method2()。

publicabstractclassAbstractClass{ publicabstractvoidmethod(); //抽象方法,無方法體

publicvoidmethod2(){ //具體方法,即是方法體為空,{}也不能省略

…… }}5.8 抽象類與接口(續(xù))抽象類與抽象方法(續(xù))

抽象類和抽象方法有一些注意事項:

抽象類中可以包含構(gòu)造方法,成員變量,具體方法,甚至可以沒有抽象方法,但包含了抽象方法的類必須定義為抽象類,否則編譯出錯。沒有抽象的構(gòu)造方法,也沒有靜態(tài)的抽象方法,即static和abstract不能一起修飾方法。抽象類與抽象方法不能被final修飾。抽象類不可實例化。5.8 抽象類與接口(續(xù))接口Java中的接口(interface)使抽象類的概念更深入一層。外界觀察一個對象,主要關(guān)注對象提供了什么服務(wù),至于服務(wù)在對象內(nèi)部是如何具體實現(xiàn)的,外部并不關(guān)心。對象所提供的服務(wù)由方法實現(xiàn),因此,對象中所有外界能使用的方法的集合,就構(gòu)成了對象與外界進(jìn)行交互的“界面”,即接口。

5.8 抽象類與接口(續(xù))接口(續(xù))接口的定義格式:[public]interfaceInterfaceName[extendsSuperInterface]{ //接口體}5.8 抽象類與接口(續(xù))接口(續(xù))接口體包含成員變量和成員方法,但有一些限制:接口中的成員變量默認(rèn)都是public、static、final類型的,即都是靜態(tài)常量,必須顯式地進(jìn)行初始化。接口中的方法默認(rèn)都是public、abstract類型的,即都是抽象方法,無方法體,不提供具體實現(xiàn)。5.8 抽象類與接口(續(xù))接口(續(xù))以下代碼就是一個合法的接口定義:publicinterfaceComputable{ publicstaticfinaldoublePI=3.1415926; publicabstractdoublesum(doublex,doubley); publicdoublesub(doublex,doubley); //即是缺省abstract,系統(tǒng)會自動添加}接口沒有構(gòu)造方法,不能創(chuàng)建接口的對象。5.8 抽象類與接口(續(xù))接口(續(xù))類聲明時可以使用implements子句來表示實現(xiàn)某個或某些接口。接口聲明了一些行為規(guī)范,實現(xiàn)接口的類將具有這些行為規(guī)范,但必須提供所有行為的實現(xiàn)細(xì)節(jié),即實現(xiàn)接口的類必須重寫接口中的所有抽象方法。5.8 抽象類與接口(續(xù))接口(續(xù))如果一個類實現(xiàn)多個接口,各個接口之間用逗號“,”分隔。類實現(xiàn)接口的格式如下:class類名implements接口名[,接口2,……]{ //各個方法的具體實現(xiàn)}5.8 抽象類與接口(續(xù))接口實現(xiàn)多繼承效果

Java是單繼承的,一個類只能有一個直接父類,但利用接口,可以達(dá)到多繼承的效果。因為一個類可以實現(xiàn)多個接口,就繼承了所實現(xiàn)的所有接口中的靜態(tài)常量,以及所有的抽象方法,若實現(xiàn)這些接口的類不是抽象類,則這個類要提供所有這些方法的實現(xiàn)。

5.8 抽象類與接口(續(xù))接口實現(xiàn)多繼承效果(續(xù))設(shè)有如下的類定義:classAimplementsB,C,D{ …… //必須重寫接口B、C、D中的抽象方法}則,類A繼承了接口B、C、D的所有靜態(tài)常量和所有方法,但在類A中必須重寫這些方法,具體實現(xiàn)接口的行為。

5.8 抽象類與接口(續(xù))接口實現(xiàn)多繼承效果(續(xù))創(chuàng)建類時,還可以讓這個類既繼承某個類,又實現(xiàn)某個或某些接口,讓這個類具備更多的屬性和行為,達(dá)到多繼承的效果。設(shè)有如下的類定義:classAextendsBimplementsC,D{ …… //必須重寫接口C、D中的方法}則類A將繼承類B的非private的成員變量、成員方法,繼承接口C、D的靜態(tài)常量,并要實現(xiàn)接口C、D的所有方法。

5.8 抽象類與接口(續(xù))接口實現(xiàn)多繼承效果(續(xù))接口還可以繼承接口,而且與類繼承類不同的是,一個接口可以利用extends繼承多個接口,也是多繼承效果的一種體現(xiàn)。設(shè)有如下的接口定義:

interfaceAextendsB,C{ //接口A的靜態(tài)常量和抽象方法}則:B、C必須都是接口,接口A繼承了接口B、C的所有靜態(tài)常量和抽象方法,但并不實現(xiàn)任何的方法。

5.8 抽象類與接口(續(xù))接口實現(xiàn)多繼承效果(續(xù))已有如上所示的接口A,那么如下的類定義:classClassAimplementsA{ ……//實現(xiàn)A的所有抽象方法

}類ClassA實現(xiàn)接口A就要實現(xiàn)其所有的抽象方法,這些方法除了接口A自身包含的抽象方法之外,還包括接口A從所有父接口繼承而來的抽象方法。

5.9 包與訪問控制修飾符包的概念與作用Java中,包(package)是相關(guān)類與接口的一個集合,是一種管理和組織類(包括類和接口)的機(jī)制。簡單的來看,包就相當(dāng)于是一個目錄,其中可以包含類、接口、子包(相當(dāng)于子目錄)。其作用包括:一是能減少類的名稱的沖突問題,二是能分門別類地組織各種類,三是有助于實施訪問權(quán)限控制,當(dāng)位于不同包的類相互訪問時,會受到訪問權(quán)限的約束。5.9 包與訪問控制修飾符(續(xù))包的概念與作用(續(xù))典型的,Java的類庫就是按有層次的包的方式組織的。

5.9 包與訪問控制修飾符(續(xù))包的概念與作用(續(xù))Java的一些基本包如下所示:

java.lang包:核心語言包,包含System類(系統(tǒng)類)、String類(字符串類)、Exception類(異常類)等,這些類是編寫Java程序經(jīng)常要使用的。這個包由JVM自動引入,在編寫程序時可以直接使用這個包中的類,而不必用import語句引入。java.awt包:抽象窗口工具集包,包含了用于構(gòu)建圖形用戶界面(GUI)程序的基本類和繪圖類。5.9 包與訪問控制修飾符(續(xù))包的概念與作用(續(xù))Java的一些基本包如下所示:java.io包:輸入/輸出包,包含各種輸入流類和輸出流類,用于實現(xiàn)程序與外界的數(shù)據(jù)交換。java.util包:使用工具包,提供一些實用類,如Date類(日期類),Random類(隨機(jī)數(shù)類),Collection類(集合類)等。5.9 包與訪問控制修飾符(續(xù))包聲明語句package

包聲明語句用于將Java的類放到特定的包中,對應(yīng)的,類的.class文件組織到包結(jié)構(gòu)映射而來的目錄結(jié)構(gòu)中。Java利用package關(guān)鍵字聲明包,格式如下:packagepackageName;5.9 包與訪問控制修飾符(續(xù))包聲明語句package(續(xù))

使用包聲明語句時,需要注意如下事項:包聲明語句(package語句)必須出現(xiàn)在Java源文件的第一行(忽略注釋行)。如果有包聲明語句的Java源文件中包含了多個類或接口的定義,則這些類和接口都將位于聲明的這個包中。一個Java源文件只能包含一個package語句。如果Java文件中沒有package語句,則這個文件中的類位于默認(rèn)包,默認(rèn)包沒有名字。

5.9 包與訪問控制修飾符(續(xù))包引入語句import

位于同一個包(即同一個目錄)中的類可以直接相互訪問,不需要做額外操作。但,如果一個類要訪問來自于另外一個包中的類,則需要通過import語句將其需要訪問的類引入,否則無法使用別包中的類,編譯時會報錯。

5.9 包與訪問控制修飾符(續(xù))包引入語句import

Java使用import關(guān)鍵字來引入類,格式如下:import完整類名;注意:此處的類名要使用包表示法。import語句要位于package語句之后,類或接口定義之前。5.9 包與訪問控制修飾符(續(xù))訪問控制符

訪問控制符,可以對被其修飾的元素進(jìn)行訪問權(quán)限控制,這種控制也與包相關(guān)。類中的成員的可見性(或叫可訪問性)取決于它的訪問控制符和它所在的包和類的性質(zhì)。Java的訪問控制符有4種:public、protected、default和private。其中,default缺省訪問控制符,指的是不添加任何訪問控制的關(guān)鍵字。訪問控制符可以修飾類,也可以修飾類的成員,訪問控制符應(yīng)放在類、變量或方法聲明的最前面。

5.9 包與訪問控制修飾符(續(xù))訪問控制符

(續(xù))5.9 包與訪問控制修飾符(續(xù))訪問控制符

(續(xù))5.9 包與訪問控制修飾符(續(xù))訪問控制符

(續(xù))private:意為私有的,只能修飾類的成員,不能修飾類,由private修飾的成員只能在類的內(nèi)部訪問。一般,可以對希望隱藏的內(nèi)部數(shù)據(jù)或內(nèi)部方法添加private關(guān)鍵字,以保護(hù)敏感信息或隱藏功能的實現(xiàn)細(xì)節(jié)。

default:缺省訪問控制符,既可以修飾類的成員,也可以修飾類,由default修飾的元素都是同一個包中的類可以訪問。5.9 包與訪問控制修飾符(續(xù))訪問控制符

(續(xù))protected:受保護(hù)的,只能修飾類的成員,代表的可訪問范圍比default大,除了本包中可見外,別包中的子類也可以訪問到protected修飾的成員,但別包中的非子類就不能訪問protected修飾的成員了。public:公共的,所代表的可訪問范圍是最廣的,可以修飾類,也可以修飾類的成員,被public修飾的元素在本包和別包中都是可見的。被public修飾的類在別包中可見,可以創(chuàng)建其對象,或是派生其子類。被public修飾的成員在別包中也可見,可以訪問public的變量或是調(diào)用public的方法。本章小結(jié)用new創(chuàng)建類的對象,開辟對象的存儲空間。Java有垃圾回收機(jī)制能自動清理無用的對象。若類中未定義構(gòu)造方法,則會自動添加一個缺省的無參構(gòu)造方法。同種類型的對象可以相互賦值,這種賦值是引用賦值,使得2個對象名可以指向同一個對象。若對象作為方法參數(shù),則實參傳給形參的是對象的引用,使得形參與實參指向同一個對象,則利用形參對對象進(jìn)行修改能確實生效。若有類的成員變量與方法的局部變量同名,則局部變量會將成員變量屏蔽掉,可以使用this引用來顯式引用類的成員變量,解決名稱沖突問題。類的靜態(tài)成員由static修飾,

溫馨提示

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

評論

0/150

提交評論