Java程序設(shè)計(jì)第2版第七章課件_第1頁
Java程序設(shè)計(jì)第2版第七章課件_第2頁
Java程序設(shè)計(jì)第2版第七章課件_第3頁
Java程序設(shè)計(jì)第2版第七章課件_第4頁
Java程序設(shè)計(jì)第2版第七章課件_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章

Java類的特性

12/27/20221第7章Java類的特性12/18/20221通過本章的學(xué)習(xí),主要掌握以下知識點(diǎn):類的私有成員與公共成員

方法的重載

構(gòu)造方法

實(shí)例成員與靜態(tài)成員

12/27/20222通過本章的學(xué)習(xí),主要掌握以下知識點(diǎn):12/18/20222本章的重點(diǎn):

方法的重載

構(gòu)造方法

本章的難點(diǎn):靜態(tài)成員12/27/20223本章的重點(diǎn):12/18/202237.1類的私有成員與公共成員在第6章的例子中,可以看到類的成員變量pi、radius和height可以在類Cylinder的外部任意修改。這雖然方便了程序員靈活的使用,但也存在弊端。

12/27/202247.1類的私有成員與公共成員在第6章的例子中,可以看到類的

如果沒有一個(gè)機(jī)制來限制對類中成員的訪問,則很可能會造成錯(cuò)誤的輸入。為了防止這種情況的發(fā)生,Java提供了私有成員訪問控制修飾符private。

下面來舉例說明。7.1.1私有成員12/27/20225如果沒有一個(gè)機(jī)制來限制對類中成員的訪問,則很可能會造成錯(cuò)

【例7.1】在圓柱體類Cylinder中,創(chuàng)建類的私有成員,使之在該類的外部無法訪問該成員。

//app7_1.java定義私有成員,使之無法在類外被訪問classCylinder//定義Cylinder類{

privatedoubleradius;//將數(shù)據(jù)成員radius聲明為私有的

privateintheight;//將數(shù)據(jù)成員height聲明為私有的

privatedoublepi=3.14;//將數(shù)據(jù)成員pi聲明為私有的,并賦初值doublearea(){returnpi*radius*radius;//在Cylinder類內(nèi)部,故可訪問私有成員}doublevolume(){returnarea()*height;//在類內(nèi)可以訪問私有成員height}}12/27/20226【例7.1】在圓柱體類Cylinder中,創(chuàng)建類的私有成【例7.1】續(xù)publicclassapp7_1//定義公共主類{publicstaticvoidmain(Stringargs[]){Cylindervolu;volu=newCylinder();volu.radius=2.8;//錯(cuò)誤!在類的外部,不能直接訪問私有成員。volu.height=-5;//錯(cuò)誤!在類的外部,不能直接訪問私有成員。System.out.println("底圓半徑="+volu.radius);System.out.println("圓柱的高="+volu.height);System.out.print("圓柱");System.out.println(“底面積=”+volu.area());//正確!System.out.println("圓柱體體積="+volu.volume());//正確!}}12/27/20227【例7.1】續(xù)publicclassapp7_17.1.2公共成員如果在類的成員聲明的前面加上修飾符public,則表示該成員可以被所有其他的類所訪問。由于public修飾符會造成安全性和數(shù)據(jù)封裝性的下降,所以一般應(yīng)減少公共成員的使用。下面舉例說明如何利用公共方法來訪問私有成員變量。

12/27/202287.1.2公共成員如果在類的成員聲明的前面加上修飾符pub

【例7.2】創(chuàng)建圓柱體類Cylinder的公共成員方法,來訪問類內(nèi)的私有成員變量

。//app7_2.java定義公共方法來訪問私有成員classCylinder{privatedoubleradius;//聲明私有數(shù)據(jù)成員privateintheight;privatedoublepi=3.14;publicvoidSetCylinder(doubler,inth)//聲明具有2個(gè)參數(shù)的公共方法{//用于對私有數(shù)據(jù)進(jìn)行訪問if(r>0&&h>0){radius=r;height=h;}elseSystem.out.println(“您的數(shù)據(jù)有錯(cuò)誤!!”);}12/27/20229【例7.2】創(chuàng)建圓柱體類Cylinder的公共成員方法,【例7.2】續(xù)doublearea(){returnpi*radius*radius;//在類內(nèi)可以訪問私有成員radius和pi}doublevolume(){returnarea()*height;//在類內(nèi)可以訪問私有成員height}}publicclassapp7_2//定義公共主類{publicstaticvoidmain(Stringargs[]){Cylindervolu=newCylinder();volu.SetCylinder(2.5,-5);//通過公共方法SetCylinder()訪問私有數(shù)據(jù)System.out.println("圓柱底面積="+volu.area());System.out.println("圓柱體體積="+volu.volume());}}12/27/202210【例7.2】續(xù)doublearea()12/18/20程序運(yùn)行結(jié)果如下:您的數(shù)據(jù)有錯(cuò)誤??!圓柱底面積=0.0圓柱體體積=0.0【例7.2】續(xù)12/27/202211程序運(yùn)行結(jié)果如下:【例7.2】續(xù)12/18/2022117.1.3友元若在類成員的前面加上訪問控制符friendly,說明該成員是友元。友元訪問控制符可以省略。也就是說在類內(nèi)聲明類成員時(shí),不加任何訪問控制修飾符,則該成員是一個(gè)友元。一個(gè)成員被聲明為友元,表示這個(gè)成員只能被同一個(gè)包中的類所訪問,但其他包中的類不能訪問該成員。同理,對于類來說,如果一個(gè)類沒有訪問控制符,說明它具有缺省訪問控制特性。這種缺省的訪問控制權(quán)規(guī)定只能被同一個(gè)包中的類訪問和引用,而不可以被其他包中的類所使用。

