第四章-類與對象_第1頁
第四章-類與對象_第2頁
第四章-類與對象_第3頁
第四章-類與對象_第4頁
第四章-類與對象_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四章類與對象14.1類與對象的概念

4.2類的定義

4.3對象4.4成員變量4.5成員方法

4.6類的組織方式——包

4.7訪問權(quán)限

4.8內(nèi)部類4.9可變參數(shù)24.1類與對象的概念

現(xiàn)實(shí)世界中的任何事物都是對象。

所有的事物都有它的屬性和行為。

屬性表示事物的靜態(tài)特征,在某個時刻各個屬性的取值反映事物的狀態(tài);行為表示事物的動態(tài)特征,一個行為可能會影響或改變事物的狀態(tài)。人們通過屬性和行為來區(qū)分事物。3概念名稱:人屬性:性別、年齡、身高、體重等行為:直立行走、會說話、能勞動等人腦的概念世界張三李四王五陳六現(xiàn)實(shí)世界抽象實(shí)例化張三李四王五陳六計算機(jī)世界類名:人變量:性別、年齡、身高、體重等方法:直立行走、會說話、能勞動等映射映射4類與對象的關(guān)系在計算機(jī)世界中,類是人腦概念世界的軟件模型,由變量和方法組成,它定義了對象的本質(zhì)屬性和共同行為,是創(chuàng)造對象的“模板”。對象是對現(xiàn)實(shí)世界中實(shí)體的描述,是現(xiàn)實(shí)世界中事物的軟件模型,由數(shù)據(jù)(變量值)和方法組成。并且通過對類的實(shí)例化產(chǎn)生對象,進(jìn)而引用對象。簡而言之,類是對象的模板,對象是類的實(shí)例。54.2類的定義4.2.1類定義的基本形式4.2.2類定義的一般形式64.2.1類定義的基本形式定義的基本形式是:class類名{成員變量;成員方法;}

⑴class是關(guān)鍵字,表明其后定義的是一個類。⑵類名是用戶為該類所起的名字,它必須是一個合法的Java標(biāo)識符。⑶類體中的成員變量可以有多個,成員方法也可以有多個。7【例4-1】定義一個表示圓的類

