面向?qū)ο蟮暮诵奶匦?.ppt_第1頁(yè)
面向?qū)ο蟮暮诵奶匦?.ppt_第2頁(yè)
面向?qū)ο蟮暮诵奶匦?.ppt_第3頁(yè)
面向?qū)ο蟮暮诵奶匦?.ppt_第4頁(yè)
面向?qū)ο蟮暮诵奶匦?.ppt_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java2程序設(shè)計(jì)實(shí)用教程(第2版),第3章 類(lèi)與對(duì)象,3.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述 3.2 面向?qū)ο笈cUML建模 3.3 Java語(yǔ)言與面向?qū)ο筇匦?3.4 類(lèi)的定義和對(duì)象的創(chuàng)建 3.5 方法 3.6 靜態(tài)成員 3.7 包 3.8 成員的訪(fǎng)問(wèn)控制 3.9 封裝 3.10 利用系統(tǒng)已有類(lèi),Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.1面向?qū)ο蟪绦蛟O(shè)計(jì)概述,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.1.1面向?qū)ο笮g(shù)語(yǔ)的解釋,1.對(duì)象 什么是對(duì)象:現(xiàn)實(shí)世界中解決問(wèn)題的實(shí)物(包括有行為和屬性) 例如:咖啡貓 黃色的(屬性)愛(ài)睡覺(jué)(行為) 2.類(lèi) 什么是類(lèi):對(duì)象的模板 模板內(nèi)容=類(lèi)的特性(屬性)+行為(

2、方法) 類(lèi)的成員 例如:貓類(lèi) (有顏色,貓齡等屬性;有睡覺(jué),吃食等行為。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述,類(lèi)與對(duì)象關(guān)系 概念: 類(lèi)(class)是既包括數(shù)據(jù)又包括作用于數(shù)據(jù)的一組操作的封裝體。 對(duì)象(object)是類(lèi)的實(shí)例(instance)。,類(lèi),對(duì)象,抽象,實(shí)例化,方法,數(shù)據(jù)或變量,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.繼承 什么叫繼承?繼承是接收來(lái)自父輩的財(cái)產(chǎn) 在面向?qū)ο笾欣^承的外延是什么?擁有父輩所擁有的東西 子類(lèi)的繼承子類(lèi)擁有父輩的成員 例如:汽車(chē) 繼承 車(chē) /所有種類(lèi)的汽車(chē)都需要實(shí)現(xiàn)汽車(chē)的基本功能 類(lèi)的繼承實(shí)現(xiàn)了代碼的重用。,Java2程序

3、設(shè)計(jì)實(shí)用教程(第2版),4.接口 接口像一個(gè)類(lèi)定義的模板,它提供了與其他事物之間相互通信的規(guī)則條目,但并非具體實(shí)現(xiàn)。 例如:多個(gè)程序員開(kāi)發(fā)同一個(gè)應(yīng)用程序的不同類(lèi),約定不同類(lèi)之間使用同一組方法進(jìn)行通信。則創(chuàng)建一個(gè)接口用于定義這些方法。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),5.封裝 數(shù)據(jù)隱藏。 成員的詳細(xì)信息對(duì) 于對(duì)象外的代碼是 私有的和不可見(jiàn)的。,數(shù)據(jù),方法,外界,訪(fǎng)問(wèn),Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn),1可重用性 2可擴(kuò)展性 3易于管理和維護(hù),Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.2面向?qū)ο笈cUML建模,建模是一項(xiàng)經(jīng)過(guò)檢驗(yàn)并被廣為接受的工程技術(shù)。

4、建立房屋和大廈的建筑模型,能幫助用戶(hù)得到實(shí)際建筑物的印象。 要生產(chǎn)合格的軟件就要有一套關(guān)于體系的結(jié)構(gòu)、過(guò)程和工具的規(guī)范。 建模的目的: 1.有助于按照實(shí)際情況或按照所需的樣式使系統(tǒng)可視化 2.能夠規(guī)約系統(tǒng)的結(jié)構(gòu)或行為 3.給出指導(dǎo)系統(tǒng)構(gòu)造的模板 4.使做出的決策文檔化,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.2.2UML建模語(yǔ)言,什么是UML? Unified Modeling Language(統(tǒng)一建模語(yǔ)言) UML是一種用來(lái)創(chuàng)建程序模型的圖形語(yǔ)言(即帶有語(yǔ)意的一種圖形記號(hào))。可以用來(lái)說(shuō)明代碼中對(duì)象之間的關(guān)系。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.2.3UML進(jìn)行面向?qū)ο蟮南到y(tǒng)分析設(shè)