12/27/2022127.1.3友元若在類成員的前面加上訪問控制符friendl7.2方法的重載方法的重載是實(shí)現(xiàn)“多態(tài)”的一種方法。在面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中,有一些方法的含義相同,但帶有不同的參數(shù),這些方法使用相同的名字,這就叫方法的重載(Overloading)。也就是說,重載是指相同的方法名稱,如果參數(shù)個(gè)數(shù)不同,或者是參數(shù)個(gè)數(shù)相同,但類型不同,則方法就具有不同的功能。12/27/2022137.2方法的重載方法的重載是實(shí)現(xiàn)“多態(tài)”的一種方法。在面向注意:方法的重載中參數(shù)的類型是關(guān)鍵,僅僅是參數(shù)的變量名不同是不行的。也就是說參數(shù)的列表必須不同,即:或者參數(shù)個(gè)數(shù)不同,或者參數(shù)類型不同,或者參數(shù)的順序不同。方法的重載的應(yīng)用見教材【例7.3】12/27/202214注意:方法的重載中參數(shù)的類型是關(guān)鍵,僅僅是參數(shù)的變量7.3構(gòu)造方法前面所介紹的由Cylinder類所創(chuàng)建的對象,其成員變量都是在對象建立之后,再由相應(yīng)的方法來賦值。如果一個(gè)對象在被創(chuàng)建時(shí)就完成了所有的初始化工作,將會很簡潔。因此Java在類里提供了一個(gè)特殊的成員方法――構(gòu)造方法。

12/27/2022157.3構(gòu)造方法前面所介紹的由Cylinder類所創(chuàng)建的對象構(gòu)造方法(constructor)是一種特殊的方法,它是在對象被創(chuàng)建時(shí)初始化對象的成員的方法。構(gòu)造方法的名稱必須與它所在的類名完全相同。7.3.1構(gòu)造方法的作用與定義12/27/202216構(gòu)造方法(constructor)是一種特殊的方法,它是在對//app7_4.java構(gòu)造方法的使用classCylinder//定義類Cylinder{privatedoubleradius;privateintheight;privatedoublepi=3.14;publicCylinder(doubler,inth)//定義構(gòu)造方法{radius=r;height=h;}doublearea(){returnpi*radius*radius;}【例7.4】利用構(gòu)造方法來初始化圓柱體類Cylinder的成員變量

。12/27/202217//app7_4.java構(gòu)造方法的使用【例7doublevolume(){returnarea()*height;}}publicclassapp7_4//定義主類{publicstaticvoidmain(Stringargs[]){Cylindervolu=newCylinder(3.5,8);//創(chuàng)建對象并調(diào)用構(gòu)造方法System.out.println("圓柱底積="+volu.area());System.out.println("圓柱體體積="+volu.volume());}}【例7.4】續(xù)12/27/202218doublevolume()【例7.4】續(xù)12/18/20程序運(yùn)行結(jié)果如下:圓柱底積=38.465圓柱體體積=307.72【例7.4】續(xù)12/27/202219程序運(yùn)行結(jié)果如下:【例7.4】續(xù)12/18/202219構(gòu)造方法的特殊性主要體現(xiàn)在如下幾個(gè)方面:1.構(gòu)造方法的方法名與類名相同;2.構(gòu)造方法沒有返回值,也不能寫void;3.構(gòu)造方法的主要作用是完成對類對象的初始化工作;4.構(gòu)造方法一般不能由編程人員顯式地直接調(diào)用,而是用new來調(diào)用;5.在創(chuàng)建一個(gè)類的對象的同時(shí),系統(tǒng)會自動(dòng)調(diào)用該類的構(gòu)造方法為新對象初始化。12/27/202220構(gòu)造方法的特殊性主要體現(xiàn)在如下幾個(gè)方面:12/18/2022細(xì)心的讀者可能會發(fā)現(xiàn),在例7.4以前的例子中均沒有定義構(gòu)造方法,依然可以創(chuàng)建新的對象,并能正確的執(zhí)行程序,這是因?yàn)槿绻÷詷?gòu)造方法,Java會自動(dòng)調(diào)用默認(rèn)的構(gòu)造方法(defaultconstructor)。默認(rèn)的構(gòu)造方法沒有參數(shù),在其方法體中也沒有任何代碼,即什么也不做。如果上面例子中的Cylinder類沒有定義構(gòu)造方法,則系統(tǒng)會產(chǎn)生默認(rèn)的構(gòu)造方法如下:Cylinder(){}7.3.2默認(rèn)的構(gòu)造方法12/27/202221細(xì)心的讀者可能會發(fā)現(xiàn),在例7.4以前的例子中均沒有定義構(gòu)造方