classCircle{

//成員變量:圓的半徑doubleradius;

//成員方法:計算圓的面積doublegetArea(){ returnradius*radius*Math.PI;}

//成員方法:計算圓的周長doublegetPerimeter(){ return2*radius*Math.PI;}}【模仿例4-1】定義矩形類、三角形類、梯形類。8【例4-2】在Java語言中,定義人類。編程思路:首先,將現(xiàn)實(shí)世界中各種人抽象成人腦概念世界中的概念“人”。它包括屬性:姓名(name)、性別(sex)、年齡(age)等狀態(tài)信息,和行為:直立行走(walk)、會說話(speak)、能勞動(work)等。其次,在Java程序中,用變量表示狀態(tài)信息,用方法表示行為。9classHumankind{ Stringname; charsex; intage; intheight; floatavoirdupois; voidwalk(){ System.out.println(name+"canwalk."); } voidspeak(){ System.out.println(name+"canspeak."); } voidwork(){ System.out.println(name+"canwork."); }}10【例4-3】定義職員類

編程思路:首先,將現(xiàn)實(shí)世界中各種職員抽象成人腦概念世界中的概念“職員”。包括屬性和行為。其次,為了解決工資管理問題,性別、年齡、身高、體重等屬性以及會說話、能勞動等行為,與工資管理關(guān)系不大,可被忽略。這樣,就抽象成人腦概念世界中的概念“職工”,它包括工號(id)、姓名(name)、職務(wù)(post)、工資(salary)等屬性,以及升職(changePost)、調(diào)資(changeSalary)、打印職工信息(print)等行為。。11classEmployee{ intid; Stringname,post; longsalary;

voidchangePost(StringnewPost){ post=newPost; } voidchangeSalary(longamount){ salary=salary+amount; } voidprint(){ System.out.println("工號:"+id+"\t姓名:"+name+ "\t職務(wù):"+post+"\t月薪:"+salary); }}124.2.2類定義的一般形式類的定義格式:類修飾符class類名稱[extends父類名稱][implements接口名稱列表]{成員變量的定義及初始化成員方法的定義及初始化}類的定義分為三個部分:IS,HAS,DOES。類的并列和嵌套在一個程序中,有時需要定義多個類。多個類的定義形式有兩種:并列和嵌套。134.3

對象

4.3.1對象的聲明

4.3.2對象的創(chuàng)建與初始化

4.3.3對象的引用和清除144.3.1對象的聲明對象聲明的格式:

類名對象變量名;其中,類名為引用類型(包括類、接口和數(shù)組)。聲明不為對象分配空間,只為引用型變量分配一個空間,用來存放引用值。例如下列語句:

HumankindzhangSan,liSi;Humankind是已經(jīng)定義的類,是類型。zhangSan,liSi為引用變量。引用類型變量存儲一個對象的引用值,不是對象本身。

154.3.1對象的聲明(續(xù))熟悉C語言的同學(xué),可進(jìn)行如下類比。在C語言中定義int*p;//p是一個指針變量,它存放某個整型變量的地址,不存放某個整型值。structNode{intdata;structNode*next;}*p;//p是一個指針變量,它存放Node結(jié)構(gòu)體類型的某個變量地址,不存放Node結(jié)構(gòu)體類型某個變量的值。在Java中,引用型變量就相當(dāng)于指針變量,引用值就相當(dāng)于變量地址,對象就相當(dāng)于Node結(jié)構(gòu)體類型某個變量的值。引用類型變量只存儲某個對象的引用值,不存儲對象本身。164.3.2對象的創(chuàng)建與初始化

實(shí)例創(chuàng)建表達(dá)式的一般格式如下:

new類名([實(shí)參表]);實(shí)例創(chuàng)建表達(dá)式用于創(chuàng)建指定類的一個實(shí)例。其具體功能包括:(1)為實(shí)例分配內(nèi)存空間;(2)初始化實(shí)例變量;(3)返回該實(shí)例的引用值。根據(jù)例4-1,創(chuàng)建zhangSan對象的過程如下:①HumankindzhangSan;②zhangSan=newHumankind();174.3.3對象的引用和清除

引用成員變量的格式為:

對象變量名.成員變量名實(shí)例創(chuàng)建表達(dá)式用于創(chuàng)建指定類的一個實(shí)例。其具體功能包括:(1)為實(shí)例分配內(nèi)存空間;(2)初始化實(shí)例變量;(3)返回該實(shí)例的引用值。根據(jù)例4-1,創(chuàng)建zhangSan對象的過程如下:①HumankindzhangSan;②zhangSan=newHumankind();184.3.3對象的引用和清除(續(xù))

引用成員方法的格式為:

對象變量名.成員方法名([參數(shù)表]);

對象的清除是當(dāng)不存在對某一對象的引用時,就釋放該對象所占用的內(nèi)存空間。對象清除的基本方法有:⑴依靠垃圾回收機(jī)制回收內(nèi)存。它周期性地回收不用對象所占用的內(nèi)存。⑵調(diào)用System.gc(),請求垃圾回收器釋放不用對象所占內(nèi)存。⑶Java系統(tǒng)開始時,自動調(diào)用Java.lang.Object.finalize()釋放對象所占內(nèi)存。⑷在程序中調(diào)用重寫的finalize()釋放對象所占內(nèi)存。對象清除是由垃圾回收器自動完成的,一般來說,程序員不需要做任何工作。

19【例4-4】定義圓類,創(chuàng)建圓對象,計算周長和面積

classCircle{

//成員變量:圓的半徑doubleradius;

//成員方法:計算圓的面積doublegetArea(){ returnradius*radius*Math.PI;}

//成員方法:計算圓的周長doublegetPerimeter(){ return2*radius*Math.PI;}}20【例4-4】創(chuàng)建圓對象,計算周長和面積(續(xù))

classEx4_4{ publicstaticvoidmain(String[]args){ //圓類對象obj的創(chuàng)建及初始化Circleobj=newCircle();

obj.radius=10;//obj成員變量radius的引用 //obj成員方法getArea()的引用System.out.println("Area="+obj.getArea());//obj成員方法getPerimeter()的引用 System.out.println("Perimeter="+obj.getPerimeter()); }}【例4-5】編寫一個程序,創(chuàng)建張三、李四對象,測試?yán)?-2的Humankind類。21classHumankind{ Stringname; charsex; intage; intheight; floatavoirdupois; voidwalk(){ System.out.println(name+"canwalk."); } voidspeak(){ System.out.println(name+"canspeak."); } voidwork(){ System.out.println(name+"canwork."); }}22classEx4_5{ publicstaticvoidmain(String[]args[]){ HumankindzhangSan; zhangSan=newHumankind(); HumankindliSi=newHumankind(); //zhangSan對象成員變量的引用(賦值) zhangS="張三"; zhangSan.sex='m'; zhangSan.age=18; zhangSan.height=170; zhangSan.avoirdupois=60.5f; //lisi對象成員變量的引用(賦值) liS="李四";liSi.sex='f'; liSi.age=20; liSi.height=180; liSi.avoirdupois=70.5f;23 //zhangSan對象成員變量的引用(取值) System.out.println("姓名"+"\t"+"性別"+"\t"+"年齡"+"\t"+"身高"+"\t"+"體重"); System.out.println(zhangS+"\t"+zhangSan.sex+"\t"+zhangSan.age+"\t"+zhangSan.height+"\t"+zhangSan.avoirdupois);//lisi對象成員變量的引用(取值)System.out.println(liS+"\t"+liSi.sex+"\t"+liSi.age+"\t"+liSi.height+"\t"+liSi.avoirdupois); //zhangSan對象成員方法的引用 zhangSan.walk(); zhangSan.speak(); zhangSan.work(); //lisi對象成員方法的引用 liSi.walk(); liSi.speak();liSi.work(); }}244.4

成員變量

4.4.1成員變量聲明的一般形式

4.4.2實(shí)例變量和類變量

4.4.3變量的初始化

4.4.3常量4.4.3變量的作用域254.4

成員變量在Java語言中,變量分為局部變量和成員變量兩大類。成員變量是指在類體內(nèi)且在方法體外定義的變量。其作用域是整個類。局部變量是指在方法體內(nèi)聲明的變量,其作用域是從聲明處開始至它所在的最小塊語句結(jié)束處。另外,方法中的形參、for語句中定義的循環(huán)變量也都屬于局部變量。264.4.1成員變量聲明的一般形式

成員變量聲明的一般格式是:[可訪問性修飾符][static][final][其它]類型名變量名[=初始化表達(dá)式][,變量名[=初始化表達(dá)式]]…;上述可選項(xiàng),其含義分別為:⑴可訪問性修飾符說明該變量的可訪問屬性,即定義可被訪問的范圍。這些修飾符是public、protected、private和默認(rèn)(或缺?。F溆梅ㄔ?.7訪問權(quán)限中詳細(xì)介紹。274.4.1成員變量聲明的一般形式(續(xù))

⑵被static修飾的成員變量稱為類變量(或靜態(tài)變量),而沒有被static修飾的成員變量稱為實(shí)例變量。類變量是屬于類;實(shí)例變量是屬于對象(或?qū)嵗?。⑶被final修飾的變量(局部變量或成員變量)通常被稱為有名常量。與普通變量不同,有名常量必須賦值且只能賦值一次。之后,有名常量的值就不能再被修改。⑷其它是指transient和volatile。transient:定義一個暫時變量,指示Java虛擬機(jī)該變量不是對象永久狀態(tài)的一部分,在對象序列化時不需要考慮。volatile:定義一個共享變量,告訴Java編譯器該變量的值可能會被當(dāng)前線程之外的其他線程改變。284.4.2實(shí)例變量和類變量

實(shí)例變量:在類體內(nèi)且在方法體外定義的變量,且變量名前沒有static修飾符。類變量:在類體內(nèi)且在方法體外定義的變量,且變量名前有static修飾符。局部變量:在方法體內(nèi)或塊內(nèi)定義的變量,變量名前只能用final修飾或沒有修飾符。29【例4-7】定義圓類Circle,它包含半徑、圓類對象的總個數(shù)和局部變量,并用測試類測試Circle類。classCircle{

staticinttotal=0;//類變量 doubleradius;//實(shí)例變量 voidprint(){ intvar_number=0;//局部變量 System.out.println("Circletotal="+total);var_number++; System.out.println("radius="+radius);var_number++; System.out.println("var_number="+var_number); } }30【例4-7】(續(xù))publicclassEx4_7{publicstaticvoidmain(String[]args){ Circleobject1,object2,object3; object1=newCircle(); object1.radius=10;object1.total++;object1.print(); object2=newCircle(); object2.radius=20;object2.total++;object2.print(); object3=newCircle(); object3.radius=30;object3.total++;object3.print();

31【例4-7】(續(xù)) System.out.println("total="+Circle.total); System.out.println("object1radius="+object1.radius);System.out.println("total="+object2.total); System.out.println("object2radius="+object2.radius);System.out.println("total="+Circle.total); System.out.println("object3radius="+object3.radius);}}32引用引用堆區(qū)方法區(qū)main()方法棧區(qū)Java棧區(qū)局部變量object3局部變量object1局部變量object2Circle類型信息(包含print()方法和靜態(tài)變量total)CircleTest類型信息(包含main()方法)object1實(shí)例radius:10object1實(shí)例radius:20object1實(shí)例radius:30運(yùn)行時數(shù)據(jù)區(qū)(內(nèi)存)引用33對象、類變量和實(shí)例變量在數(shù)據(jù)區(qū)的位置:①類變量和方法:方法區(qū)②對象:堆區(qū)③局部變量:Java棧區(qū)④引用型變量:引用型變量是局部變量時,它在Java棧區(qū)引用型變量是類的實(shí)例變量時,它在堆區(qū)引用型變量是靜態(tài)變量時,它在方法區(qū)344.4.3變量的初始化變量初始化是指變量定義以后,首次給它賦初始值的過程。成員變量(類變量和實(shí)例變量)的初始化:無論是實(shí)例變量還是類變量,在建立時,系統(tǒng)首先賦一個默認(rèn)的初始值。初始化為默認(rèn)值的規(guī)則為:⑴整數(shù)型(byte、short、int和long)基本類型變量的默認(rèn)值為0。⑵單精度浮點(diǎn)型(float)基本類型變量的默認(rèn)值為0.0f。354.4.3變量的初始化(續(xù))⑶雙精度浮點(diǎn)型(double)基本類型變量的默認(rèn)值為0.0d。⑷字符型(char)基本類型變量的默認(rèn)值為“\u0000”,即空字符。⑸布爾型(boolean)基本類型變量的默認(rèn)值為false。⑹引用型變量的默認(rèn)值為null。⑺數(shù)組引用類型變量的默認(rèn)值為null。如果一個變量在定義時包含有初始化表達(dá)式,那么系統(tǒng)會隨后計算該表達(dá)式并給變量重新賦值。這種情況也被稱為顯式初始化變量。

36【例4-8】【例4-8】定義職員類,包含公司名稱、職員姓名、姓名、年齡、性別、婚否及工資等變量。打印變量的初始值。publicclassEmployee{staticStringcorpName;//公司名稱Stringname;//職員姓名intage;//職員年齡charsex;//職員性別booleanisMarried;//婚否floatsalary;//工資37【例4-8】(續(xù))publicstaticvoidmain(String[]ags){ Employeeo=newEmployee(); System.out.println("corpName="+corpName); System.out.println("name="+); System.out.println("age="+o.age); System.out.println("isMarried="+o.isMarried); System.out.println("salary="+o.salary); System.out.println("sex="+o.sex);}}38【例4-9】局部變量的錯誤引用

classErrLocalVar{publicstaticvoidmain(Stringargs[]){ inti;//局部變量i //引用局部變量iSystem.out.println("i="+i);}}39類變量和實(shí)例變量在類中的初始化類的結(jié)構(gòu)為:classclassName{成員變量(實(shí)例變量、類變量)成員方法(實(shí)例方法、類方法)構(gòu)造方法靜態(tài)初始化塊動態(tài)初始化塊}40常見錯誤根據(jù)類的結(jié)構(gòu),成員變量只能在成員變量、成員方法中、構(gòu)造方法中、靜態(tài)初始化塊中或動態(tài)初始化塊中引用,否則,編譯器會報錯?!纠?-10】成員變量的錯誤引用。將例4-7的Circle類改寫如下。41classErrRefVar{staticinttotal;doubleradius;

total=0;//成員變量的引用在成員方法外

radius=10;//成員變量的引用在成員方法外voidprintVar(){ System.out.println("total="+total); System.out.println("radius="+radius);}publicstaticvoidmain(String[]args){ ErrRefVarobj=newErrRefVar(); obj.printVar();}}42靜態(tài)初始化塊和動態(tài)初始化塊

靜態(tài)初始化塊初始化類變量。格式:static{...}動態(tài)初始化塊初始化實(shí)例變量。格式:{...}一個類中可以定義一個或多個靜態(tài)/動態(tài)初始化塊。不是方法,只是初始化變量。區(qū)別:靜態(tài)初始化塊在類裝入時自動執(zhí)行動態(tài)初始化塊在創(chuàng)建對象時自動執(zhí)行43【例4-11】定義職員類,包含公司名稱、職員姓名、年齡、性別、婚否及工資等變量。使用靜態(tài)初始化塊和動態(tài)初始化塊初始化變量,并打印變量的初始值。classEmployee{staticStringcorpName="輝煌公司";//靜態(tài)初始化塊static{ corpName="輝煌國際集團(tuán)";}//動態(tài)初始化塊 { name="李四";}44intage=20;//職員年齡charsex='m';//職員性別//動態(tài)初始化塊{ age=30; sex='f';}//動態(tài)初始化塊{ isMarried=true; salary=2000.1f;}booleanisMarried=false;//婚否floatsalary=1000.9f;//工資Stringname="張三";//職員姓名publicstaticvoidmain(String[]ags){ Employeeo=newEmployee();

45 System.out.println("corpName="+corpName); System.out.println("name="+); System.out.println("age="+o.age); System.out.println("isMarried="+o.isMarried); System.out.println("salary="+o.salary); System.out.println("sex="+o.sex);}}464.4.4常量一個變量不管它是類變量、實(shí)例變量,還是局部變量,只要被final修飾,那么就被稱為有名常量。有名常量必須賦值且只能賦值一次。

【例4-12】定義有名常量PI,求圓的面積和周長。classCircle{doubleradius;//成員變量:圓的半徑//有名常量PI,STATIC_PIfinaldoublePI=3.1415926;staticfinaldoubleSTATIC_PI=3.1415926;}474.4.4常量(續(xù))classEx4_12{publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.radius=10; System.out.println("Area="+obj.radius*obj.radius*obj.PI); System.out.println("Perimeter="+2*obj.radius*obj.PI); System.out.println("STATICArea="+obj.radius*obj.radius*Circle.STATIC_PI); System.out.println("STATICPerimeter="+2*obj.radius*Circle.STATIC_PI);}}484.4.5變量的作用域變量的作用域是指變量有效使用的范圍,是變量的屬性。根據(jù)定義變量的位置不同,其作用域也不相同。局部變量是定義在塊內(nèi)、方法內(nèi)的變量。其作用域是以塊和方法為單位的,僅在定義該變量的塊或方法內(nèi)有效。實(shí)例變量和類變量定義在類內(nèi)、方法外的變量,它們的作用域是以類為單位的。區(qū)別在于引用變量的方式不同。方法參數(shù)和異常處理參數(shù)的作用域分別是以方法和塊為單位的,與局部變量類似。49局部變量可以與類變量、實(shí)例變量同名50局部變量、實(shí)例變量和類變量的小結(jié)

⑴局部變量與成員變量(實(shí)例變量、類變量)的變量名可以相同。⑵局部變量的語句塊發(fā)生嵌套時,內(nèi)層語句塊定義的變量不能與外層語句塊定義的變量同名。⑶成員變量名可與成員方法名相同。⑷方法的參數(shù)屬于局部變量。⑸局部變量必須顯式初始化,成員變量不必顯式初始化,系統(tǒng)首先給成員變量分配一個默認(rèn)值。⑹方法體內(nèi)不能定義類變量。514.5

成員方法

4.5.1成員方法聲明的一般形式

4.5.2實(shí)例方法與類方法

4.5.3構(gòu)造方法

4.5.4方法重載

4.5.5數(shù)據(jù)傳遞524.5.1成員方法聲明的一般形式格式是:[可訪問性修飾符][abstract][static][final][native][synchronize]返回類型方法名(形參表)[throws異常類名表]{…//方法體}1.修飾符2.返回類型3.形參表4.方法體534.5.2實(shí)例方法與類方法類方法(或靜態(tài)方法):被static修飾,實(shí)例方法:沒有被static修飾。類方法和實(shí)例方法的區(qū)別:⑴調(diào)用方式不同:不在同一個類中,方法名([實(shí)參表])

不在同一個類中,對象引用.方法名([實(shí)參表])

類名.方法名([實(shí)參表])

544.5.2實(shí)例方法與類方法(續(xù))⑵訪問的成員不同:·實(shí)例方法可以直接訪問該類的實(shí)例變量和實(shí)例方法,也可以訪問類變量和類方法。類方法只能訪問該類的類變量和類方法,不能直接訪問實(shí)例變量和實(shí)例方法

55【例4-13】類方法不能直接訪問實(shí)例變量

classStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}編譯時錯誤信息:nonstaticvariablemystringcannotbereferencedfromastaticcontext“System.out.println(mystring);”。56【例4-13改正1】classNoStaticError{

staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}57【例4-13改正2】classNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){

NoStaticErrorobj;

obj=newNoStaticError();System.out.println(obj.mystring);}}58一般來說,把實(shí)例變量聲明為private(只能被這個類的成員訪問,在類外不可見),向外提供get方法及set方法訪問該實(shí)例變量。通過這種的策略,避免類外代碼直接操作實(shí)例變量。即相對于類外代碼而言,實(shí)例變量隱藏起來(看不見),無法直接操作。59get方法的功能是取得成員變量的值。get方法的格式如下:public類型get成員變量名(){return成員變量;}set方法的功能是修改成員變量的值。set方法的格式如下:publicvoidset成員變量名(成員變量類型參數(shù)名){成員變量=參數(shù)名;}60【例4-14】使用帶get方法及set方法,完善例4-4的Circle類。classCircle{privatedoubleradius;//成員方法:設(shè)置圓的半徑,r為負(fù)數(shù)時,半徑為0

publicvoidsetRadius(doubler){

if(r<0) {radius=0;}

else{ radius=r;}

}//成員方法:得到圓的半徑

publicdoublegetRadius(){ returnradius;

}61【例4-14】(續(xù))

publicdoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_14{ publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.setRadius(-10); System.out.println("Area="+obj.getArea()); System.out.println("Perimeter="+obj.getPerimeter()); }62【例4-15】模仿例4-13,使用帶get方法及set方法,改寫完善例4-6的Employee類。classEmployee{

privatestaticintnextId=1; privateintid; privateStringname,post; privatelongsalary; //使用類變量nextId實(shí)現(xiàn)自動生成職工的工號

publicvoidsetId(){ id=nextId; nextId++; }63 publicvoidsetName(StringmyName){name=myName;} publicvoidsetPost(StringmyPost){post=myPost;} publicvoidsetSalary(longmySalary){salary=mySalary;} publicintgetId(){returnid;} publicStringgetName(){returnname;} publicStringgetPost(){returnpost;} publiclonggetSalary(){returnsalary;} voidchangePost(StringnewPost){post=newPost;} voidchangeSalary(longamount){salary=salary+amount;} voidprint(){System.out.println("工號:"+id+"\t姓名:"+name+ "\t職務(wù):"+post+"\t月薪:"+salary); }}

64classEx4_15{publicstaticvoidmain(String[]args){ Employee丁一,倪二,張三; 丁一=newEmployee();倪二=newEmployee(); 張三=newEmployee(); 丁一.setId();丁一.setName("丁一"); 丁一.setPost("部門經(jīng)理");丁一.setSalary(9000);倪二.setId();倪二.setName("倪二"); 倪二.setPost("部門副經(jīng)理");倪二.setSalary(6000); 張三.setId();張三.setName("張三"); 張三.setPost("職員");張三.setSalary(3000); 丁一.print(); 倪二.print(); System.out.print("工號:"+張三.getId()+"姓名:"+張三.getName()); System.out.println("職務(wù):"+張三.getPost()+"月薪:"+張三.getSalary()); }}654.5.3構(gòu)造方法構(gòu)造方法:在創(chuàng)建對象時就對對象進(jìn)行初始化是一種簡單而有效的方法。其具體功能是:為實(shí)例分配內(nèi)存空間;初始化實(shí)例變量;返回該實(shí)例的引用值。其中,實(shí)例變量的初始化按以下步驟進(jìn)行:(1)創(chuàng)建所有的實(shí)例變量并賦以默認(rèn)的初始值。數(shù)值型:0邏輯型:false引用型:null(2)按照在程序正文中出現(xiàn)的先后次序,計算實(shí)例變量定義語句中的初始化表達(dá)式并賦值,或者執(zhí)行實(shí)例初始化塊中的語句。這部分可稱為顯式初始化。(3)執(zhí)行構(gòu)造方法中的代碼。664.5.3構(gòu)造方法構(gòu)造方法定義的格式如下:[訪問修飾符]類名([形參表]){構(gòu)造方法體}【例4-16】使用構(gòu)造方法,改寫完善例4-6的Employee類。classEmployee{ privatestaticintnextId=1; privateintid; privateStringname,post; privatelongsalary;674.5.3構(gòu)造方法(續(xù)) //構(gòu)造方法 publicEmployee(StringmyName,StringmyPost,longmySalary){ setId(); setName(myName); setPost(myPost); setSalary(mySalary); }/*為了節(jié)約篇幅,與例4-15相同部分省略,*/}684.5.3構(gòu)造方法(續(xù))classEx4_16{publicstaticvoidmain(String[]args){ Employee丁一,倪二,張三; 丁一=newEmployee("丁一","部門經(jīng)理",9000); 倪二=newEmployee("倪二","部門副經(jīng)理",6000); 張三=newEmployee("張三","職員",3000);

丁一.print(); 倪二.print();張三.print();}}694.5.3構(gòu)造方法(續(xù))classEx4_16{publicstaticvoidmain(String[]args){ Employee丁一,倪二,張三; 丁一=newEmployee("丁一","部門經(jīng)理",9000); 倪二=newEmployee("倪二","部門副經(jīng)理",6000); 張三=newEmployee("張三","職員",3000);

丁一.print(); 倪二.print();張三.print();}}704.5.4方法重載在一個類中,如果出現(xiàn)方法名相同但形參表不同的多個方法,這種情形稱為方法重載。其中,形參表不同是指:⑴參數(shù)的類型不同⑵參數(shù)的順序不同。如:voidmethod(inti,floatf){…}與voidmethod(floatf,inti){…}⑶參數(shù)的個數(shù)不同注意:只要在同一個類中,方法名相同且形參表不同就是重載,而不管方法的返回類型是否相同、方法的修飾符是否相同。71【例4-17】【例4-17】定義一個類,并使用方法重載,計算平面和空間的點(diǎn)到原點(diǎn)的距離。classEx4_17{publicdoubledistance(doublex,doubley){ returnMath.sqrt(x*x+y*y);}publicdoubledistance(doublex,doubley,doublez){ returnMath.sqrt(x*x+y*y+z*z);}publicstaticvoidmain(String[]args){ Ex4_17obj=newEx4_17(); System.out.println("place="+obj.distance(1,1)); System.out.println("space="+obj.distance(1,2,2));}}72【例4-18】構(gòu)造方法重載

classCircle{doubleradius;//構(gòu)造方法publicCircle(){…}與publicCircle(doubler){…}重載publicCircle(){

this(0);System.out.println("defaultconstructor");}publicCircle(doubler){ radius=r;System.out.println("Circle(doubler)constructorr="+r);}publicdoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}73【例4-18】構(gòu)造方法重載(續(xù))classEx4_18{ publicstaticvoidmain(String[]args){ Circleobj1=newCircle(); Circleobj2=newCircle(10); //obj1成員方法getArea()的引用System.out.println("obj1Area="+obj1.getArea());//obj2成員方法getArea()的引用 System.out.println("obj2Area="+obj2.getArea()); }}744.5.5數(shù)據(jù)傳遞⑴參數(shù)傳遞:調(diào)用方法的對象(發(fā)送對象)向包含方法的對象(接收對象)傳遞數(shù)據(jù)。⑵方法返回:包含方法的對象(接收對象)向調(diào)用方法的對象(發(fā)送對象)傳遞數(shù)據(jù)。⑶實(shí)例變量:實(shí)例變量是作為一個對象中諸方法的共享的變量來傳送數(shù)據(jù)。⑷類變量:類變量是作為同一類中所有對象諸方法的共享變量來傳送數(shù)據(jù)。754.5.5數(shù)據(jù)傳遞1.參數(shù)傳遞:參數(shù)是基本類型:按值傳遞。形參值可能會改變,但不能改變對應(yīng)的實(shí)參值。其特點(diǎn)是“數(shù)據(jù)單向傳送”。參數(shù)是引用類型:按引用值傳遞。其特點(diǎn)是“引用值單向傳送,數(shù)據(jù)雙向傳送”?!纠?-20】參數(shù)是基本類型和引用類型,在參數(shù)傳遞中的區(qū)別。classMemberVar{ intvar=0; }764.5.5數(shù)據(jù)傳遞(續(xù))classParamTransfer{//n是值傳遞,o1,o2是引用值傳遞publicvoidchangeParameter(intn,MemberVaro1,MemberVaro2){ n=10; o1.var=10; o2=newMemberVar(); o2.var=20; }}classEx4_20{ publicstaticvoidmain(String[]args){ inti=0; MemberVarobj1=newMemberVar(); MemberVarobj2=newMemberVar(); ParamTransfero=newParamTransfer(); o.changeParameter(i,obj1,obj2);//方法調(diào)用,傳遞參數(shù)

System.out.println("i="+i); System.out.println("obj1.var="+obj1.var); System.out.println("obj2.var="+obj2.var);}}774.5.5數(shù)據(jù)傳遞(續(xù))2.方法返回:返回值的類型可以是基本類型,也可以是引用類型。

【例4-21】定義了復(fù)數(shù)類Complex,其中定義了兩個double變量real和imag(分別表示一個復(fù)數(shù)的實(shí)部與虛部)、一個構(gòu)造方法、一個用于完成兩個復(fù)數(shù)相加的方法add和一個用于輸出復(fù)數(shù)的方法print。classComplex{privatedoublereal,imag;publicComplex(doubler,doublei){real=r;imag=i;}784.5.5數(shù)據(jù)傳遞(續(xù))publicComplexadd(Complexc){//方法返回引用類型

returnnewComplex(real+c.real,imag+c.imag);}publicvoidprint(){System.out.println(real+"+"+imag+"i");}} classEx4_21{publicstaticvoidmain(String[]args){Complexc1=newComplex(5,2);Complexc2=newComplex(6,4);

Complexc3=c1.add(c2);c3.print();}}794.5.5數(shù)據(jù)傳遞(續(xù))3.實(shí)例變量和類變量【例4-22】作為共享變量的實(shí)例變量和類變量,它們共享范圍的區(qū)別。classEmployee{staticStringcorpName="輝煌公司";Stringname="張三";//職員姓名voidselfIntroduction(){ System.out.println("I'm"+name+",andworkin"+corpName+".");}}804.5.5數(shù)據(jù)傳遞(續(xù))publicclassEx4_22{publicstaticvoidmain(String[]args){ Employeeobj1,obj2; obj1=newEmployee(); obj2=newEmployee(); ="Tom";//對象obj1改名為"Tom" obj1.corpName="Disney"; //對象obj1改公司名為"Disney" ="李四";//對象obj2改名為"李四" obj1.selfIntroduction(); obj2.selfIntroduction();}}814.6類的組織方式——包

4.6.1包的概念

4.6.2包的創(chuàng)建

4.6.3包的引入

3.6.4靜態(tài)成員的引入

824.6.1包的概念包是一組相關(guān)的類和接口的集合,或者說,包是一組相關(guān)的類和接口以及子包的集合。

1.包的作用⑴包可以劃分和組織類,使類和接口按功能、來源分為不同的集合。⑵包是類名空間,一個包中的類不能重名,但不同包中的類可以重名。⑶包提供了包一級的封裝及存取權(quán)限。同一個包的類彼此不加限制的訪問,對其他包中的類提供了訪問控制。832.Java類庫Java的應(yīng)用程序接口API是以包的形式提供的,每個包內(nèi)包含大量相關(guān)的類、接口和異常。這些包中的類構(gòu)成了Java類庫。使用包中系統(tǒng)類的方法有三種:⑴繼承系統(tǒng)類,在用戶程序中創(chuàng)建系統(tǒng)類的子類,例如JavaApplet程序的起始類作為java.applet包中Applet類的子類;⑵創(chuàng)建系統(tǒng)類的對象,例如創(chuàng)建包裝類的對象;⑶直接使用系統(tǒng)類,例如程序中常用的System.out.println()方法,就是系統(tǒng)類System的靜態(tài)屬性out的方法。84創(chuàng)建包語法格式:package包名;功能:把源文件中定義的類、接口放到指定的包中,即指明源文件中定義的類和接口屬于哪個包?!纠?-23】將例4-4的Circle類和Ex4_4類放到chapter4包中。packagechapter04;classCircle{/*省略Circle類類體中的代碼*/}classEx4_4{/*省略Ex4_4類類體中的代碼*/}4.6.2包的創(chuàng)建85如果把例4-4中的package語句改為:packagexiyou.zxl.javabook.chapter04;Java編譯器javac將在classpath指定的目錄下,首先創(chuàng)建xiyou目錄,然后再在xiyou目錄下創(chuàng)建zxl目錄,再在zxl目錄下創(chuàng)建javabook目錄,再在javabook目錄下創(chuàng)建chapter04目錄,并且把編譯后產(chǎn)生的類文件Circle.class和Ex4_4.class放到chapter04目錄中。具體來說,包名xiyou.zxl.javabook.chapter04對應(yīng)Windows上的xiyou\zxl\javabook\chapter04目錄。864.6.3包的引入

一個類訪問來自另一個包(java.lang包除外)中的類,須引用這個類的完整類名?!纠?-24】例4-23的Circle類在xiyou.zxl.javabook.chapter04包中,內(nèi)容是:packagexiyou.zxl.javabook.chapter04;publicclassCircle{

publicdoubleradius;publicdoublegetArea(){ returnradius*radius*Math.PI;}

publicdoublegetPerimeter(){ return2*radius*Math.PI;}}874.6.3包的引入(續(xù))packagexiyou.zxl.javabook;classEx4_4{ publicstaticvoidmain(String[]args){ //xiyou.zxl.javabook.chapter04.Circle是完整的類名xiyou.zxl.javabook.chapter04.Circleobj;obj=newxiyou.zxl.javabook.chapter04.Circle(); obj.radius=10; System.out.println("Area="+obj.getArea()); System.out.println("Perimeter="+obj.getPerimeter()); }}Ex4_4類不在這個包中,而在xiyou.zxl.javabook包中884.6.3包的引入(續(xù))import語句有兩種格式:格式1:import包名.類名;功能:引入指定包中需要使用的一個類或接口,類或接口只用它的簡單類名即可(不需要加包的前綴)。例如:將importxiyou.zxl.javabook.chapter04.Circle;放在Ex4_4類的前面。這樣,在類體中就可以引用其簡單類名Circle,而不用其完整的類名。格式2:import包名.*;功能:引入指定整個包。使得指定包中的任何類或接口只用它的簡單類名即可(不需要加包的前綴)。例如:將importxiyou.zxl.javabook.chapter04.*;放在Ex4_4類的前面。這樣,該包中的任何類或接口,在類體中就可以引用其簡單類名,而不用其完整的類名。當(dāng)然簡單類名Circle也不例外,直接使用即可。894.6.4靜態(tài)成員的引入

格式1:importstatic包名.類或接口名.靜態(tài)成員名;此格式可當(dāng)前整個源文件的范圍內(nèi),用簡單名稱訪問指定的靜態(tài)成員,即精確引入。格式2:importstatic包名.類或接口名.*;此格式可在當(dāng)前整個源文件的范圍內(nèi),用簡單名稱訪問指定類型中的所有靜態(tài)成員,即按需引入。例如:importstaticjava.lang.System.out;importstaticjava.lang.Math.*;publicclassStaticImportSample1{publicstaticvoidmain(String[]args){

out.println("HelloWorld!"); out.println(sin(PI/2));}}904.7訪問權(quán)限

4.7.1類的訪問權(quán)限4.7.2類中成員的訪問權(quán)限914.7.1類的訪問權(quán)限類的訪問權(quán)限有兩種:用public修飾和沒用public修飾。public:該類可以被任何包的代碼訪問;沒用public(或缺?。涸擃惪杀槐景拇a訪問。例4-23的Circle類和Ex4_4類在同一個包c(diǎn)hapter04中:Ex4_4類中總能訪問Circle類例4-24的Circle類和Ex4_4類不在同一個包中:92Circle類在xiyou.zxl.javabook.chapter04包中,Ex4_4類在xiyou.zxl.javabook包中,其內(nèi)容是:packagexiyou.zxl.javabook;importxiyou.zxl.javabook.chapter04.Circle;classEx4_4{ publicstaticvoidmain(String[]args){ Circleobj;//引用Circle類obj=newCircle();//引用Circle類//省略Ex4_4類部分代碼}}934.7.2類中成員的訪問權(quán)限訪問權(quán)限的范圍大小從小到大:·私有(private)成員:僅在本類內(nèi)中的代碼可訪問它?!つJ(rèn)(無修飾符)成員:在同一包內(nèi)中的代碼可訪問它?!けWo(hù)(protected)成員:在同一包內(nèi)及其子類(不同包)中的代碼可訪問它。·公共(public)成員:在所有包內(nèi)中的代碼可訪問它。941.私有(private)成員classCircle{

privatedoubleradius;publicvoidsetRadius(doubleradius){this.radius=radius;}publicdoublegetRadius(){returnradius;}

privatedoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_25{ publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.radius=10;//非法訪問私有變量obj.setRadius(10); System.out.println("Area="+obj.getArea());System.out.println("Perimeter="+obj.getPerimeter()); }95私有構(gòu)造方法的訪問

classCircle{privatedoubleradius;

privateCircle(){radius=0.0;}

staticCirclecreateCircle(){ returnnewCircle();}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_26{ publicstaticvoidmain(String[]args){ Circleobj=newCircle();//非法

Circleobj=Circle.createCircle();

System.out.println("Perimeter="+obj.getPerimeter()); }}962.

默認(rèn)(無修飾符)成員在同一個包

3.

保護(hù)(protected)成員類中修飾為protected的成員可以被這個類本身、同一個包中的其它的類以及其它包中的子類訪問。packagexiyou.chapter04;publicclassCircle{protecteddoubleradius;publicCircle(){}publicCircle(doubleradius){ this.radius=radius;}protecteddoublegetArea(){returnradius*radius*Math.PI;}doublegetPerimeter(){ return2*radius*Math.PI;}}97packagexiyou;importxiyou.chapter04.Circle;classBallextendsCircle{Ball(){}Ball(doubler){ super(r);}voidprint(){ System.out.println("radius="+radius); System.out.println("Area="+getArea());// System.out.println("Perimeter="+getPerimeter());//沒有修飾符,不在同一個包 Circleobj=newBall();//radius被protected修飾,訪問位置是不同包的子類Ball,obj的類型不是當(dāng)前子類Ball。// System.out.println("radius="+obj.radius);// System.out.println("Area="+obj.getArea());//getArea()被protected修飾,同上

98// System.out.println("Perimeter="+obj.getPerimeter());Ballobject=newBall(1); System.out.println("radius="+object.radius); System.out.println("BallArea="+object.getArea());//System.out.println("Perimeter="+object.getPerimeter());}}publicclassEx4_27{publicstat

溫馨提示

  • 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

提交評論