5、計(jì),UML進(jìn)行面向?qū)ο蟮南到y(tǒng)分析設(shè)計(jì),其過(guò)程通常由以下3個(gè)部份組成。 識(shí)別系統(tǒng)的用例和角色 進(jìn)行系統(tǒng)分析,并抽取類(lèi) 系統(tǒng)設(shè)計(jì),并設(shè)計(jì)類(lèi)及其行為,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.3 Java語(yǔ)言與面向?qū)ο筇匦?Java中的類(lèi):信息以類(lèi)為單位單獨(dú)封裝 Java中的封裝:無(wú)需關(guān)心調(diào)用對(duì)象的內(nèi)部細(xì)節(jié) Java中的繼承:只準(zhǔn)繼承一個(gè)類(lèi),但可以“繼承”多個(gè)接口。 Java中的多態(tài) Java中的垃圾回收機(jī)制:自動(dòng)回收垃圾內(nèi)存,Java2程序設(shè)計(jì)實(shí)用教程(第2版),類(lèi)的封裝性、繼承性和多態(tài)性 類(lèi)的封裝性 類(lèi)的繼承性 類(lèi)的多態(tài)性,數(shù)據(jù),操作,成員變量,成員方法,類(lèi),類(lèi)的封裝性,訪(fǎng)問(wèn)權(quán)限,類(lèi)的繼承性 類(lèi)

6、的多態(tài)性,外部,Java2程序設(shè)計(jì)實(shí)用教程(第2版),類(lèi)的繼承性 繼承的概念:子類(lèi)擁有父類(lèi)的成員。 特性: 1.子類(lèi)自動(dòng)擁有父類(lèi)全部成員(成員變量方法),人類(lèi)(父),學(xué)生類(lèi)(子),性別、姓名、身高、國(guó)籍,吃飯、睡覺(jué)、工作.,性別、姓名、身高、國(guó)籍,吃飯、睡覺(jué)、工作.,Java2程序設(shè)計(jì)實(shí)用教程(第2版),2.子類(lèi)可以更改父類(lèi)繼承的成員; 如學(xué)生類(lèi)中,“工作”方法會(huì)有自己的限制。 3.子類(lèi)可以增加自己的成員; 如學(xué)生類(lèi)中,添加“學(xué)習(xí)”、“考試”等方法。 4.子類(lèi)不能刪除父類(lèi)任何成員。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),Java的單繼承,C,java,多繼承:一個(gè)類(lèi)有多個(gè)直接父類(lèi)??梢該碛卸鄠€(gè)

7、父類(lèi)的屬性或方法。,單繼承:一個(gè)類(lèi)只有一個(gè)直接父類(lèi),若需要繼承其他方法,則通過(guò)接口實(shí)現(xiàn)。,注意:java中只支持單繼承。即子類(lèi)只有一個(gè)直接父類(lèi)。 多繼承特點(diǎn)通過(guò)接口實(shí)現(xiàn)。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),類(lèi)的多態(tài)性 多態(tài):允許擁有相同的形式,但在不同情況下?lián)碛胁煌瑱C(jī)能的特性。如“” 多態(tài)性方法執(zhí)行的多樣性 重載:方法名同,參數(shù)列表不同 覆蓋:子類(lèi)重寫(xiě)了父類(lèi)中同名的方法。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.4類(lèi)的定義和對(duì)象的創(chuàng)建,程序運(yùn)行可理解為做三件事: 建立對(duì)象 使用對(duì)象:對(duì)象之間傳遞消息,程序處理消息作出響應(yīng) 運(yùn)行完畢收回對(duì)象所占空間。 對(duì)象的生命周期:創(chuàng)建運(yùn)行消亡,獲得內(nèi)存