一般情況下,類都有一個(gè)至多個(gè)構(gòu)造方法。但由于構(gòu)造方法與類同名,所以當(dāng)一個(gè)類有多個(gè)構(gòu)造方法時(shí),則這多個(gè)構(gòu)造方法可以重載。

7.3.3構(gòu)造方法的重載

構(gòu)造方法重載的應(yīng)用見教材【例7.5】

。

12/27/202222一般情況下,類都有一個(gè)至多個(gè)構(gòu)造方法。但由于構(gòu)造方法與類

從某一構(gòu)造方法內(nèi)調(diào)用另一構(gòu)造方法,是通過關(guān)鍵字this來調(diào)用的。見教材例【例7.6】

。7.3.4從一個(gè)構(gòu)造方法調(diào)用另一個(gè)構(gòu)造方法12/27/202223從某一構(gòu)造方法內(nèi)調(diào)用另一構(gòu)造方法,是通過關(guān)鍵字this來

構(gòu)造方法一般都是公有(public)的,而不可以聲明為私有的,這是因?yàn)樗鼈冊趧?chuàng)建對象時(shí),是在類的外部被系統(tǒng)自動(dòng)調(diào)用的。如果構(gòu)造方法被聲明為private,則無法在該構(gòu)造方法所在的類以外的地方被調(diào)用,但在該類的內(nèi)部還是可以被調(diào)用的。

見教材例公共構(gòu)造方法與私有構(gòu)造方法12/27/202224構(gòu)造方法一般都是公有(public)的,而不可以聲明為私

static稱為靜態(tài)修飾符,它可以修飾類中的成員。被static修飾的成員被稱為靜態(tài)成員,也稱為類成員,否則不用static修飾的成員稱為實(shí)例成員。7.4靜態(tài)成員12/27/202225static稱為靜態(tài)修飾符,它可以修飾類中的成員。被st

在類定義中如果成員變量或成員方法沒有用static來修飾,則該成員就是實(shí)例成員。對實(shí)例成員,我們并不陌生,因?yàn)樵诖酥熬帉懙某绦蛑?,用到的都是?shí)例成員。7.4.1實(shí)例成員12/27/202226在類定義中如果成員變量或成員方法沒有用static用static修飾的成員變量稱為“靜態(tài)變量”,靜態(tài)變量也稱為類變量。靜態(tài)變量是隸屬于類的變量,而不是屬于任何一個(gè)類的具體對象。

換句話說就是,靜態(tài)變量不需要實(shí)例化就可以使用。當(dāng)然也可以通過實(shí)例對象來訪問靜態(tài)變量。使用格式是:類名.靜態(tài)變量名對象名.靜態(tài)變量名7.4.2靜態(tài)變量12/27/202227用static修飾的成員變量稱為“靜態(tài)變量”,靜態(tài)變量也稱為//app7_8.java靜態(tài)變量的使用classCylinder//定義類Cylinder{privatestaticintnum=0;//聲明num為靜態(tài)變量privatestaticdoublepi=3.14;//聲明pi為靜態(tài)變量,并賦初值privatedoubleradius;privateintheight;publicCylinder(doubler,inth)//定義有2個(gè)參數(shù)的構(gòu)造方法{radius=r;height=h;num++;//當(dāng)構(gòu)造方法Cylinder()被調(diào)用時(shí),num便加1}publicvoidcount()//count()方法用來顯示目前創(chuàng)建對象的個(gè)數(shù){System.out.print(“創(chuàng)建了"+num+”個(gè)對象:”);}【例7.8】將Cylinder類里的變量pi和num聲明為靜態(tài)變量。12/27/202228//app7_8.java靜態(tài)變量的使用【例7.

doublearea(){returnpi*radius*radius;}doublevolume(){returnarea()*height;}}publicclassapp7_8//主類{publicstaticvoidmain(Stringargs[]){Cylindervolu1=newCylinder(2.5,5);volu1.count();System.out.println("圓柱1的體積="+volu1.volume());Cylindervolu2=newCylinder(1.0,2);volu2.count();System.out.println("圓柱2的體積="+volu2.volume());}}【例7.8】續(xù)12/27/202229doublearea()【例7.8】續(xù)12/18/20程序運(yùn)行結(jié)果為:創(chuàng)建了1個(gè)對象:圓柱1的體積=98.125創(chuàng)建了2個(gè)對象:圓柱2的體積=6.28【例7.8】續(xù)12/27/202230程序運(yùn)行結(jié)果為:【例7.8】續(xù)12/18/202230與靜態(tài)變量相似,用static修飾符修飾的方法是屬于類的靜態(tài)方法,又稱為類方法。靜態(tài)方法實(shí)質(zhì)是屬于整個(gè)類的方法,而不加static修飾符的方法,是屬于某個(gè)具體對象的方法。7.4.3靜態(tài)方法靜態(tài)方法的應(yīng)用見教材【例7.9】

