版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第3章 Java面向?qū)ο缶幊袒A(chǔ),3.1面向?qū)ο筌浖_發(fā)概述 3.2 Java的類 3.3 Java的非訪問控制符 3.4 Java的訪問控制符 3.5 定義和使用Java的方法 3.6 面向?qū)ο蠓治鰧?shí)例(補(bǔ)充),學(xué)習(xí)要點(diǎn):,1.理解面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念 2.理解Java包中類的基本概念,掌握定義Java類和創(chuàng)建對象的方法 3.掌握構(gòu)造函數(shù):構(gòu)造函數(shù)的特點(diǎn)、構(gòu)造函數(shù)的定義 4.掌握J(rèn)ava的訪問控制符:public、private、protected、private protected 5.掌握J(rèn)ava的非訪問控制符:static、abstract、final 6.理解方法的形式參數(shù)與實(shí)
2、際參數(shù)、方法的返回值、方法的調(diào)用過程,面向?qū)ο笫且环N新興的程序設(shè)計(jì)方法, 或者是一種新的程序設(shè)計(jì)規(guī)范, 其基本思想是使用對象、類、繼承、封裝、消息等基本概念來進(jìn)行程序設(shè)計(jì)。從現(xiàn)實(shí)世界中客觀存在的事物(即對象)出發(fā)來構(gòu)造軟件系統(tǒng),并且在系統(tǒng)構(gòu)造中盡可能運(yùn)用人類的自然思維方式。 對象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對象由一組屬性和對這組屬性進(jìn)行操作的一組服務(wù)組成。,3.1 面向?qū)ο筌浖_發(fā)概述,圖2.1 對象、實(shí)體與類,3.1.1 程序設(shè)計(jì)方法的發(fā)展,3.1.2 面向?qū)ο蟮膸讉€(gè)基本概念,類(Class) 是定義了對象特征以及對象外觀和行為的模板,是同種對象的集合
3、與抽象。類是一種抽象數(shù)據(jù)類型。 對象(Object) 是現(xiàn)實(shí)世界中某個(gè)具體的物理實(shí)體在計(jì)算機(jī)邏輯中的映射和體現(xiàn),是具有唯一對象名和固定對外接口的一組屬性和操作的集合,是類的一個(gè)實(shí)例,具有所在類所定義的全部屬性和方法。 屬性(Property) 是對象的特征,包括狀態(tài)和行為。,屬性,動態(tài)屬性也叫行為,在計(jì)算機(jī)內(nèi)用方法表示,靜態(tài)屬性也叫狀態(tài),在計(jì)算機(jī)內(nèi)用變量表示,對象的關(guān)系 包含當(dāng)對象A是對象B的屬性時(shí),稱對象B包含對象A; 如:學(xué)生和班級, CPU與計(jì)算機(jī) 繼承當(dāng)對象A是對象B的特例時(shí),稱對象A繼承了對象B 如:北京大學(xué)和大學(xué),液晶顯示器和顯示器。 關(guān)聯(lián)當(dāng)對象A的引用是對象B的屬性時(shí),稱對象A和
4、對象 B之間是關(guān)聯(lián)關(guān)系。 如計(jì)算機(jī)與制造商,學(xué)生和班主任 方法(Method)與對象相聯(lián)系的由程序執(zhí)行的一個(gè)處理過程 ,類似于面向過程中的函數(shù)。 事件(Event)由對象識別的一個(gè)動作。 面向?qū)ο蟮某绦蛟O(shè)計(jì)是通過對類、子類和對象等的設(shè)計(jì)來體現(xiàn)的,類和對象是面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)的核心。,繼承性(inheritance),自動地共享具有層次關(guān)系的類(子類)和對象中的方法和數(shù)據(jù)的機(jī)制。 當(dāng)類Y繼承類X時(shí),就表明類Y是類X的子類,而類X是類Y的超/父類。類Y由兩部分組成:繼承部分和增加部分。 增加部分是專為Y編寫的新代碼;繼承部分可以是簡單的等同,也可以更為豐富:如對性質(zhì)重命名、重實(shí)現(xiàn)、復(fù)制、置空等。
5、,繼承方式: 簡單繼承(single inheritance):一個(gè)類至多只能繼承一個(gè) 類(樹結(jié)構(gòu))。 多重繼承(multiple inheritance):一個(gè)類直接繼承多個(gè)超 類(網(wǎng)狀結(jié)構(gòu))。(),例:一個(gè)圖形系統(tǒng)(),Figure,Line,Ellipse,Polygon,Close Figure,Open Figure,Pentagon,Triangle,Rectangle,Circle,Arc,(象素寬度,顏色,平移,旋轉(zhuǎn)),(填充,邊界,周長,面積),(長度),3. 1.3 面向?qū)ο蟮能浖_發(fā)過程,面向?qū)ο蟮能浖_發(fā)過程可以大體劃分為三個(gè)階段: 面向?qū)ο蟮姆治觯╫bject ori
6、ented analysis,OOA) 面向?qū)ο蟮脑O(shè)計(jì)(object oriented design,OOD) 面向?qū)ο蟮膶?shí)現(xiàn)(object oriented programming,OOP)。,(1) 面向?qū)ο蟮姆治觯∣OA object oriented analysis),主要作用: 明確用戶的需求,并用標(biāo)準(zhǔn)化的面向?qū)ο蟮哪P鸵?guī)范地表述這一需求,最后將形成面向?qū)ο蟮姆治瞿P停碠OA模型。分析階段的工作應(yīng)該由用戶和開發(fā)人員共同協(xié)作完成。 面向?qū)ο蟮姆治鍪紫葢?yīng)該明確用戶的需求,然后再將這些需求以標(biāo)準(zhǔn)化模型的形式規(guī)范地表述出來,即將用戶和開發(fā)人員頭腦中形成的需求以準(zhǔn)確的文字、圖表等形式表述出
7、來,形成雙方都認(rèn)可的文件。,使用OOA的原因如下: (1)它使我們能在人類概括客觀事物的三個(gè)基本方法(對象及屬性、一般特殊結(jié)構(gòu)和部分整體結(jié)構(gòu))的框架上進(jìn)行定義和交流。 (2)它首先著眼于問題空間的理解。 (3)它將屬性及專用于那些屬性的方法視為一個(gè)固有的整體。 (4)使用自包含分塊(對象之間依賴性最小)進(jìn)行分析和說明。 (5)它提供一個(gè)支持分析和設(shè)計(jì)一致的強(qiáng)有力的表示工具。 (6)它能適應(yīng)系列變化的系統(tǒng)和對當(dāng)前實(shí)際運(yùn)行系統(tǒng)的調(diào)整。,常使用的OO(描述)方法有多種:,Booch Booth 方法 (86年) Coad 聲明類屬性為對象的語法: 修飾符 類名 對象名=new 類名(實(shí)際參數(shù)列表);
8、 例: PhoneCard myCard=new PhoneCard ( ); 修飾符有訪問控制符、靜態(tài)修飾符static、 最終修飾符final、易失修飾符volatile和 過渡修飾符transient。,類中的“變量”概念辨析:,(1)成員變量: 在類體變量定義處定義的變量,在整個(gè)類內(nèi)都有效; 成員變量包括實(shí)例變量和類變量,用static定義的變量是類變量,也叫靜態(tài)變量; 所有對象獨(dú)享實(shí)例變量,但共享類變量; 實(shí)例變量只能通過對象名訪問,類變量既可以通過某個(gè)對象名也可以通過類名來訪問。 (2)局部變量: 在類的方法中定義的變量,僅在定義它的方法內(nèi)有效,類的方法:,即成員函數(shù),它規(guī)定類屬性
9、上的操作,實(shí)現(xiàn)類的內(nèi)部功能的機(jī)制,是類與外部交互的窗口。 語法結(jié)構(gòu): 修飾符 返回值類型 方法名(參數(shù)列表) throws 例外名1,例外名2,. 方法體; 局部變量聲明; 語句序列; ,類中的“方法”概念辨析:,(1)實(shí)例方法: 實(shí)例方法既可以操作實(shí)例變量,也可以操作類變量; 實(shí)例方法在創(chuàng)建類對象后才分配入口地址; 實(shí)例方法可以被類創(chuàng)建的任何對象訪問,必須通過對象來調(diào)用;實(shí)例方法可以調(diào)用其它方法(包括類方法)。 (2)類方法: 用static修飾的方法是類方法,也叫靜態(tài)方法; 類方法只能操作類變量; 類方法在類被加載到內(nèi)存后就分配了入口地址; 類方法可以被類創(chuàng)建的任何對象調(diào)用,也可以通過類名
10、來調(diào)用,類方法只能調(diào)用該類的類方法。,class PhoneCard /定義一個(gè)電話卡類 long cardNumber; private int password; double balance; String connectNumber; boolean connected; boolean performConnection(long cn,int pw) /方法1,實(shí)現(xiàn)連接 if(cn = cardNumber ,類的屬性,double getBalance() /方法2,返回余額 if(connected) return balance; else return -1; void p
11、erformDial() /方法2,實(shí)現(xiàn)撥號 if(connected) balance -= 0.5; ,3.2.5 創(chuàng)建類的實(shí)例對象,創(chuàng)建對象的一般格式: 類名 新建對象名= new 構(gòu)造函數(shù)( ); new是為新建對象開辟內(nèi)存空間的算符。 構(gòu)造函數(shù)()用來完成對象的初始化。 如:TextField input= new TextField(6); 建立一個(gè)名為input、長度為6的文本框。 PhoneCard myCard=new PhoneCard( ); 建立一個(gè)名為myCard的電話卡對象。,3.2.6 Java中的構(gòu)造函數(shù),(1)基本概念 構(gòu)造函數(shù):用來初始化對象(為其所有靜態(tài)屬
12、性賦初值)的一個(gè)特殊方法。 構(gòu)造函數(shù)名與類名相同 構(gòu)造函數(shù)可以有0個(gè)或多個(gè)參數(shù) 特點(diǎn) 構(gòu)造函數(shù)始終和new關(guān)鍵字一起調(diào)用 構(gòu)造函數(shù)沒有返回值 構(gòu)造函數(shù)一般不能由編程人員顯示地直接調(diào)用 在創(chuàng)建一個(gè)類的新對象時(shí),系統(tǒng)自動調(diào)用構(gòu)造 函數(shù)對其進(jìn)行初始化。,引入構(gòu)造函數(shù)的原因: 1) 滿足面向?qū)ο蟪绦蛟O(shè)計(jì)中對象初始化的需要; 2) 提高靈活度,使初始化工作除賦值外有更復(fù)雜的操作; 在不定義構(gòu)造函數(shù)時(shí),系統(tǒng)會自動為該類生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。,(2)構(gòu)造函數(shù)的定義,例如,可以為PhoneCard類定義如下的構(gòu)造函數(shù),初始化它的幾個(gè)域。 PhoneCard(long cn, int pw, double b
13、,String s) cardNumber = cn; password = pw; balance = b; connectNumber = s; connected = false; 可見,構(gòu)造函數(shù)定義了幾個(gè)形式參數(shù),創(chuàng)建對象的語句在調(diào)用構(gòu)造函數(shù)時(shí),需要提供幾個(gè)類型、順序一致的實(shí)際參數(shù),指明新建對象各域的初始值。,構(gòu)造函數(shù)的調(diào)用是在用new運(yùn)算符創(chuàng)建類對象時(shí)由系統(tǒng)自動完成。 定義了構(gòu)造函數(shù)之后,就可以用如下的語句創(chuàng)建并初始化PhoneCard對象: PhoneCard newCard = new PhoneCard (33006655, 6666, 100.0,300); 說明: newC
14、ard是新建對象名 關(guān)鍵字new通知系統(tǒng)開辟內(nèi)存單元,創(chuàng)建運(yùn)算符 第一個(gè)PhoneCard說明新對象屬于哪個(gè)類 第二個(gè)PhoneCard用來隱含調(diào)用PhoneCard類的構(gòu)造函數(shù) 這個(gè)對象的卡號是33006655,密碼是6666,金額是100.0,電話卡的接入號碼是字符串“300”。,例 UsePhoneCard.java 1: public class UsePhoneCard 2: 3: public static void main(String args) 4: / 創(chuàng)建一個(gè)PhoneCard的對象myCard 5: PhoneCard myCard = new PhoneCard(1
15、2345678,1234,50.0,300); / 調(diào)用myCard的方法toString( ), / 把myCard中的各個(gè)域數(shù)據(jù)組合成一段信息在屏幕上輸出。 6: System.out.println(myCard. toString( ) ); 7: 8: ,9: class PhoneCard 10: 11: long cardNumber; 12: private int password; 13: double balance; 14: String connectNumber; 15: boolean connected; 16: /構(gòu)造函數(shù) 17: PhoneCard(long
16、 cn, int pw, double b,String s) 18: 19: cardNumber = cn; 20: password = pw; 21: if ( b 0 ) 22: balance = b; 23: else 24: System.exit(1);,25: connectNumber = s; 26: connected = false; 27: 28: boolean performConnection(long cn,int pw) 29: /方法1,實(shí)現(xiàn)連接 30: if(cn = cardNumber 39: 40: ,41: double getBalance
17、( ) /方法2,返回余額 42: 43: if(connected) 44: return balance; 45: else 46: return -1; 47: 48: void performDial( ) /方法3 ,撥號扣款 49: 50: if(connected) 51: balance -= 0.5; 52: ,53: public String toString( ) /方法4,顯示卡上的信息 54: 55: String s = 電話卡接入號碼:+connectNumber 56: +n電話卡卡號:+cardNumber 57: +n電話卡密碼:+password 58:
18、 +n剩余金額:+balance; 59: if(connected) 60: return (s + n電話已接通。); 61: else 62: return (s + n電話未接通。); 63: 64: ,3.3 Java的非訪問控制符,Java的非訪問控制符 static 靜態(tài)修飾符 修飾屬性和方法 abstract 抽象修飾符 修飾類和方法 final 最終修飾符 修飾類、屬性和方法 3.3.1 靜態(tài)屬性、靜態(tài)方法與靜態(tài)初始化器 static是靜態(tài)修飾符。 ()靜態(tài)屬性 被static修飾的屬性不屬于任何一個(gè)類的具體對象,是公共的存儲單元。任何對象訪問它時(shí),取到的都是相同的數(shù)值。靜態(tài)
19、屬性是類屬性。 當(dāng)需要引用或修改一個(gè)static限定的類屬性時(shí),可以使用類名,也可以使用某一個(gè)對象名,效果相同。,()靜態(tài)方法,用static修飾符修飾的方法,是屬于整個(gè)類的方法。 例如,在PhoneCard200中如果需要修改附加費(fèi),可以定義一個(gè)靜態(tài)方法setAdditory( ): static void setAdditory ( double newAdd) if(newAdd 0) additoryFee = newAdd; 用static修飾的方法的含義: 1)調(diào)用這個(gè)方法時(shí)應(yīng)該使用類名做前綴,不用某個(gè)具體的對象名; 2)該方法屬于整個(gè)類,它在內(nèi)存中的代碼段隨著類的定義而分配和裝載
20、; 3)該方法不能操縱屬于某個(gè)對象的成員變量,即static方法只能處理static屬性。,(3)靜態(tài)初始化器,直接用static 當(dāng)名字、用 包起來的一段特殊代碼。與構(gòu)造函數(shù)類似,完成初始化工作,但兩者的區(qū)別是: 靜態(tài)初始化器對每個(gè)類初始化,構(gòu)造函數(shù)對每個(gè)新創(chuàng)建的對象初始化。 靜態(tài)初始化器在所屬的類加載入內(nèi)存時(shí)由系統(tǒng)調(diào)用運(yùn)行,構(gòu)造函數(shù)則在產(chǎn)生新對象時(shí)由系統(tǒng)自動執(zhí)行。 靜態(tài)初始化器不是方法,沒有方法名、返回值和參數(shù)列表。 總之,靜態(tài)初始化器對整個(gè)類完成初始化操作,包括給static類成員賦初值。,例 TestStatic.java,/測試靜態(tài)屬性、靜態(tài)方法與靜態(tài)初始化器的綜合例題 public
21、 class TestStatic public static void main(String args) PhoneCard200 my200_1 = new PhoneCard200(100.0); PhoneCard200 my200_2 = new PhoneCard200(200.5); /測試靜態(tài)初始化器 System.out.println(第1張200卡的卡號:+my200_1.cardNumber); System.out.println(第1張200卡的金額:+my200_1.balance); System.out.println(第1張200卡的附加費(fèi):+my200_
22、1.additoryFee); System.out.println(第1張200卡的密碼:+my200_1.password); System.out.println(第2張200卡的卡號:+my200_2.cardNumber); System.out.println(第2張200卡的金額:+my200_2.balance); System.out.println(第2張200卡的附加費(fèi):+my200_2.additoryFee); System.out.println(第2張200卡的密碼:+my200_2.password);,System.out.println(-直接操作修改靜態(tài)屬
23、性:測試靜態(tài)屬性); my200_1.additoryFee = 0.4; /直接操作修改對象的靜態(tài)屬性,可以實(shí)現(xiàn)對類和其它同類對象同一屬性的修改 System.out.println(第2張200卡的附加費(fèi):+my200_2.additoryFee); System.out.println(200卡類的附加費(fèi):+PhoneCard200.additoryFee); System.out.println(第1張200卡類的附加費(fèi):+my200_1.additoryFee); System.out.println(-調(diào)用靜態(tài)方法修改靜態(tài)屬性:測試靜態(tài)方法); PhoneCard200.setAd
24、ditory(0.6); /調(diào)用靜態(tài)方法修改類的靜態(tài)屬性,可以實(shí)現(xiàn)其所有同類對象同一屬性的修改 System.out.println(“修改后第1張200卡類的附加費(fèi): + my200_1.additoryFee); System.out.println(修改后第2張200卡的附加費(fèi):+ my200_2.additoryFee);,System.out.println(-測試修改密碼的各種方法); my200_2.password=222; /用普通賦值法給對象的非靜態(tài)屬性賦值 System.out.println(第2張200卡的密碼:+my200_2.password); /對該對象的非靜
25、態(tài)屬性操作有效 System.out.println(第1張200卡的密碼:+my200_1.password); /對其它同類對象的非靜態(tài)屬性操作無效 / PhoneCard200.password=333; /用普通賦值法給類的非屬性賦值,編譯不能通過 my200_2.changePwd(666); /調(diào)用類中的方法實(shí)現(xiàn)密碼的修改 System.out.println(第2張200卡的密碼:+my200_2.password); /對該對象的非靜態(tài)屬性操作有效 System.out.println(第1張200卡的密碼:+my200_1.password); /對其它同類對象的非靜態(tài)屬性操
26、作無效 ,class PhoneCard200 /定義類:PhoneCard200 static long nextCardNumber; static String connectNumber = 200; static double additoryFee; /靜態(tài)屬性 long cardNumber ; int password=111; boolean connected; double balance; PhoneCard200(double bi) /構(gòu)造函數(shù) cardNumber = nextCardNumber+; balance=bi; static /靜態(tài)初始化器 next
27、CardNumber = 2001800001; additoryFee=0.2; ,static void setAdditory(double newAdd) /靜態(tài)方法 if(newAdd0) additoryFee=newAdd; /password=6666; /靜態(tài)方法不能操作非靜態(tài)變量 int changePwd(int pwd) /普通方法 password=pwd; return pwd; ,3.3.2 抽象類與抽象方法,用abstract修飾的類或方法。 (1)抽象類 沒有具體實(shí)例對象的類。 使用抽象類的優(yōu)點(diǎn)就是可以充分利用公共屬性來提高開發(fā)和維護(hù)程序的效率。 例:我們以交
28、通工具類作為例子,它代表了所有具體交通工具的共同屬性,如速度、加速、減速等。,java語句可表述為: abstract class transportmeans float speed; /速度 void start() /啟動 . void stop() /停止 . float speedUp(float increaseSpeed) /加速 . ,(2)抽象方法,用abstract聲明的僅有方法頭而沒有具體的方法體和 操作實(shí)現(xiàn)的抽象方法。 方法體的具體實(shí)現(xiàn)由當(dāng)前類的不同子類在各自的類定義中完成。 只能把a(bǔ)bstract方法作為一個(gè)共同的接口。 所有的抽象方法必須存在于抽象類中。 使用abs
29、tract方法可以隱藏具體的細(xì)節(jié)信息。,例 TestAbstract.java,public class TestAbstract /抽象類與抽象方法的使用 public static void main(String args) PhoneCard200 my200 = new PhoneCard200(50.0); /用PhoneCard200的構(gòu)造函數(shù)初始化對象my200 PhoneCard200 my2002 = new PhoneCard200(60.0); /用PhoneCard200的構(gòu)造函數(shù)初始化對象my2002 IC_Card myIC = new IC_Card(50.0)
30、; /用IC_Card的構(gòu)造函數(shù)初始化對象myIC System.out.println(200卡可以撥打 +my200.TimeLeft()+ 次電話。); System.out.println(IC 卡可以撥打 +myIC.TimeLeft()+ 次電話。); System.out.println(第1張200卡的卡號:+my200.cardNumber); System.out.println(第2張200卡的卡號:+my2002.cardNumber); System.out.println(第2張200卡可以撥打 +my2002.TimeLeft()+ 次電話。); ,abstrac
31、t class PhoneCard /抽象類 double balance; abstract void performDial(); /抽象方法,不需要定義方法體 / void performChangePwd(); /出錯(cuò),要么加上abstract,要么定義方法體 double TimeLeft() /一般方法,需要定義方法體,計(jì)算可以撥打的次數(shù) double current = balance; int times = 0; do performDial(); /調(diào)用抽象方法 times+; while(balance=0); balance = current; return time
32、s-1; ,class PhoneCard200 extends PhoneCard static long nextCardNumber; static final String connectNumber = 200; static double additoryFee; long cardNumber ; int password; boolean connected; static /靜態(tài)初始化器,初始化類 nextCardNumber = 2001800001; additoryFee = 0.1; PhoneCard200(double ib) /PhoneCard200的構(gòu)造函數(shù)
33、 cardNumber = nextCardNumber+; balance = ib; void performDial() /子類PhoneCard200實(shí)現(xiàn)的抽象方法 balance -= 0.5+additoryFee; /abstract void performChange(); /出錯(cuò),非抽象類不可以定義抽象方法 ,class IC_Card extends PhoneCard IC_Card(double ib) /IC_Card的構(gòu)造函數(shù) balance = ib; void performDial() /子類IC_Card實(shí)現(xiàn)的抽象方法 balance -= 0.8; ,3
34、.3.3 最終類、最終屬性、最終方法,用final最終修飾符來修飾類、屬性和方法。 (1)最終類不可能有子類 (2)最終屬性(域)可用來修飾常量,若成員變量被聲明為final,則整個(gè)執(zhí)行過程中都不會變。 語法:static final double additoryFee=0.1; 注意: 需要說明常量的數(shù)據(jù)類型 需要同時(shí)指出常量的具體取值 為了節(jié)省空間,常量通常被聲明為static,(3)最終方法功能和語句都不能被修改的最終方法,即不能被當(dāng)前類的子類重載。目的是為了預(yù)防不必要的重復(fù)定義。 例:final double getAdditoryFee() return additoryFee;
35、注意:所有已被private修飾符限定為私有的方法,以及所有包含在final類中的方法,都被缺省地認(rèn)為是final的。,例:TestFinal.java,/最終類、最終方法、最終屬性、終結(jié)器的綜合例題 public class TestFinal public static void main(String args) PhoneCard200 my200_1 = new PhoneCard200(100.0); PhoneCard200 my200_2 = new PhoneCard200(200.5); System.out.println(第1張200卡的卡號:+my200_1.card
36、Number); System.out.println(第1張200卡的金額:+my200_1.balance); System.out.println(第1張200卡的附加費(fèi):+my200_1.additoryFee); System.out.println(第1張200卡的密碼:+my200_1.getAdditoryFee(); System.out.println(第2張200卡的卡號:+my200_2.cardNumber); System.out.println(第2張200卡的金額:+my200_2.balance); System.out.println(第2張200卡的連接號
37、:+my200_2.connectNumber); my200_1.setAdditory(0.9); System.out.println(修改后第2張200卡的連接號:+my200_2.connectNumber); /my200_1.additoryFee = 0.4; /出錯(cuò),不能給對象的最終屬性賦值 /PhoneCard200.setAdditory(0.6); /出錯(cuò),不能修改對象的最終屬性 IC_Card myIC = new IC_Card(50.0); System.out.println(IC 卡可以撥打 +myIC.TimeLeft()+ 次電話。); ,final cl
38、ass PhoneCard /定義為final 最終類,則下面的IC卡不能定義為其子類 ,若定義為抽象類 ,IC卡可以為子類 double balance; /abstract void performDial(); /final中不能定義抽象方法 double TimeLeft() /一般方法,需要定義方法體,計(jì)算可以撥打的次數(shù) double current = balance; int times = 0; do /performDial(); /不能調(diào)用該方法 times+; while(balance=0); balance = current; return times-1; ,cl
39、ass PhoneCard200 /定義類:PhoneCard200 static long nextCardNumber; static String connectNumber = 200; static final double additoryFee=0.5; /靜態(tài)最終屬性,被賦值后就不可以再修改 /這里如果不賦值,可以在靜態(tài)初始化器中修改 long cardNumber ; int password=222; boolean connected; double balance; PhoneCard200(double bi) /構(gòu)造函數(shù) cardNumber = nextCardN
40、umber+; balance=bi; static /靜態(tài)初始化器 nextCardNumber = 2001800001; /additoryFee=0.2; /出錯(cuò),如果定義時(shí)沒有賦初值才可以 ,static void setAdditory(double newAdd) /靜態(tài)方法 if(newAdd0) /additoryFee=newAdd; /不能操作最終變量 connectNumber = 300; final double getAdditoryFee() /最終方法 return additoryFee; void performDial() /PhoneCard200的方
41、法 balance -= 0.5+additoryFee; /*class IC_Card extends PhoneCard /PhoneCard被定義為final則不能有子類 IC_Card(double ib) /IC_Card的構(gòu)造函數(shù) balance = ib; void performDial() /子類IC_Card的方法 balance -= 0.8; */,3.4 Java的訪問控制符,3.4.1 Java的訪問控制符種類 public 公共的,修飾類、屬性和方法 private 私有的,修飾屬性和方法 protected 受保護(hù)的,修飾屬性和方法 private prote
42、cted 私有受保護(hù)的,修飾屬性和方法 無符號的缺省定義 友好的, 修飾類、屬性和方法 作用: 限定類、屬性和方法被程序里的其他部分訪問和調(diào)用,3.4.2 語法結(jié)構(gòu),修飾符1、修飾符2.修飾符N class 類名. 修飾符1、修飾符2.修飾符N 數(shù)據(jù)類型 屬性名 修飾符1、修飾符2.修飾符N 方法返回值類型 方法名(形式參數(shù)列表),3.4.3 訪問控制符的特點(diǎn) 公共訪問控制符 public可以被所有其他類所訪問和引用。但對類而言,其中包含的域和方法能否被訪問看自身的訪問控制符是否也為public。 缺省訪問控制符規(guī)定該類只能被同一包中的類訪問和引用,稱之為包訪問性;類中的域和方法若也沒有訪問控
43、制符來限定,則同樣具備包訪問性。 私有訪問控制符 private只能被該類自身所訪問和修改,不能被任何其他類(包括子類)獲取和引用。,保護(hù)訪問控制符 protected只能被該類自身與它在同一個(gè)包中的其他類、在其他包中該類的子類引用,其主要作用是允許其他包中的它的子類來訪問父類的特定屬性。 私有保護(hù)訪問控制符 private protected可以被該類本身和該類的所有子類引用,類、屬性和方法的訪問控制,A:所有類,B:包中的類,D:本類,C:所有 子類,E:包中 子類,例:AccessControl.java,/測試訪問控制符的使用 import java.applet.Applet; im
44、port java.awt.*; public class AccessControl extends Applet / 定義主類,在瀏覽器中顯示信息 ClassBeAccessed c = new ClassBeAccessed(); /創(chuàng)建被訪問使用類的對象(區(qū)域D) subClass sc = new subClass(); /創(chuàng)建被訪問類子類的對象(區(qū)域C) PackageClass ic = new PackageClass(); /創(chuàng)建被訪問類同一包中類的對象(區(qū)域B) public void paint(Graphics g) /顯示可訪問信息 g.drawString(Self
45、 Accessible:,10,20); /類可以訪問自己的所有屬性和方法 g.drawString(c.toString(),20,35); g.drawString(Sub Accessible:,10,55); /子類可以直接訪問父類的哪些屬性 g.drawString(sc.AccessDirectly(),20,70); g.drawString(Package Accessible:,10,90); /同包中的類可以訪問哪些屬性 g.drawString(ic.AccessDirectly(),20,105); g.drawString(Access using public me
46、thod:,10,125); /通過調(diào)用被訪問類的 g.drawString(sc.AccessCls(),20,140); /公共方法來訪問它的 g.drawString(ic.AccessCls(),20,155); /所有性質(zhì)的屬性 ,class ClassBeAccessed/被訪問類是非公共類,同一包中的其他類都可創(chuàng)建其對象 public String m_PublicProperty; /公共屬性 String m_FriendlyProperty; /缺省屬性(又稱為友元) protected String m_ProtectedProperty; /保護(hù)屬性 private S
47、tring m_PrivateProperty; /私有屬性 ClassBeAccessed()/構(gòu)造函數(shù),為各屬性賦初值 m_PublicProperty = new String(Public); m_FriendlyProperty = new String(Friendly); m_ProtectedProperty = new String(Protected); m_PrivateProperty = new String(Private); public String toString()/公共方法:連接各屬性的字符串并顯示 return(m_PublicProperty + ;
48、 + m_FriendlyProperty + ; + m_ProtectedProperty + ; + m_PrivateProperty + ;); ,class subClass extends ClassBeAccessed/被訪問類的子類 ClassBeAccessed c = new ClassBeAccessed();/創(chuàng)建被訪問類的對象 String AccessDirectly() /直接調(diào)用被訪問類的屬性,可調(diào)用的有: return(c.m_PublicProperty + ; /公共屬性 +c.m_FriendlyProperty + ; /缺省屬性 +c.m_Prot
49、ectedProperty + ; );/保護(hù)屬性 String AccessCls() /通過調(diào)用被訪問類的公共方法,可以調(diào)用它的各種性質(zhì)的屬性 return(c.toString(); class PackageClass /與被訪問類在同一個(gè)包中的類 ClassBeAccessed c = new ClassBeAccessed();/創(chuàng)建被訪問類的對象 String AccessDirectly() /直接調(diào)用被訪問類的屬性,可調(diào)用的有: return(c.m_PublicProperty + ; /公共屬性 +c.m_FriendlyProperty + ; /缺省屬性 +c.m_P
50、rotectedProperty + ; );/保護(hù)屬性 String AccessCls() return(c.toString(); /通過調(diào)用被訪問類的公共方法,可以調(diào)用它的各種性質(zhì)的屬性 ,3.4.4 其他修飾符及修飾符的混合使用,(1)volatile 易失域修飾符 可以同時(shí)被幾個(gè)線程所控制和修改; 一般用于修飾接受外部輸入的屬性,如當(dāng)前時(shí)間的變量由系統(tǒng)后臺線程修改; (2)native 本地方法修飾符 用來聲明用其他語言書寫方法體并具體實(shí)現(xiàn)方法功能的特殊的方法。 聲明:native double CaculateTax(Employee emp); /調(diào)用C+編寫的Caculate
51、Tax模塊 調(diào)用:Emp1.m_Tax=CaculateTax(Emp1); 目的是充分利用已經(jīng)存在的程序功能模塊和避免重復(fù)工作;要注意跨平臺性能。,(3)synchronized 同步方法修飾符 用于多線程共存的程序中的協(xié)調(diào)和同步。 如果是一個(gè)類的方法(即static的方法),那么在系統(tǒng)調(diào)用執(zhí)行前,將把系統(tǒng)類Class中對應(yīng)當(dāng)前類的對象加鎖; 如果修飾的是一個(gè)對象的方法(未用static修飾的方法),則這個(gè)方法在被調(diào)用執(zhí)行前,將把當(dāng)前對象加鎖。,(4)修飾符的混合使用,大多數(shù)情況下,修飾符是可以混合使用的。 例如:public abstract class transportmeans. 但
52、有以下例外: abstract不能與final并列修飾同一個(gè)類; abstract不能與private、static、final、native并列修飾同一個(gè)方法; abstract類中不能有private的成員(包括屬性和方法); abstract方法必須在abstract類中; static方法中不能處理非static的屬性。,3.5 定義和使用Java的方法,回顧: Java程序的基本結(jié)構(gòu) 引入Java類庫; 定義用戶類n 定義類n的若干變量或?qū)ο螅?定義類n的方法1; 定義類n的方法2; . 定義類n的方法M1; ,3.5.1 定義方法 Java中,方法只能在類中定義,由方法頭和 方法體兩部分組成。 格式: 修飾符 返回值類型 方法名(參數(shù)列表) throws 例外名1,例外名2,. 局部變量/對象聲明
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化工分離技術(shù)
- 安徽省淮北市2025-2026學(xué)年七年級上學(xué)期期末考試語文試題(含答案)
- 化工企業(yè)設(shè)備培訓(xùn)課件
- 2026年上海市松江區(qū)初三上學(xué)期一模數(shù)學(xué)試卷和參考答案
- 第一章第1節(jié)人口分布
- 2026黑龍江齊齊哈爾市龍沙區(qū)五龍街道公益性崗位招聘1人考試參考試題及答案解析
- 2026年上半年云南省青少年科技中心招聘人員(3人)參考考試題庫及答案解析
- 2026廣東惠州市博羅縣市場監(jiān)督管理局招聘編外人員6人考試參考試題及答案解析
- 2026年甘肅省嘉峪關(guān)市人民社區(qū)衛(wèi)生服務(wù)中心招聘備考考試題庫及答案解析
- 2026北京印鈔有限公司招聘26人考試參考題庫及答案解析
- 國家自然基金形式審查培訓(xùn)
- 2026馬年卡通特色期末評語(45條)
- NCCN臨床實(shí)踐指南:肝細(xì)胞癌(2025.v1)
- 免租使用協(xié)議書
- 2025 AHA心肺復(fù)蘇與心血管急救指南
- 2026年九江職業(yè)大學(xué)單招職業(yè)適應(yīng)性測試題庫帶答案詳解
- ?;穾靺^(qū)風(fēng)險(xiǎn)動態(tài)評估-洞察與解讀
- 激光焊接技術(shù)規(guī)范
- 消防聯(lián)動排煙天窗施工方案
- 2025年高考物理 微專題十 微元法(講義)(解析版)
- 2025年國家能源投資集團(tuán)有限責(zé)任公司校園招聘筆試備考題庫含答案詳解(新)
評論
0/150
提交評論