8、空間,進(jìn)行各種操作,使用完釋放內(nèi)存,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.4.1 定義類(lèi):類(lèi)聲明類(lèi)主體,類(lèi)定義的格式: 類(lèi)聲明 成員變量的聲明; 成員方法的聲明及實(shí)現(xiàn); ,類(lèi)主體,類(lèi),注意與c有何區(qū)別!變量與方法的聲明與定義均不允許放在類(lèi)主體外面!,class 類(lèi)名 代碼; ,數(shù)據(jù),方法,Java2程序設(shè)計(jì)實(shí)用教程(第2版),聲明類(lèi):權(quán)限 特性 名字 語(yǔ)法: 修飾符 class 類(lèi) extends 父類(lèi) implements 接口列表,類(lèi)的修飾符用來(lái)說(shuō)明類(lèi)的特殊性質(zhì)。分為三種: 訪(fǎng)問(wèn)控制符: public(公共類(lèi))、friendly(缺省類(lèi)) protected(保護(hù)類(lèi))、 private

9、(私有類(lèi))多見(jiàn)于內(nèi)嵌類(lèi)) 抽象類(lèi)說(shuō)明符:abstract 最終類(lèi)說(shuō)明符:final,關(guān)鍵字,類(lèi)名,表示繼承哪個(gè)父類(lèi),表示繼承哪些接口,Java2程序設(shè)計(jì)實(shí)用教程(第2版),例:聲明一個(gè)公共類(lèi) Data1: public class Data1 定義一個(gè)公共類(lèi) 人類(lèi): 定義一個(gè)類(lèi) 學(xué)生類(lèi):,public class Man ,class Student ,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.4.2類(lèi)之間的關(guān)系,USES-A關(guān)系 HAS-A關(guān)系 IS-A關(guān)系,Java2程序設(shè)計(jì)實(shí)用教程(第2版),1.USES-A關(guān)系,類(lèi)A的方法操縱了類(lèi)B(對(duì)象)的成員,則稱(chēng)之為類(lèi)A”USES-A”(用到了)

10、類(lèi)B. 例3-1,轎車(chē)類(lèi)(Car),其他類(lèi)(Sample3_1),調(diào)用,USES-A關(guān)系,Public class Sample3_1 c.startIsEnough(); ,Java2程序設(shè)計(jì)實(shí)用教程(第2版),2. HAS-A關(guān)系,HAS-A關(guān)系是一種擁有關(guān)系,若類(lèi)A中有 B類(lèi)型的成員引用變量,則類(lèi)A “HAS-A” (擁有)類(lèi)B. 例3-2,c.getTyreInfo().getMaterial();,轎車(chē)類(lèi)(Car),輪胎類(lèi)(Tyre),擁有,HAS-A關(guān)系,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.IS-A關(guān)系,在面向?qū)ο笾小癐S-A”的概念是基于繼承的,旨在表達(dá)一個(gè)類(lèi)是另一個(gè)類(lèi)的子

11、類(lèi)。也就是說(shuō),若類(lèi)A是類(lèi)B子類(lèi)的一種,則可以說(shuō)類(lèi)A“IS-A”(是一種)類(lèi)B。 例如:“蘋(píng)果” 是 “水果” 的種類(lèi),class Fruit public void canEat() ,class Apple ,Apple a=new Apple() a.canEat();,水果,蘋(píng)果,繼承,IS-A關(guān)系,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.4.3構(gòu)造函數(shù),要使用對(duì)象,首先必須構(gòu)造它們,并指定它們的初始狀態(tài),然后將方法應(yīng)用于對(duì)象。 在Java程序設(shè)計(jì)語(yǔ)言中,使用構(gòu)造函數(shù)來(lái)構(gòu)造新的實(shí)例,作用是構(gòu)造并初始化對(duì)象。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),構(gòu)造函數(shù)的創(chuàng)建,創(chuàng)建無(wú)參構(gòu)造函數(shù) 例3-

12、3 創(chuàng)建帶參構(gòu)造函數(shù) 例3-4,Java2程序設(shè)計(jì)實(shí)用教程(第2版),構(gòu)造函數(shù)的特點(diǎn)有:,(1)構(gòu)造函數(shù)的方法名與類(lèi)名相同。 (2)構(gòu)造函數(shù)沒(méi)有返回類(lèi)型,也無(wú)需聲明類(lèi)型。 (3)構(gòu)造函數(shù)的主要作用是完成對(duì)類(lèi)對(duì)象的初始化工作,并傳遞參數(shù)。 (4)構(gòu)造函數(shù)不能由編程人員顯式地直接調(diào)用。由系統(tǒng)調(diào)用。 (5)一個(gè)類(lèi)可以定義多個(gè)構(gòu)造方法,缺省構(gòu)造函數(shù)為無(wú)參的默認(rèn)構(gòu)造函數(shù),不執(zhí)行任何代碼。 (6)構(gòu)造方法可以重載,以參數(shù)的個(gè)數(shù)、類(lèi)型或排列順序區(qū)分。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.3.4類(lèi)成員,聲明成員變量 修飾符 static final transient 數(shù)據(jù)類(lèi)型 變量名,訪(fǎng)問(wèn)控制符: p