。12/27/202231與靜態(tài)變量相似,用static修飾符修飾的方法是屬于類的靜態(tài)靜態(tài)初始化器是由關(guān)鍵字static修飾的一對花括號“{}”括起來的語句組。它的作用與類的構(gòu)造方法有些相似,都是用來初始化工作的,但靜態(tài)初始化器與構(gòu)造方法有幾點(diǎn)根本的不同。7.4.4靜態(tài)初始化器12/27/202232靜態(tài)初始化器是由關(guān)鍵字static修飾的一對花括號“{}”括1.構(gòu)造方法是對每個(gè)新創(chuàng)建的對象初始化,而靜態(tài)初始化器是對類自身進(jìn)行初始化。2.構(gòu)造方法是在用new運(yùn)算符創(chuàng)建新對象時(shí)由系統(tǒng)自動(dòng)執(zhí)行,而靜態(tài)初始化器一般不能由程序來調(diào)用,它是在所屬的類被加載入內(nèi)存時(shí)由系統(tǒng)調(diào)用執(zhí)行。3.用new運(yùn)算符創(chuàng)建多少個(gè)新對象,構(gòu)造方法被調(diào)用多少次,但靜態(tài)初始化器則在類被加載入內(nèi)存時(shí)只執(zhí)行一次,與創(chuàng)建多少個(gè)對象無關(guān)。4.不同于構(gòu)造方法,靜態(tài)初始化器不是方法,因而沒有方法名、返回值和參數(shù)。12/27/2022331.構(gòu)造方法是對每個(gè)新創(chuàng)建的對象初始化,而靜態(tài)初始化器是對類聲明一個(gè)對象的格式與聲明一般變量相似,即“類名對象名”。因而也可以將對象稱之為“類類型的變量”,它屬于非基本類型的變量。實(shí)際上對象是一種引用型的變量,而引用型變量實(shí)際上保存的是對象在內(nèi)存中的地址(也稱為對象的句柄),所以就對象的功能而言,對象是“指向?qū)ο蟮淖兞俊?,但就其類型而言它是屬于“類類型的變量”?/p>

7.5對象的應(yīng)用12/27/202234聲明一個(gè)對象的格式與聲明一般變量相似,即“類名對象名”。因在使用對象時(shí),一般是先用new運(yùn)算符創(chuàng)建對象,然后再對其進(jìn)行操作處理。但有時(shí)沒有使用new運(yùn)算符創(chuàng)建新對象,仍然可以對其進(jìn)行賦值。7.5.1對象的賦值與比較12/27/202235在使用對象時(shí),一般是先用new運(yùn)算符創(chuàng)建對象,然后再對其進(jìn)行引用變量不但可以作為參數(shù)進(jìn)行傳遞,而且也可以作為方法的返回值。若要方法返回類類型的變量,只須在方法聲明的前面加上要返回的類即可。7.5.2引用變量作為方法的返回值12/27/202236引用變量不但可以作為參數(shù)進(jìn)行傳遞,而且也可以作為方法的返回值在第5章中介紹過數(shù)組,數(shù)組元素可以是存放各種類型的數(shù)據(jù),當(dāng)然數(shù)組也可以用來存放對象。用數(shù)組來存放對象,一般要經(jīng)過如下的兩個(gè)步驟:1.聲明類類型的數(shù)組變量,并用new運(yùn)算符分配內(nèi)存空間給數(shù)組;2.用new創(chuàng)建新的對象,分配內(nèi)存空間給它,并讓數(shù)組元素指向它。下面舉例說明。7.5.3類類型的數(shù)組12/27/202237在第5章中介紹過數(shù)組,數(shù)組元素可以是存放各種類型的數(shù)據(jù),當(dāng)然//app7_13.java對象數(shù)組的應(yīng)用classPerson//定義類Person{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;}publicvoidshow(){System.out.println(“姓名:“+name+”年齡:”+age);}}【例7.13】對象數(shù)組的應(yīng)用。以個(gè)人類Person為類型,創(chuàng)建數(shù)組

。12/27/202238//app7_13.java對象數(shù)組的應(yīng)用【例7.1publicclassapp7_13//主類{publicstaticvoidmain(Stringargs[]){PersonPer[];//聲明類類型的數(shù)組Per=newPerson[3];//用new為數(shù)組分配內(nèi)存空間Per[0]=newPerson(“張三”,20);//用new運(yùn)算符創(chuàng)建新對象,并分Per[1]=newPerson(“李四”,21);//配給數(shù)組元素Per[2]=newPerson(“王二”,19);Per[2].show();//利用對象Per[2]調(diào)用show()方法Per[0].show();//利用對象Per[0]調(diào)用show()方法}}【例7.13】續(xù)12/27/202239publicclassapp7_13//主程序執(zhí)行結(jié)果如下:姓名:王二年齡:19姓名:張三年齡:20【例7.13】續(xù)12/27/202240程序執(zhí)行結(jié)果如下:【例7.13】續(xù)12/18/202240通過例7.13可以知道,數(shù)組也可以用來存放對象。因此也可將對象數(shù)組作為參數(shù)傳遞到方法里。下面舉例說明。

7.5.4以對象數(shù)組為參數(shù)進(jìn)行方法調(diào)用12/27/202241通過例7.13可以知道,數(shù)組也可以用來存放對象。因此也可將對//app7_14.java以對象數(shù)組為參數(shù)進(jìn)行方法調(diào)用classPerson//定義類Person{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;}publicstaticintmin_age(Personp[])//以對象數(shù)組作為參數(shù)傳遞給方法{intmin=200;for(inti=0;i<p.length;i++)if(p[i].age<min)min=p[i].age;returnmin;}}【例7.14】以對象數(shù)組作為參數(shù)傳遞給方法。12/27/202242//app7_14.java以對象數(shù)組為參數(shù)進(jìn)行方publicclassapp7_14{publicstaticvoidmain(Stringargs[]){PersonPer[]=newPerson[3];Per[0]=newPerson(“張三”,20);Per[1]=newPerson(“李四”,21);Per[2]=newPerson(“王二”,19);System.out.println(“最小的年齡為:”+Person.min_age(Per));}}【例7.14】續(xù)12/27/202243publicclassapp7_14【例7.14】續(xù)12程序的執(zhí)行結(jié)果為:最小的年齡為:19【例7.14】續(xù)12/27/202244程序的執(zhí)行結(jié)果為:【例7.14】續(xù)12/18/202244謝謝12/27/202245謝謝12/18/202245第7章

Java類的特性

12/27/202246第7章Java類的特性12/18/20221通過本章的學(xué)習(xí),主要掌握以下知識點(diǎn):類的私有成員與公共成員

方法的重載

構(gòu)造方法

實(shí)例成員與靜態(tài)成員

12/27/202247通過本章的學(xué)習(xí),主要掌握以下知識點(diǎn):12/18/20222本章的重點(diǎn):

方法的重載

構(gòu)造方法

本章的難點(diǎn):靜態(tài)成員12/27/202248本章的重點(diǎn):12/18/202237.1類的私有成員與公共成員在第6章的例子中,可以看到類的成員變量pi、radius和height可以在類Cylinder的外部任意修改。這雖然方便了程序員靈活的使用,但也存在弊端。

12/27/2022497.1類的私有成員與公共成員在第6章的例子中,可以看到類的

如果沒有一個(gè)機(jī)制來限制對類中成員的訪問,則很可能會造成錯(cuò)誤的輸入。為了防止這種情況的發(fā)生,Java提供了私有成員訪問控制修飾符private。

下面來舉例說明。7.1.1私有成員12/27/202250如果沒有一個(gè)機(jī)制來限制對類中成員的訪問,則很可能會造成錯(cuò)

【例7.1】在圓柱體類Cylinder中,創(chuàng)建類的私有成員,使之在該類的外部無法訪問該成員。

//app7_1.java定義私有成員,使之無法在類外被訪問classCylinder//定義Cylinder類{

privatedoubleradius;//將數(shù)據(jù)成員radius聲明為私有的

privateintheight;//將數(shù)據(jù)成員height聲明為私有的

privatedoublepi=3.14;//將數(shù)據(jù)成員pi聲明為私有的,并賦初值doublearea(){returnpi*radius*radius;//在Cylinder類內(nèi)部,故可訪問私有成員}doublevolume(){returnarea()*height;//在類內(nèi)可以訪問私有成員height}}12/27/202251【例7.1】在圓柱體類Cylinder中,創(chuàng)建類的私有成【例7.1】續(xù)publicclassapp7_1//定義公共主類{publicstaticvoidmain(Stringargs[]){Cylindervolu;volu=newCylinder();volu.radius=2.8;//錯(cuò)誤!在類的外部,不能直接訪問私有成員。volu.height=-5;//錯(cuò)誤!在類的外部,不能直接訪問私有成員。System.out.println("底圓半徑="+volu.radius);System.out.println("圓柱的高="+volu.height);System.out.print("圓柱");System.out.println(“底面積=”+volu.area());//正確!System.out.println("圓柱體體積="+volu.volume());//正確!}}12/27/202252【例7.1】續(xù)publicclassapp7_17.1.2公共成員如果在類的成員聲明的前面加上修飾符public,則表示該成員可以被所有其他的類所訪問。由于public修飾符會造成安全性和數(shù)據(jù)封裝性的下降,所以一般應(yīng)減少公共成員的使用。下面舉例說明如何利用公共方法來訪問私有成員變量。

12/27/2022537.1.2公共成員如果在類的成員聲明的前面加上修飾符pub

【例7.2】創(chuàng)建圓柱體類Cylinder的公共成員方法,來訪問類內(nèi)的私有成員變量