13、ublic(公共類(lèi)) friendly(缺省類(lèi)) protected(保護(hù)類(lèi)) private(私有類(lèi)),類(lèi)(靜態(tài))成員變量,常量,臨時(shí)變量,類(lèi)聲明 成員變量的聲明; 成員方法的聲明及實(shí)現(xiàn); ,Java2程序設(shè)計(jì)實(shí)用教程(第2版),例3-5:定義Student類(lèi),聲明3個(gè)成員變量分別表示姓名、年齡、班級(jí): public class Student/類(lèi)聲明 public String stuName; public int stuAge; public String stuClass; 成員變量的引用,/聲明成員變量,Java2程序設(shè)計(jì)實(shí)用教程(第2版),2.成員變量的初始值,創(chuàng)建對(duì)象后,如果對(duì)

14、象有成員變量,則系統(tǒng)會(huì)自動(dòng)為其分配一個(gè)初始值。 例3-6 例3-7,注意:對(duì)象引用型成員變量,其初始值為“null”,表示此引用沒(méi)有指向任何對(duì)象。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.4.5 對(duì)象的創(chuàng)建,聲明對(duì)象 類(lèi)名 對(duì)象 例:Student s; 對(duì)象實(shí)例化 對(duì)象 = new 類(lèi)的構(gòu)造方法(參數(shù)列表) s= new Student(); 引用對(duì)象的成員變量及方法:用“.”運(yùn)算符 對(duì)象.成員變量 對(duì)象.成員方法(參數(shù)列表) = 王強(qiáng); /引用對(duì)象的成員變量,Student,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.5 方法,方法的定義 方法的基本組成:方法的聲明+方法體

15、修飾符 static 返回值類(lèi)型 方法(參數(shù)列表) throws 異常類(lèi) 語(yǔ)句序列; return 返回值; ,方法聲明:,方法體:,Java2程序設(shè)計(jì)實(shí)用教程(第2版),例: int sub(int a, int b) return a-b; ,int sub(int a, int b) int c; c=a-b; return c; ,Java2程序設(shè)計(jì)實(shí)用教程(第2版),說(shuō)明: 1.參數(shù)序列 指定要傳遞給方法什么樣的信息 (1)可以是java中的任何類(lèi)型,包括基本數(shù)據(jù)參數(shù)類(lèi)型、對(duì)象引用類(lèi)型。 (2)每個(gè)參數(shù)必須包括類(lèi)型與變量標(biāo)識(shí)符,若有多個(gè)參數(shù),則用逗號(hào)將其分隔。如(int a,int

16、b),Java2程序設(shè)計(jì)實(shí)用教程(第2版),2.方法體 方法體是該方法具體業(yè)務(wù)代碼的實(shí)現(xiàn)。 return語(yǔ)句負(fù)責(zé)方法的返回。 3.返回值類(lèi)型 返回值類(lèi)型指定了該方法返回結(jié)果的類(lèi)型。可以是基本數(shù)據(jù)類(lèi)型或?qū)ο笠妙?lèi)型,沒(méi)有返回值也要使用void關(guān)鍵字。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),返回值規(guī)則:,可以在具有對(duì)象引用返回類(lèi)型的方法中返回null,但基本數(shù)據(jù)類(lèi)型作為返回類(lèi)型則不可以返回null。 對(duì)象給也是完全合法的返回值類(lèi)型,如數(shù)組。 在具有基本數(shù)據(jù)返回類(lèi)型的方法內(nèi),可以返回任何值,只要其能夠自動(dòng)轉(zhuǎn)換返回值類(lèi)型。如返回值為double,返回整數(shù)4是可以的。但返回值為int時(shí),返回一個(gè)浮點(diǎn)數(shù)1