。//app7_2.java定義公共方法來訪問私有成員classCylinder{privatedoubleradius;//聲明私有數(shù)據(jù)成員privateintheight;privatedoublepi=3.14;publicvoidSetCylinder(doubler,inth)//聲明具有2個(gè)參數(shù)的公共方法{//用于對私有數(shù)據(jù)進(jìn)行訪問if(r>0&&h>0){radius=r;height=h;}elseSystem.out.println(“您的數(shù)據(jù)有錯(cuò)誤?。 ?;}12/27/202254【例7.2】創(chuàng)建圓柱體類Cylinder的公共成員方法,【例7.2】續(xù)doublearea(){returnpi*radius*radius;//在類內(nèi)可以訪問私有成員radius和pi}doublevolume(){returnarea()*height;//在類內(nèi)可以訪問私有成員height}}publicclassapp7_2//定義公共主類{publicstaticvoidmain(Stringargs[]){Cylindervolu=newCylinder();volu.SetCylinder(2.5,-5);//通過公共方法SetCylinder()訪問私有數(shù)據(jù)System.out.println("圓柱底面積="+volu.area());System.out.println("圓柱體體積="+volu.volume());}}12/27/202255【例7.2】續(xù)doublearea()12/18/20程序運(yùn)行結(jié)果如下:您的數(shù)據(jù)有錯(cuò)誤??!圓柱底面積=0.0圓柱體體積=0.0【例7.2】續(xù)12/27/202256程序運(yùn)行結(jié)果如下:【例7.2】續(xù)12/18/2022117.1.3友元若在類成員的前面加上訪問控制符friendly,說明該成員是友元。友元訪問控制符可以省略。也就是說在類內(nèi)聲明類成員時(shí),不加任何訪問控制修飾符,則該成員是一個(gè)友元。一個(gè)成員被聲明為友元,表示這個(gè)成員只能被同一個(gè)包中的類所訪問,但其他包中的類不能訪問該成員。同理,對于類來說,如果一個(gè)類沒有訪問控制符,說明它具有缺省訪問控制特性。這種缺省的訪問控制權(quán)規(guī)定只能被同一個(gè)包中的類訪問和引用,而不可以被其他包中的類所使用。

12/27/2022577.1.3友元若在類成員的前面加上訪問控制符friendl7.2方法的重載方法的重載是實(shí)現(xiàn)“多態(tài)”的一種方法。在面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中,有一些方法的含義相同,但帶有不同的參數(shù),這些方法使用相同的名字,這就叫方法的重載(Overloading)。也就是說,重載是指相同的方法名稱,如果參數(shù)個(gè)數(shù)不同,或者是參數(shù)個(gè)數(shù)相同,但類型不同,則方法就具有不同的功能。12/27/2022587.2方法的重載方法的重載是實(shí)現(xiàn)“多態(tài)”的一種方法。在面向注意:方法的重載中參數(shù)的類型是關(guān)鍵,僅僅是參數(shù)的變量名不同是不行的。也就是說參數(shù)的列表必須不同,即:或者參數(shù)個(gè)數(shù)不同,或者參數(shù)類型不同,或者參數(shù)的順序不同。方法的重載的應(yīng)用見教材【例7.3】12/27/202259注意:方法的重載中參數(shù)的類型是關(guān)鍵,僅僅是參數(shù)的變量7.3構(gòu)造方法前面所介紹的由Cylinder類所創(chuàng)建的對象,其成員變量都是在對象建立之后,再由相應(yīng)的方法來賦值。如果一個(gè)對象在被創(chuàng)建時(shí)就完成了所有的初始化工作,將會很簡潔。因此Java在類里提供了一個(gè)特殊的成員方法――構(gòu)造方法。

12/27/2022607.3構(gòu)造方法前面所介紹的由Cylinder類所創(chuàng)建的對象構(gòu)造方法(constructor)是一種特殊的方法,它是在對象被創(chuàng)建時(shí)初始化對象的成員的方法。構(gòu)造方法的名稱必須與它所在的類名完全相同。7.3.1構(gòu)造方法的作用與定義12/27/202261構(gòu)造方法(constructor)是一種特殊的方法,它是在對//app7_4.java構(gòu)造方法的使用classCylinder//定義類Cylinder{privatedoubleradius;privateintheight;privatedoublepi=3.14;publicCylinder(doubler,inth)//定義構(gòu)造方法{radius=r;height=h;}doublearea(){returnpi*radius*radius;}【例7.4】利用構(gòu)造方法來初始化圓柱體類Cylinder的成員變量