17、2.43則 報(bào)錯(cuò)。 一定不能在具有void返回類(lèi)型的方法中返回任何內(nèi)容。 在具有對(duì)象引用返回類(lèi)型的方法內(nèi),可以返回任何類(lèi)型的對(duì)象引用,只要返回的引用與返回類(lèi)型相同或可自動(dòng)轉(zhuǎn)換為返回類(lèi)型即可。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.5.2 方法重載,概念: 同一個(gè)類(lèi)中多個(gè)方法有相同的名字,不同的參數(shù)列表,這種情況稱(chēng)為方法重載。 如:public double changeSize(int size,String name, float pattern) public void changeSize(int size,String name) private int changeSize(in

18、t size,float pattern) void changeSize(float pattern,String name) ?方法返回類(lèi)型不同,參數(shù)相同,算不算重載? 注意: 返回類(lèi)型不同并不足以構(gòu)成方法重載。 當(dāng)重載方法被調(diào)用時(shí),編譯器根據(jù)參數(shù)的類(lèi)型和數(shù)量來(lái)確定實(shí)際調(diào)用哪個(gè)重載方法的版本。例3-8,Java2程序設(shè)計(jì)實(shí)用教程(第2版),方法調(diào)用進(jìn)行匹配的時(shí)候,首先選擇直接匹配的方法,如果沒(méi)有,則將參數(shù)進(jìn)行提升轉(zhuǎn)換后再匹配方法,總是匹配最接近的方法。基本類(lèi)型則按照基本數(shù)據(jù)類(lèi)型間的自動(dòng)轉(zhuǎn)換關(guān)系;引用類(lèi)型則尋找最能兼容傳遞的參數(shù)。 例3-9 多匹配選擇示例例3-10,Java2程序設(shè)計(jì)實(shí)用教

19、程(第2版),3.5.3遞歸,遞歸方法就是自調(diào)用方法,在方法體內(nèi)直接或間接地調(diào)用自己。有兩種方式: 1.直接遞歸 2.間接遞歸,Java2程序設(shè)計(jì)實(shí)用教程(第2版),直接遞歸:即在方法體內(nèi)調(diào)用方法本身。 例:求斐波那數(shù)列第n項(xiàng) 斐波那數(shù)列:f(0)=f(1)=1 f(n)=f(n-1)+f(n-2)(n1) 例3-11,Java2程序設(shè)計(jì)實(shí)用教程(第2版),間接遞歸:函數(shù)中調(diào)用其他函數(shù),其他函數(shù)又調(diào)用本函數(shù)。 例3-12,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.6靜態(tài)成員,靜態(tài)修飾符static,修飾類(lèi)中的靜態(tài)屬性和方法,(1)靜態(tài)屬性被static修飾的屬性稱(chēng)為靜態(tài)屬性(類(lèi)屬性)。 特點(diǎn):

20、它們是類(lèi)的屬性,而不屬于任何一個(gè)類(lèi)的具體對(duì)象。即在一個(gè)類(lèi)中只能有一個(gè)這類(lèi)字段,并且由類(lèi)調(diào)用,無(wú)需引用任何對(duì)象。 (2)靜態(tài)方法被static修飾的方法成為靜態(tài)方法(類(lèi)方法)。 特點(diǎn):不與任何對(duì)象相關(guān)聯(lián)。能夠在它的類(lèi)的任何對(duì)象訪(fǎng)問(wèn)前輩訪(fǎng)問(wèn),即使沒(méi)有對(duì)象也能調(diào)用該方法。靜態(tài)方法只能調(diào)用靜態(tài)屬性。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),例: public class StaticDemo public static String s=“我是靜態(tài)變量” public static void printInfo() System.out.println(“我是靜態(tài)方法”); ,問(wèn)?在其他類(lèi)中如何調(diào)用靜態(tài)

21、變量和方法?例3-13,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.6.2靜態(tài)變量與常量,在java中,表示常量的方法是通過(guò)靜態(tài)成員變量的方式來(lái)實(shí)現(xiàn)的: 如:聲明3個(gè)常量X,Y,Z: public static final int X=10; public static final int Y=20; public static final int Z=40; “public static final”相當(dāng)于表示常量的修飾符。,公共的,即所有對(duì)象都能夠訪(fǎng)問(wèn)。,靜態(tài)的,即無(wú)需創(chuàng)建任何對(duì)象直接可通過(guò)類(lèi)調(diào)用。,最終的,即定義的值為永久的,不能改變。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),靜態(tài)屬性的初始