。12/27/202262//app7_4.java構(gòu)造方法的使用【例7doublevolume(){returnarea()*height;}}publicclassapp7_4//定義主類{publicstaticvoidmain(Stringargs[]){Cylindervolu=newCylinder(3.5,8);//創(chuàng)建對象并調(diào)用構(gòu)造方法System.out.println("圓柱底積="+volu.area());System.out.println("圓柱體體積="+volu.volume());}}【例7.4】續(xù)12/27/202263doublevolume()【例7.4】續(xù)12/18/20程序運(yùn)行結(jié)果如下:圓柱底積=38.465圓柱體體積=307.72【例7.4】續(xù)12/27/202264程序運(yùn)行結(jié)果如下:【例7.4】續(xù)12/18/202219構(gòu)造方法的特殊性主要體現(xiàn)在如下幾個(gè)方面:1.構(gòu)造方法的方法名與類名相同;2.構(gòu)造方法沒有返回值,也不能寫void;3.構(gòu)造方法的主要作用是完成對類對象的初始化工作;4.構(gòu)造方法一般不能由編程人員顯式地直接調(diào)用,而是用new來調(diào)用;5.在創(chuàng)建一個(gè)類的對象的同時(shí),系統(tǒng)會自動(dòng)調(diào)用該類的構(gòu)造方法為新對象初始化。12/27/202265構(gòu)造方法的特殊性主要體現(xiàn)在如下幾個(gè)方面:12/18/2022細(xì)心的讀者可能會發(fā)現(xiàn),在例7.4以前的例子中均沒有定義構(gòu)造方法,依然可以創(chuàng)建新的對象,并能正確的執(zhí)行程序,這是因?yàn)槿绻÷詷?gòu)造方法,Java會自動(dòng)調(diào)用默認(rèn)的構(gòu)造方法(defaultconstructor)。默認(rèn)的構(gòu)造方法沒有參數(shù),在其方法體中也沒有任何代碼,即什么也不做。如果上面例子中的Cylinder類沒有定義構(gòu)造方法,則系統(tǒng)會產(chǎn)生默認(rèn)的構(gòu)造方法如下:Cylinder(){}7.3.2默認(rèn)的構(gòu)造方法12/27/202266細(xì)心的讀者可能會發(fā)現(xiàn),在例7.4以前的例子中均沒有定義構(gòu)造方

一般情況下,類都有一個(gè)至多個(gè)構(gòu)造方法。但由于構(gòu)造方法與類同名,所以當(dāng)一個(gè)類有多個(gè)構(gòu)造方法時(shí),則這多個(gè)構(gòu)造方法可以重載。

7.3.3構(gòu)造方法的重載

構(gòu)造方法重載的應(yīng)用見教材【例7.5】

。

12/27/202267一般情況下,類都有一個(gè)至多個(gè)構(gòu)造方法。但由于構(gòu)造方法與類

從某一構(gòu)造方法內(nèi)調(diào)用另一構(gòu)造方法,是通過關(guān)鍵字this來調(diào)用的。見教材例【例7.6】

。7.3.4從一個(gè)構(gòu)造方法調(diào)用另一個(gè)構(gòu)造方法12/27/202268從某一構(gòu)造方法內(nèi)調(diào)用另一構(gòu)造方法,是通過關(guān)鍵字this來

構(gòu)造方法一般都是公有(public)的,而不可以聲明為私有的,這是因?yàn)樗鼈冊趧?chuàng)建對象時(shí),是在類的外部被系統(tǒng)自動(dòng)調(diào)用的。如果構(gòu)造方法被聲明為private,則無法在該構(gòu)造方法所在的類以外的地方被調(diào)用,但在該類的內(nèi)部還是可以被調(diào)用的。

見教材例公共構(gòu)造方法與私有構(gòu)造方法12/27/202269構(gòu)造方法一般都是公有(public)的,而不可以聲明為私

static稱為靜態(tài)修飾符,它可以修飾類中的成員。被static修飾的成員被稱為靜態(tài)成員,也稱為類成員,否則不用static修飾的成員稱為實(shí)例成員。7.4靜態(tài)成員12/27/202270static稱為靜態(tài)修飾符,它可以修飾類中的成員。被st

在類定義中如果成員變量或成員方法沒有用static來修飾,則該成員就是實(shí)例成員。對實(shí)例成員,我們并不陌生,因?yàn)樵诖酥熬帉懙某绦蛑?,用到的都是?shí)例成員。7.4.1實(shí)例成員12/27/202271在類定義中如果成員變量或成員方法沒有用static用static修飾的成員變量稱為“靜態(tài)變量”,靜態(tài)變量也稱為類變量。靜態(tài)變量是隸屬于類的變量,而不是屬于任何一個(gè)類的具體對象。

換句話說就是,靜態(tài)變量不需要實(shí)例化就可以使用。當(dāng)然也可以通過實(shí)例對象來訪問靜態(tài)變量。使用格式是:類名.靜態(tài)變量名對象名.靜態(tài)變量名7.4.2靜態(tài)變量12/27/202272用static修飾的成員變量稱為“靜態(tài)變量”,靜態(tài)變量也稱為//app7_8.java靜態(tài)變量的使用classCylinder//定義類Cylinder{privatestaticintnum=0;//聲明num為靜態(tài)變量privatestaticdoublepi=3.14;//聲明pi為靜態(tài)變量,并賦初值privatedoubleradius;privateintheight;publicCylinder(doubler,inth)//定義有2個(gè)參數(shù)的構(gòu)造方法{radius=r;height=h;num++;//當(dāng)構(gòu)造方法Cylinder()被調(diào)用時(shí),num便加1}publicvoidcount()//count()方法用來顯示目前創(chuàng)建對象的個(gè)數(shù){System.out.print(“創(chuàng)建了"+num+”個(gè)對象:”);}【例7.8】將Cylinder類里的變量pi和num聲明為靜態(tài)變量。12/27/202273//app7_8.java靜態(tài)變量的使用【例7.