22、化,靜態(tài)成員變量的初始化要求在靜態(tài)語(yǔ)句塊 結(jié)束之前必須完成。一方面可以在聲明的 同時(shí)進(jìn)行初始化,另一方面可以在靜態(tài)語(yǔ) 句塊中進(jìn)行初始化。 例3-4,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.6.3靜態(tài)成員的訪(fǎng)問(wèn),. 例3-15 1.靜態(tài)方法訪(fǎng)問(wèn)非靜態(tài)成員,靜態(tài)成員生命周期比非靜態(tài)要長(zhǎng),當(dāng)訪(fǎng)問(wèn)靜態(tài)成員時(shí),非靜態(tài)成員不一定存在,因此靜態(tài)方法不能訪(fǎng)問(wèn)非靜態(tài)屬性。同樣道理,靜態(tài)方法不能使用this預(yù)定對(duì)象關(guān)鍵字。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),例3-16 靜態(tài)方法訪(fǎng)問(wèn)非靜態(tài)成員示例1 例3-17 靜態(tài)方法訪(fǎng)問(wèn)非靜態(tài)成員示例2,Java2程序設(shè)計(jì)實(shí)用教程(第2版),2.非靜態(tài)方法訪(fǎng)問(wèn)靜態(tài)成員 非

23、靜態(tài)方法產(chǎn)生時(shí),靜態(tài)成員已經(jīng)存在。因此靜態(tài)方法在任何時(shí)候都可以訪(fǎng)問(wèn)靜態(tài)成員。 例3-18,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.6.4main方法,Main方法特殊的靜態(tài)方法,作為程序的入口,由于不對(duì)任何對(duì)象施加操作(實(shí)為執(zhí)行時(shí)還無(wú)任何對(duì)象產(chǎn)生),因此聲明為static;該方法由虛擬機(jī)調(diào)用,所以必須為public;而方法不需要返回值,因此聲明為void。 聲明:public static void main(String args) 例3-19,Main方法規(guī)定有一個(gè)類(lèi)型為String的入?yún)?,取名為args。用于接收命令行輸入的參數(shù)。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.6.5 Fa

24、ctory方法,Java的靜態(tài)方法有一種常見(jiàn)的用途,就是使用Factory方法產(chǎn)生不同風(fēng)格的對(duì)象,例如NumberFormat類(lèi)使用Factory方法產(chǎn)生不同風(fēng)格的格式對(duì)象。Factory Method是最常用的模式了,F(xiàn)actory方法在Java程序系統(tǒng)中可以說(shuō)是隨處可見(jiàn)。 Factory方法就相當(dāng)于創(chuàng)建實(shí)例對(duì)象的new,我們經(jīng)常要根據(jù)類(lèi)Class生成實(shí)例對(duì)象,如A a=new A() ,Factory Method也是用來(lái)創(chuàng)建實(shí)例對(duì)象的,所以以后new時(shí)可以考慮實(shí)用factory模式(工廠(chǎng)模式),雖然這樣做,可能多做一些工作,但會(huì)給系統(tǒng)帶來(lái)更大的可擴(kuò)展性和盡量少的修改量。,Java2程序設(shè)

25、計(jì)實(shí)用教程(第2版),Factory作用:完成復(fù)雜情況下的初始化工作。 盡量將長(zhǎng)的代碼分派“切割”成每段,將每段再“封裝”起來(lái)。這樣就需要將創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開(kāi), 也就是說(shuō),讓創(chuàng)建實(shí)例所需要的大量初始化工作從構(gòu)造函數(shù)中分離出去。這時(shí)我們就需要Factory工廠(chǎng)模式來(lái)生成對(duì)象了。 使用工廠(chǎng)方法要注意幾個(gè)角色,首先要定義產(chǎn)品接口, 如Fruit,產(chǎn)品接口下有接口的實(shí)現(xiàn)類(lèi),如Apple,其次要有一 個(gè)factory類(lèi),用來(lái)生成產(chǎn)品。 例Factory方法實(shí)例:例3-20,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.7 包,概念:包是一種將相關(guān)類(lèi),接口或其他包組織起來(lái)的集合體。 目的:用來(lái)

26、管理類(lèi)名空間,將包含類(lèi)代碼的文件組織起來(lái),易于查找和使用,避免同名類(lèi)發(fā)生沖突。 內(nèi)容:類(lèi),接口及其他包。 說(shuō)明:包是一種松散的類(lèi)集合,一般在不要求處于同一個(gè)包中的類(lèi)有明確的相互關(guān)系,但是由于同一包的類(lèi)在默認(rèn)情況下可以互相訪(fǎng)問(wèn),因此常把需要在一起工作的類(lèi)放在一個(gè)包里。包也稱(chēng)類(lèi)庫(kù),Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.7.1 包的定義,(1)缺省情況下為無(wú)名包 (2)有名包的創(chuàng)建:使用package語(yǔ)句 如:package pname; 3-13 或 package dir1.dir2.pname; 包就是一個(gè)文件夾,里面存放該程序所生成的所有.class文件,包中的“.”號(hào)表示子文件夾。 默

27、認(rèn)包中類(lèi)之間可以相互訪(fǎng)問(wèn)public,protected或默認(rèn)訪(fǎng)問(wèn)權(quán)限的數(shù)據(jù)成員和成員函數(shù)。默認(rèn)包中的類(lèi)不能被其他包中的類(lèi)引用。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),package語(yǔ)句必須放在源文件最前面,之前不可以有其他任何語(yǔ)句; 每個(gè)源文件最多只能有一條package語(yǔ)句。 例3-21 將類(lèi)Sample3_21放至包c(diǎn)hapter03的sample3_21中。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),JDK環(huán)境下包中類(lèi)的編譯和運(yùn)行,編譯時(shí):javac 運(yùn)行: d:javajava,d CLASSPATH路徑 Myclass.java CLASSPATH變量指明包存放的位置。例如: java

28、c d d:java Sample3_21.java 結(jié)果:直接在d:java下創(chuàng)建在myclass.java指明的包目錄,并把Myclass.class拷到該目錄下。,包名.myclass,例如: java chapter03.sample3_21.Sample3_21,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.7.2 類(lèi)的導(dǎo)入,(1)加載引用(類(lèi)短名)使用import語(yǔ)句 格式:import mypack1.mypack2.Myclass 或 import mypack1. mypack2.* 注意: 1. Import語(yǔ)句必須先于所有類(lèi)聲明。 2.使用(*)只能表示本層次的所有類(lèi),而不包

29、括子層次下的類(lèi)。 如 import java.awt.*; import java.awt.event.*;/上面的語(yǔ)句未包括event 子包中的類(lèi) 3. 用(*)一般適用于要用到同個(gè)包當(dāng)中的多個(gè)類(lèi)的情況。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),(2)類(lèi)長(zhǎng)名:直接使用包名、類(lèi)名前綴(用在語(yǔ)句中) 格式: mypack1.mypack2.Myclass 例如:java.util.Date d1=new java.util.Date(),Java2程序設(shè)計(jì)實(shí)用教程(第2版),(3)直接引用:在同一文件夾下(私有類(lèi)除外) 將無(wú)名包中的引用類(lèi)與被引用類(lèi)存貯在同一物理空間 例如:假如Car和Sample

30、3_3這兩個(gè)類(lèi)在向一個(gè)目錄下,你就可以在Sample3_3類(lèi)中創(chuàng)建一個(gè)Car實(shí)例,無(wú)需導(dǎo)入Car這個(gè)類(lèi)。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),注意:java中java.lang包中的類(lèi)系統(tǒng)是自動(dòng)引入的,即使不用import語(yǔ)句,每個(gè)源文件中系統(tǒng)編譯時(shí)都會(huì)自動(dòng)引入java.lang.*中的類(lèi)。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),兩種特殊情況需要注意: 1.兩個(gè)包中有同名類(lèi),但只用到其中一個(gè)及其他不同名的類(lèi),則在import語(yǔ)句中明確給出需要引用的類(lèi)名。如例3-22 2.兩個(gè)包中有同名類(lèi),且都要使用,則直接在語(yǔ)句中指明調(diào)用哪個(gè)類(lèi)。如例3-23,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.7.3