doublearea(){returnpi*radius*radius;}doublevolume(){returnarea()*height;}}publicclassapp7_8//主類{publicstaticvoidmain(Stringargs[]){Cylindervolu1=newCylinder(2.5,5);volu1.count();System.out.println("圓柱1的體積="+volu1.volume());Cylindervolu2=newCylinder(1.0,2);volu2.count();System.out.println("圓柱2的體積="+volu2.volume());}}【例7.8】續(xù)12/27/202274doublearea()【例7.8】續(xù)12/18/20程序運(yùn)行結(jié)果為:創(chuàng)建了1個(gè)對象:圓柱1的體積=98.125創(chuàng)建了2個(gè)對象:圓柱2的體積=6.28【例7.8】續(xù)12/27/202275程序運(yùn)行結(jié)果為:【例7.8】續(xù)12/18/202230與靜態(tài)變量相似,用static修飾符修飾的方法是屬于類的靜態(tài)方法,又稱為類方法。靜態(tài)方法實(shí)質(zhì)是屬于整個(gè)類的方法,而不加static修飾符的方法,是屬于某個(gè)具體對象的方法。7.4.3靜態(tài)方法靜態(tài)方法的應(yīng)用見教材【例7.9】

。12/27/202276與靜態(tài)變量相似,用static修飾符修飾的方法是屬于類的靜態(tài)靜態(tài)初始化器是由關(guān)鍵字static修飾的一對花括號“{}”括起來的語句組。它的作用與類的構(gòu)造方法有些相似,都是用來初始化工作的,但靜態(tài)初始化器與構(gòu)造方法有幾點(diǎn)根本的不同。7.4.4靜態(tài)初始化器12/27/202277靜態(tài)初始化器是由關(guān)鍵字static修飾的一對花括號“{}”括1.構(gòu)造方法是對每個(gè)新創(chuàng)建的對象初始化,而靜態(tài)初始化器是對類自身進(jìn)行初始化。2.構(gòu)造方法是在用new運(yùn)算符創(chuàng)建新對象時(shí)由系統(tǒng)自動(dòng)執(zhí)行,而靜態(tài)初始化器一般不能由程序來調(diào)用,它是在所屬的類被加載入內(nèi)存時(shí)由系統(tǒng)調(diào)用執(zhí)行。3.用new運(yùn)算符創(chuàng)建多少個(gè)新對象,構(gòu)造方法被調(diào)用多少次,但靜態(tài)初始化器則在類被加載入內(nèi)存時(shí)只執(zhí)行一次,與創(chuàng)建多少個(gè)對象無關(guān)。4.不同于構(gòu)造方法,靜態(tài)初始化器不是方法,因而沒有方法名、返回值和參數(shù)。12/27/2022781.構(gòu)造方法是對每個(gè)新創(chuàng)建的對象初始化,而靜態(tài)初始化器是對類聲明一個(gè)對象的格式與聲明一般變量相似,即“類名對象名”。因而也可以將對象稱之為“類類型的變量”,它屬于非基本類型的變量。實(shí)際上對象是一種引用型的變量,而引用型變量實(shí)際上保存的是對象在內(nèi)存中的地址(也稱為對象的句柄),所以就對象的功能而言,對象是“指向?qū)ο蟮淖兞俊?,但就其類型而言它是屬于“類類型的變量”?/p>

7.5對象的應(yīng)用12/27/202279聲明一個(gè)對象的格式與聲明一般變量相似,即“類名對象名”。因在使用對象時(shí),一般是先用new運(yùn)算符創(chuàng)建對象,然后再對其進(jìn)行操作處理。但有時(shí)沒有使用new運(yùn)算符創(chuàng)建新對象,仍然可以對其進(jìn)行賦值。7.5.1對象的賦值與比較12/27/202280在使用對象時(shí),一般是先用new運(yùn)算符創(chuàng)建對象,然后再對其進(jìn)行引用變量不但可以作為參數(shù)進(jìn)行傳遞,而且也可以作為方法的返回值。若要方法返回類類型的變量,只須在方法聲明的前面加上要返回的類即可。7.5.2引用變量作為方法的返回值12/27/202281引用變量不但可以作為參數(shù)進(jìn)行傳遞,而且也可以作為方法的返回值在第5章中介紹過數(shù)組,數(shù)組元素可以是存放各種類型的數(shù)據(jù),當(dāng)然數(shù)組也可以用來存放對象。用數(shù)組來存放對象

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論