31、靜態(tài)導(dǎo)入,從Java SE 5.0開(kāi)始,導(dǎo)入語(yǔ)句不但可以導(dǎo)入類(lèi),還具有導(dǎo)入靜態(tài)方法和靜態(tài)成員變量的功能,不過(guò)需要在關(guān)鍵字“import”和包名之間添加關(guān)鍵字“static”,語(yǔ)法如下。 import static .*; import static .; “*”還是代表通配符,不過(guò)這里表示的是指定類(lèi)下面所有靜態(tài)的方法或成員變量。如果要明確指明要使用的方法或成員變量,用第2行語(yǔ)法。碰到不同類(lèi)下同名靜態(tài)方法或成員變量時(shí),解決沖突的方法類(lèi)似上一小節(jié),這里不再贅述。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.8成員的訪(fǎng)問(wèn)控制,成員的訪(fǎng)問(wèn)是指以下兩種不同的操作: 一個(gè)類(lèi)中的方法代碼是否能夠調(diào)用(調(diào)用)另

32、一個(gè)類(lèi)中的成員。 一個(gè)類(lèi)是否能夠繼承其父類(lèi)的成員。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),所有類(lèi)A,所有子類(lèi)C,同包中類(lèi)B 包中子 類(lèi)E,本類(lèi)D,訪(fǎng)問(wèn)控制符:,Java2程序設(shè)計(jì)實(shí)用教程(第2版),公共類(lèi)型:public 例3-26 私有類(lèi)型:private 例3-27 默認(rèn)類(lèi)型:default 例3-28 保護(hù)類(lèi)型:protected,Java2程序設(shè)計(jì)實(shí)用教程(第2版),封裝是一個(gè)面向?qū)ο蟮男g(shù)語(yǔ),其含義很簡(jiǎn)單,就是把東西包裝起來(lái)。換言之,成員變量和方法的定義都包裝于類(lèi)定義之中,類(lèi)定義可以看成是將構(gòu)成類(lèi)的成員變量和方法封裝起來(lái)。 通過(guò)限定類(lèi)成員的可見(jiàn)性,可以使類(lèi)成員中的某些屬性和方法能夠不被

33、程序的其他部分訪(fǎng)問(wèn),它們被隱藏了起來(lái),只能在定義的類(lèi)中使用,這就是面向?qū)ο笾袑?shí)現(xiàn)封裝的方式。,3.9封 裝,成員變量,成員方法,類(lèi),外部,Java2程序設(shè)計(jì)實(shí)用教程(第2版),Java中封裝需要遵循的規(guī)則: 用訪(fǎng)問(wèn)限制修飾符保護(hù)成員變量,通常是private。 建立公有的public訪(fǎng)問(wèn)方法,強(qiáng)制調(diào)用代碼通過(guò)這些方法訪(fǎng)問(wèn)成員變量,而不是直接調(diào)用。 例3-29,Java2程序設(shè)計(jì)實(shí)用教程(第2版),分析: width和height成員變量被封裝,必須通過(guò)setProerty方法才能訪(fǎng)問(wèn),由于在setProerty方法中設(shè)置了檢驗(yàn)值正確性的規(guī)則,所以不可能設(shè)置錯(cuò)誤的width和height值,增加

34、代碼的健壯性。 封裝后不但可以提高健壯性,還可以提高靈活性,例如,若因需要將height或width的值改為String類(lèi)型,如果沒(méi)有封裝,代碼一旦修改,則所有調(diào)用該值的代碼都需要更改;而封裝后只需要修改設(shè)置成員值的方法,將變化限制在一個(gè)較小的范圍內(nèi),使外界無(wú)需做任何改變?nèi)阅芾^續(xù)調(diào)用。例3-30,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.10 利用系統(tǒng)已有的類(lèi),通過(guò)前面幾節(jié)的介紹,讀者已經(jīng)對(duì)類(lèi)的定義及對(duì)象的創(chuàng)建與使用有了一定的了解。本節(jié)將介紹Java類(lèi)庫(kù)中提供的幾個(gè)常用的處理日期時(shí)間的類(lèi)。通過(guò)對(duì)這幾個(gè)類(lèi)的介紹,使讀者了解利用系統(tǒng)已有的類(lèi)的思想。,Java2程序設(shè)計(jì)實(shí)用教程(第2版),3.10.1 Date類(lèi),在標(biāo)準(zhǔn)Java類(lèi)庫(kù)中包含一個(gè)Date類(lèi),其對(duì)象用來(lái)描述一個(gè)時(shí)間點(diǎn),如“September 22,2007,23:59:59 GMT”。在使用Date類(lèi)時(shí)要在代碼的開(kāi)始添加“imp

溫馨提示

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

評(píng)論

0/150

提交評(píng)論