《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第2章_第1頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第2章_第2頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第2章_第3頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第2章_第4頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第2章_第5頁(yè)
已閱讀5頁(yè),還剩130頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章設(shè)計(jì)類2.1認(rèn)識(shí)對(duì)象與類的概念2.2類的構(gòu)造方法2.3類的封裝2.4使用UltraEdit編輯Java程序2.5軟件工程中類的圖形化表示方法第2章設(shè)計(jì)類學(xué)習(xí)目標(biāo)

初步掌握J(rèn)ava程序中類的設(shè)計(jì);

掌握J(rèn)ava語(yǔ)言中對(duì)象與類的概念;

掌握類成員與實(shí)例成員的概念;

理解方法重載的概念;

理解什么是對(duì)象的封裝性;

學(xué)會(huì)定義類、創(chuàng)建對(duì)象與使用對(duì)象;

掌握構(gòu)造方法的用法;

學(xué)會(huì)使用UltraEdit編輯Java程序;

理解軟件工程中類的圖形化表示方法?;炯寄?.1認(rèn)識(shí)對(duì)象與類的概念對(duì)象與類是Java語(yǔ)言程序設(shè)計(jì)的精髓,從本質(zhì)上來(lái)說(shuō),學(xué)習(xí)Java語(yǔ)言就是學(xué)習(xí)對(duì)象與類的設(shè)計(jì)。Java語(yǔ)言程序就是對(duì)問(wèn)題域(開(kāi)發(fā)一個(gè)軟件是為了解決某些問(wèn)題,這些問(wèn)題所涉及的業(yè)務(wù)范圍稱做該軟件的問(wèn)題域)內(nèi)“一群對(duì)象以及這些對(duì)象之間關(guān)系的描述”。下面我們從人們生活的現(xiàn)實(shí)世界開(kāi)始,介紹對(duì)象與類的概念。2.1.1對(duì)象和類

1.現(xiàn)實(shí)世界中的對(duì)象在現(xiàn)實(shí)世界中,對(duì)象可以是有生命的個(gè)體,比如一個(gè)人或一只鳥(niǎo),如圖2-1所示。在現(xiàn)實(shí)世界中,對(duì)象也可以是無(wú)生命的個(gè)體,如一輛汽車或一臺(tái)計(jì)算機(jī),如圖2-2所示。圖2-1有生命的對(duì)象圖2-2無(wú)生命的對(duì)象在現(xiàn)實(shí)世界中,還有一類對(duì)象比較特殊,它代表了一個(gè)抽象的概念,如表示天氣的變化情況時(shí),“天氣”這個(gè)概念就是一個(gè)抽象的概念,如圖2-3所示。因而,對(duì)象還可以是抽象的概念。圖2-3抽象的對(duì)象綜上所述,現(xiàn)實(shí)世界的對(duì)象可以是有生命的,也可以是無(wú)生命的,甚至可以是抽象的概念。Java語(yǔ)言中的對(duì)象也有這三類。為了便于學(xué)習(xí),我們暫時(shí)不考慮抽象的對(duì)象,而認(rèn)為對(duì)象就是現(xiàn)實(shí)世界中的某個(gè)實(shí)體。

2.?Java語(yǔ)言中的對(duì)象(Object)

Java語(yǔ)言中對(duì)象的概念來(lái)源于真實(shí)世界的對(duì)象,即對(duì)象的概念就是現(xiàn)實(shí)世界中某個(gè)具體的物理實(shí)體在計(jì)算機(jī)中的映射和體現(xiàn)?,F(xiàn)實(shí)世界中的某個(gè)人(即一個(gè)對(duì)象)有身高、體重等狀態(tài),可以進(jìn)行唱歌、打球等某些活動(dòng);又如,現(xiàn)實(shí)世界中的對(duì)象——鳥(niǎo)有顏色等狀態(tài),鳥(niǎo)具有飛與叫等行為。進(jìn)一步,如果總結(jié)現(xiàn)實(shí)世界中的對(duì)象,就會(huì)發(fā)現(xiàn)它總有兩個(gè)特征:狀態(tài)和行為。對(duì)象的狀態(tài)保存在變量中,對(duì)象的行為由方法(即函數(shù))來(lái)實(shí)現(xiàn),可以用圖2-4表示一個(gè)對(duì)象的組成。圖2-4對(duì)象的組成同樣,在Java語(yǔ)言中表示現(xiàn)實(shí)世界中某個(gè)具體的對(duì)象時(shí),也是由數(shù)據(jù)屬性和用于操作數(shù)據(jù)的方法組成(行為)的。一個(gè)對(duì)象的屬性值決定了對(duì)象所處的狀態(tài)(如某個(gè)人的身高為170cm,體重為60kg,這就是人類中某個(gè)對(duì)象身高和體重屬性的取值)。對(duì)象的操作是指該對(duì)象可以完成的功能(即展現(xiàn)給外部的服務(wù))。例如,某大型客機(jī)可視為一個(gè)對(duì)象,它具有位置、速度、顏色、容量等屬性,對(duì)于該對(duì)象可施行起飛、降落、加速、維修等操作,這些操作將或多或少地改變飛機(jī)的屬性值(狀態(tài))。我們也可以這樣理解計(jì)算機(jī)世界中的對(duì)象,即對(duì)象是把數(shù)據(jù)及其相關(guān)操作封裝在一起所構(gòu)成的實(shí)體,可表示為封裝的實(shí)體=數(shù)據(jù)+方法(行為)其中,數(shù)據(jù)是對(duì)象的屬性或狀態(tài);方法是作用于數(shù)據(jù)上的操作;封裝是指一個(gè)對(duì)象由屬性和方法的有機(jī)體組成,屬性值的變化要通過(guò)相應(yīng)方法的操作來(lái)完成。最后說(shuō)明一點(diǎn),狀態(tài)是對(duì)象的靜態(tài)特性,如電視機(jī)(對(duì)象)的狀態(tài)是種類、品牌、外觀、大小等;行為是對(duì)象的操作,如對(duì)電視機(jī)(對(duì)象)可以進(jìn)行打開(kāi)、關(guān)閉、調(diào)整音量等操作。

3.類(Class)在現(xiàn)實(shí)世界里,有許多相同“種類”的對(duì)象。如圖2-5所示,鴿子、企鵝、烏龜?shù)榷紝儆趧?dòng)物類,公交車、出租車、小汽車等屬于汽車類。圖2-5現(xiàn)實(shí)世界的類這些相同“種類”的對(duì)象可以歸納為一個(gè)“類”。例如,圖2-5中的各種動(dòng)物可以歸納為動(dòng)物類,各種汽車可以歸納為汽車類。因此,現(xiàn)實(shí)世界中的任何對(duì)象都是屬于某種“類”的對(duì)象。與現(xiàn)實(shí)世界類似,在Java語(yǔ)言中,任何一個(gè)對(duì)象也屬于某一種類。這類似于C語(yǔ)言中12、2332、2等整數(shù)都是int類型一樣。因此,在Java語(yǔ)言中,類就是一種數(shù)據(jù)類型,對(duì)象就是屬于某種類型的一個(gè)變量。我們也可以這樣理解類,類是對(duì)象的藍(lán)圖,這個(gè)藍(lán)圖就像汽車廠制造汽車的圖紙一樣,一種車型的圖紙,可以生產(chǎn)成千上萬(wàn)輛相同型號(hào)的汽車。同樣在程序設(shè)計(jì)中,當(dāng)定義好一個(gè)類以后,可以以該類為藍(lán)圖創(chuàng)建很多實(shí)例對(duì)象。類是一種抽象的數(shù)據(jù)類型,它是所有具有一定共性的對(duì)象的抽象。從本質(zhì)上可以認(rèn)為類是對(duì)對(duì)象的描述,是創(chuàng)建對(duì)象的“模板”。類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),是Java的核心和本質(zhì)所在。在Java中,所有的語(yǔ)言元素都必須被封裝在類中。

4.類的實(shí)例在現(xiàn)實(shí)世界中,汽車類有些共同的狀態(tài)(汽缸排氣量,擋數(shù),顏色,輪胎數(shù)等)和行為(換擋,開(kāi)燈,開(kāi)冷氣等),而你的汽車只是現(xiàn)實(shí)世界中汽車類的一個(gè)特例。在Java語(yǔ)言中,我們就稱你的汽車對(duì)象是汽車類中的一個(gè)實(shí)例,如圖2-6所示。圖2-6汽車類的實(shí)例類的某一個(gè)特定的對(duì)象被稱為該類的一個(gè)實(shí)例,所以對(duì)象是類實(shí)例化的結(jié)果。也可以說(shuō),實(shí)例是具有特征值的類的一個(gè)特例。因?yàn)槊總€(gè)實(shí)例的屬性值是確定的,如你的汽車是藍(lán)色的、有4個(gè)輪胎、發(fā)動(dòng)機(jī)的排量為1.6等,所以每個(gè)實(shí)例都要在內(nèi)存中為它分配存儲(chǔ)屬性值的存儲(chǔ)空間。在Java語(yǔ)言中,創(chuàng)建類的實(shí)例要用關(guān)鍵詞new,如圖2-7是用一個(gè)類創(chuàng)建多個(gè)實(shí)例的示意圖。每個(gè)對(duì)象在用new創(chuàng)建后,就會(huì)在內(nèi)存中分配存儲(chǔ)空間以存儲(chǔ)該實(shí)例對(duì)象的數(shù)據(jù)。圖2-7類創(chuàng)建實(shí)例的示意圖最后要說(shuō)明一點(diǎn),類只是一張創(chuàng)建實(shí)例對(duì)象的藍(lán)圖,它不是對(duì)象,不能對(duì)類直接進(jìn)行操作。如果把類比作汽車生產(chǎn)廠的圖紙,我們知道,圖紙是不能當(dāng)真正的汽車來(lái)開(kāi)的,只有根據(jù)圖紙制造出的汽車,才是真正的對(duì)象,才可以開(kāi)動(dòng)。所以,每當(dāng)我們想要一個(gè)實(shí)例對(duì)象時(shí),就需要先從其類加以實(shí)例化來(lái)產(chǎn)生對(duì)象,然后才能在程序中對(duì)實(shí)例化后的對(duì)象進(jìn)行操作。2.1.2【案例2-1】設(shè)計(jì)汽車類

1.案例描述設(shè)計(jì)一個(gè)汽車類,“制造”(即創(chuàng)建)該汽車類的兩個(gè)實(shí)例,一個(gè)實(shí)例對(duì)象表示王明的汽車,一個(gè)實(shí)例對(duì)象表示張華的汽車,然后輸出每輛汽車的配置情況。

2.案例效果案例程序的執(zhí)行效果如圖2-8所示。圖中,從第3行開(kāi)始輸出兩輛汽車實(shí)例對(duì)象的配置信息。圖2-8案例2-1的顯示效果

3.技術(shù)分析該程序要設(shè)計(jì)一個(gè)汽車類,汽車的屬性有顏色、汽車型號(hào)、汽缸排氣量、輪胎型號(hào)等,因此,在汽車類Car中定義了表示這些屬性的數(shù)據(jù)字段;汽車可以進(jìn)行換擋、剎車、開(kāi)冷氣等操作(為了節(jié)省篇幅,程序中只設(shè)計(jì)了換擋和剎車兩個(gè)方法),根據(jù)需要還設(shè)計(jì)了一個(gè)輸出汽車配置情況的方法。

4.程序解析下面的程序定義了一個(gè)汽車類Car和一個(gè)使用Car類的TestCar類,實(shí)例化了兩個(gè)對(duì)象“王明的汽車”和“張華的汽車”。在該程序中對(duì)象的名稱使用了漢字,也就是說(shuō)用漢字作為變量的名稱(即標(biāo)識(shí)符的名稱),這在Java語(yǔ)言中是允許的。(這里只是為了便于讀者理解,一般在軟件實(shí)際開(kāi)發(fā)中不使用漢字作標(biāo)識(shí)符,建議讀者盡量使用有一定意義的英文或漢語(yǔ)拼音,關(guān)于標(biāo)識(shí)符的命名方法在第3.7節(jié)中有較為詳細(xì)的介紹。)01//******************************02//案例:2.103//程序名:TestCar.java04//作者:任泰明05//功能:定義汽車類軟件版本1.006//日期:2007-2-407//******************************0809//定義一個(gè)汽車類Car10classCar{11 //汽車類的屬性12 Stringcolor;//汽車顏色13 StringcarType;//汽車型號(hào)14 floatengine;//汽車排氣量15 StringtireType;//汽車輪胎型號(hào)16 17 //汽車換擋操作18 voidshiftGear(){19 System.out.println("\n汽車開(kāi)始換擋操作...");20 }21 22 //汽車剎車操作23 voidbrake(){24 System.out.println("\n汽車開(kāi)始剎車操作...");25 }26 27 //輸出汽車配置信息的方法28 voidequipment(){29 System.out.println("汽車顏色是:"+color);30 System.out.println("汽車型號(hào)是:"+carType);31 System.out.println("汽車排氣量是:"+engine);32 System.out.println("汽車輪胎型號(hào)是:"+tireType);33 }34}3536//定義了一個(gè)使用汽車類Car的TestCar類37classTestCar{38 publicstaticvoidmain(Stringargs[])39 {40 //創(chuàng)建王明的汽車實(shí)例對(duì)象41 Car王明的汽車=newCar();42 43 //給王明的汽車對(duì)象提供屬性數(shù)據(jù)44 王明的汽車.color="BLACK";45 王明的汽車.carType="REDFLAG-1";46 王明的汽車.engine=2.0f;47 王明的汽車.tireType="中華-1號(hào)";48 49 System.out.println("王明的汽車配置情況如下:");50 51 //王明的汽車對(duì)象進(jìn)行操作52 王明的汽車.equipment();53 王明的汽車.shiftGear();54 王明的汽車.brake();5556 //創(chuàng)建張華的汽車實(shí)例對(duì)象57 Car張華的汽車=newCar();58 59 //給張華的汽車對(duì)象提供屬性數(shù)據(jù)60 張華的汽車.color="RED";61 張華的汽車.carType="REDFLAG-2";62 張華的汽車.engine=2.6f;63 張華的汽車.tireType="中華-2號(hào)";64 65 System.out.println("---------------------------");66 System.out.println("張華的汽車配置情況如下:");67 68 //張華的汽車對(duì)象進(jìn)行操作69 張華的汽車.equipment();70 張華的汽車.shiftGear();71 張華的汽車.brake();72 }73}在第1章中介紹過(guò),在軟件開(kāi)發(fā)過(guò)程中,在書(shū)寫(xiě)程序時(shí)要加上完整的注釋。本例中,01~07行是作者、版本、功能等內(nèi)容,在后面的程序中,為了節(jié)省篇幅,只進(jìn)行一些必要的注釋。案例2-1的第41行實(shí)例化了一個(gè)名為“王明的汽車”的對(duì)象,第44~47行對(duì)該對(duì)象的屬性賦值,在52行輸出王明的汽車配置信息,53行和54行對(duì)“王明的汽車”對(duì)象進(jìn)行操作(這里只是做了一個(gè)簡(jiǎn)單的模擬動(dòng)作,即輸出了進(jìn)行操作的內(nèi)容),在57行實(shí)例化了一個(gè)名為“張華的汽車”的對(duì)象,其后對(duì)該對(duì)象進(jìn)行了類似于“王明的汽車”對(duì)象的操作。詳細(xì)內(nèi)容見(jiàn)程序中的注釋。2.1.3【相關(guān)知識(shí)】定義類與創(chuàng)建對(duì)象

1.定義類的語(yǔ)法類是Java語(yǔ)言中一種重要的復(fù)合數(shù)據(jù)類型,是組成Java程序的基本要素。在程序設(shè)計(jì)中,一個(gè)類的定義包括類聲明和類體兩個(gè)部分。定義一個(gè)類的簡(jiǎn)單語(yǔ)法是:class類名{

成員變量(屬性)

成員方法}成員變量的聲明方式類似于C語(yǔ)言中變量的聲明。成員方法與C語(yǔ)言中的函數(shù)寫(xiě)法類似,其簡(jiǎn)單格式為:返回值類型方法名([形式參數(shù)列表]){

方法體}

2.創(chuàng)建與使用對(duì)象對(duì)象的創(chuàng)建包括聲明、實(shí)例化和初始化。創(chuàng)建一個(gè)對(duì)象的語(yǔ)法是:類名對(duì)象名=new類名([實(shí)參列表]);●聲明:指聲明一個(gè)某類的對(duì)象,格式為“類名對(duì)象名;”。聲明并不為對(duì)象分配內(nèi)存空間?!駥?shí)例化:指使用運(yùn)算符new為對(duì)象分配內(nèi)存空間,一個(gè)類的不同對(duì)象分別占據(jù)不同的內(nèi)存空間?!癯跏蓟菏侵附o實(shí)例對(duì)象的屬性字段賦初始值,一般通過(guò)調(diào)用對(duì)象的構(gòu)造方法來(lái)完成(該內(nèi)容在本章的下一節(jié)介紹)。通過(guò)運(yùn)算符“.”可以實(shí)現(xiàn)對(duì)對(duì)象屬性變量的訪問(wèn)和方法的調(diào)用。變量和方法可以通過(guò)設(shè)定訪問(wèn)權(quán)限來(lái)限制其他對(duì)象對(duì)其的訪問(wèn)(在下一章內(nèi)容中介紹)。引用對(duì)象成員變量的格式為 對(duì)象名.成員變量名引用對(duì)象成員方法的格式為 對(duì)象名.方法名(實(shí)參列表)一個(gè)對(duì)象的生命周期包括三個(gè)階段:創(chuàng)建、使用和消除。Java語(yǔ)言中,系統(tǒng)在判定一個(gè)對(duì)象確實(shí)再?zèng)]有被引用時(shí),就會(huì)自動(dòng)消除該對(duì)象(即回收分配給該對(duì)象的內(nèi)存,這就是所謂的垃圾回收)。

3.簡(jiǎn)單數(shù)據(jù)類型和對(duì)象類型的區(qū)別每個(gè)變量名代表一個(gè)存儲(chǔ)值的內(nèi)存地址。對(duì)于簡(jiǎn)單類型變量來(lái)說(shuō),對(duì)應(yīng)的內(nèi)存存放簡(jiǎn)單數(shù)據(jù)類型的值。但對(duì)于對(duì)象類型變量來(lái)說(shuō),存放的是指向?qū)ο笤趦?nèi)存中存儲(chǔ)位置的地址(也叫引用)。2.2類的構(gòu)造方法設(shè)計(jì)Java程序從本質(zhì)上來(lái)說(shuō),就是設(shè)計(jì)與問(wèn)題有關(guān)的一個(gè)個(gè)類。類設(shè)計(jì)好了以后,在程序中就可以使用類來(lái)實(shí)例化對(duì)象。實(shí)例化對(duì)象就是給對(duì)象分配內(nèi)存空間,并將對(duì)象初始化。對(duì)象的初始化是由類的構(gòu)造方法來(lái)完成的。2.2.1對(duì)象的初始化對(duì)象的初始化就是給對(duì)象的屬性字段賦初值。在案例2-1中,程序的44~47行其實(shí)就是給實(shí)例對(duì)象“王明的汽車”所屬的4個(gè)屬性賦初值的語(yǔ)句,程序的60~63行就是給實(shí)例對(duì)象“張華的汽車”所屬的4個(gè)屬性賦初值的語(yǔ)句,這種賦初值的方法大家比較熟悉,其實(shí)就是賦值語(yǔ)句。同時(shí),這種賦初值的方法比較麻煩,也不符合面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。對(duì)象在創(chuàng)建過(guò)程中,其實(shí)有些屬性(或者狀態(tài))是與生俱來(lái)的,如一個(gè)人的性別、膚色、父母親等。因此,如果在對(duì)象生成的時(shí)候就進(jìn)行初始化,則更加自然與簡(jiǎn)便。構(gòu)造方法就是在一個(gè)對(duì)象創(chuàng)建后自動(dòng)對(duì)其屬性進(jìn)行初始化的一種特殊方法。

1.構(gòu)造方法構(gòu)造方法(Constructormethod)也叫構(gòu)造函數(shù)、構(gòu)造器、構(gòu)建器等。構(gòu)造方法之所以是一種特殊的方法,是因?yàn)镴ava程序中的每個(gè)類都有構(gòu)造方法,并且構(gòu)造方法與一般方法相比有如下特性:●構(gòu)造方法的方法名必須與類名完全一致?!駱?gòu)造方法用于對(duì)對(duì)象的屬性進(jìn)行初始化,所以不需要返回值,即構(gòu)造方法在書(shū)寫(xiě)時(shí)不能有返回類型?!駱?gòu)造方法不能由編程人員顯式地直接調(diào)用,而是創(chuàng)建(new)對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用。●構(gòu)造方法的主要作用是初始化對(duì)象。

2.默認(rèn)構(gòu)造方法大家可能會(huì)有這樣的疑問(wèn),前面的案例1-1和案例2-1不是都沒(méi)有構(gòu)造方法嗎?但程序可以照樣運(yùn)行,并沒(méi)有什么錯(cuò)誤。這是因?yàn)椋绻粋€(gè)Java類沒(méi)有顯式的定義構(gòu)造方法,則該類在編譯時(shí),Java編譯器會(huì)自動(dòng)加上一個(gè)默認(rèn)構(gòu)造方法。默認(rèn)的構(gòu)造方法非常簡(jiǎn)單,其格式如下:類名(){}由此可知,默認(rèn)構(gòu)造方法沒(méi)有參數(shù),方法體為空。

3.帶參數(shù)的構(gòu)造方法帶參數(shù)的構(gòu)造方法就是由用戶自定義的構(gòu)造方法。帶參數(shù)的構(gòu)造方法根據(jù)具體情況可以有1到多個(gè)參數(shù),其格式如下:類名(參數(shù)列表){方法體

}從面向?qū)ο蟮木幊趟枷雭?lái)說(shuō),一個(gè)對(duì)象的屬性,如果初值取值不合理,則可能使對(duì)象置于“不安全”狀態(tài)。如某對(duì)象中有一個(gè)表示人們年齡的屬性,如果使用默認(rèn)的初值,則年齡字段的值有可能為0,我們知道,人的年齡一般不會(huì)為0歲。因此,設(shè)計(jì)恰當(dāng)?shù)臉?gòu)造方法,使對(duì)象生成后就處于一種安全狀態(tài)是非常關(guān)鍵的。2.2.2【案例2-2】求兩點(diǎn)之間的距離

1.案例描述給定一個(gè)平面內(nèi)三個(gè)不同的點(diǎn)p1、p2和p3,求出任意兩點(diǎn)(即點(diǎn)p1和點(diǎn)p2、點(diǎn)p1和點(diǎn)p3、點(diǎn)p2和點(diǎn)p3)之間的距離。

2.案例效果案例程序的執(zhí)行效果如圖2-9所示。圖中從第3行開(kāi)始輸出3個(gè)點(diǎn)的坐標(biāo),然后求出了任意兩點(diǎn)之間的距離。圖2-9案例2-2顯示效果

3.技術(shù)分析該問(wèn)題的要點(diǎn)是求直角坐標(biāo)平面內(nèi)兩點(diǎn)之間的距離,所涉及到的對(duì)象是“點(diǎn)”,所以要在程序中定義一個(gè)點(diǎn)類。一個(gè)點(diǎn)有橫坐標(biāo)和縱坐標(biāo)兩個(gè)屬性,一個(gè)點(diǎn)可以在坐標(biāo)系中移動(dòng),也可以判斷一個(gè)點(diǎn)是否在橫坐標(biāo)上或是否在縱坐標(biāo)上,還可以求兩點(diǎn)之間的距離。經(jīng)過(guò)分析,與該問(wèn)題有關(guān)的點(diǎn)類應(yīng)該定義為:class點(diǎn){

橫坐標(biāo)x;

縱坐標(biāo)y;

點(diǎn)對(duì)象進(jìn)行初始化的構(gòu)造方法;取得一個(gè)點(diǎn)坐標(biāo)的方法;求兩個(gè)點(diǎn)之間距離的方法;}

4.程序解析下面是根據(jù)以上分析定義的點(diǎn)類MyPoint,程序中定義的TestMyPoint類使用了MyPoint類。在MyPoint類中,定義了用來(lái)初始化點(diǎn)對(duì)象的構(gòu)造方法,程序如下:01//**************************************02//案例:2.2程序名:TestMyPoint.java03//功能:求兩個(gè)點(diǎn)之間的距離04//**************************************0506//定義一個(gè)點(diǎn)類07classMyPoint{08 //類的屬性字段09 intx;//點(diǎn)的橫坐標(biāo)x10 inty;//點(diǎn)的縱坐標(biāo)y11 12 //無(wú)參數(shù)的構(gòu)造方法13 MyPoint(){14 x=0;15 y=0;16 System.out.println("產(chǎn)生點(diǎn)(0,0)");17 }18 19 //有1個(gè)參數(shù)的構(gòu)造方法20 MyPoint(inta){21 x=a;22 System.out.println("產(chǎn)生點(diǎn)("+a+",0)");23 } 2425 //有2個(gè)參數(shù)的構(gòu)造方法26 MyPoint(inta,intb){27 x=a;28 y=b;29 System.out.println("產(chǎn)生點(diǎn)("+a+","+b+")");30 }31 32 //求兩點(diǎn)之間的距離33 doubledistance(MyPointp1,MyPointp2){34 returnMath.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));35 }36 37 //取得一個(gè)點(diǎn)的坐標(biāo)38 StringgetPoint(){39 return("點(diǎn)("+x+","+y+")");40 }41}4243classTestMyPoint{44 publicstaticvoidmain(Stringargs[]){//產(chǎn)生一個(gè)點(diǎn)p1,調(diào)用無(wú)參數(shù)的構(gòu)造方法46 MyPointp1=newMyPoint();47 //產(chǎn)生一個(gè)點(diǎn)p2,調(diào)用有一個(gè)參數(shù)的構(gòu)造方法48 MyPointp2=newMyPoint(2);49 //產(chǎn)生一個(gè)點(diǎn)p3,調(diào)用有兩個(gè)參數(shù)的構(gòu)造方法50 MyPointp3=newMyPoint(2,4);51 52 //下面三條語(yǔ)句為求兩個(gè)不同點(diǎn)之間的距離,并輸出結(jié)果53 System.out.println(p1.getPoint()+"到"+p2.getPoint()+"的距離是:"+p1.distance(p1,p2));54 System.out.println(p1.getPoint()+"到"+p3.getPoint()+"的距離是:"+p1.distance(p1,p3));55 System.out.println(p2.getPoint()+"到"+p3.getPoint()+"的距離是:"+p1.distance(p2,p3));56 }57}程序的07~41行定義了一個(gè)點(diǎn)類MyPoint。13~17行定義了一個(gè)無(wú)參數(shù)的構(gòu)造方法,該方法將一個(gè)點(diǎn)對(duì)象的橫坐標(biāo)x和縱坐標(biāo)y都初始化為0;程序的46行使用該構(gòu)造方法對(duì)點(diǎn)p1進(jìn)行了初始化,創(chuàng)建的p1點(diǎn)為(0,0)。程序的20~23行定義了只有一個(gè)參數(shù)的構(gòu)造方法,該方法將對(duì)象的橫坐標(biāo)x初始化為創(chuàng)建對(duì)象時(shí)所給定的實(shí)參數(shù)值,縱坐標(biāo)y的值在構(gòu)造方法中沒(méi)有給出,則在對(duì)象實(shí)例化過(guò)程中被自動(dòng)初始化為默認(rèn)值0。程序的48行使用了該構(gòu)造方法對(duì)點(diǎn)p2進(jìn)行了初始化,其中橫坐標(biāo)x的值為2,即創(chuàng)建的p2點(diǎn)為(2,0)。程序的26~30行定義了一個(gè)有兩個(gè)參數(shù)的構(gòu)造方法,該構(gòu)造方法將對(duì)象的橫坐標(biāo)x和縱坐標(biāo)y初始化為創(chuàng)建對(duì)象時(shí)所給定的實(shí)參數(shù)值。程序的50行使用該構(gòu)造方法對(duì)點(diǎn)p3進(jìn)行了初始化,其中橫坐標(biāo)x的值初始化為2,縱坐標(biāo)y的值初始化為4,即創(chuàng)建的p3點(diǎn)為(2,4)。程序的33~35行定義了一個(gè)求兩點(diǎn)之間距離的方法distance。distance有兩個(gè)點(diǎn)類型的形式參數(shù),在調(diào)用distance時(shí),實(shí)參數(shù)要使用已經(jīng)實(shí)例化的點(diǎn),如程序的53~55行在輸出方法System.out.println()中調(diào)用了distance。在distance方法中,34行的Math.sqrt()方法使用了JavaAPI中已經(jīng)定義好的類Math。Math類中定義了一些常用的數(shù)學(xué)函數(shù),如正弦函數(shù)sin、絕對(duì)值函數(shù)abs、求最大值函數(shù)max以及取整函數(shù)round等,這些函數(shù)(即方法)都可以在程序中用類似34行的用法直接使用。如求-12.45的絕對(duì)值,則可以寫(xiě)成:Math.abs(-12.45);求-12.4、1.34和23.9三個(gè)數(shù)中的最大值,則可以寫(xiě)成:Math.max(Math.max(-12.4,1.34),23.9);注:JavaAPI中定義了大量的類,程序員可以在編程時(shí)使用JavaAPI中已經(jīng)定義好的類。關(guān)于JavaAPI的用法可參考有關(guān)幫助文檔。程序的53~55行調(diào)用distance的3條語(yǔ)句特別有意思,讀者在上機(jī)調(diào)試時(shí),可以將其換為下面的格式(即將調(diào)用distance的對(duì)象由p1換為p2):53 System.out.println(p1.getPoint()+"到"+p2.getPoint()

+"的距離是:"+p2.distance(p1,p2));54 System.out.println(p1.getPoint()+"到"+p3.getPoint()

+"的距離是:"+p2.distance(p1,p3));55 System.out.println(p2.getPoint()+"到"+p3.getPoint()

+"的距離是:"+p2.distance(p2,p3));或換為下面的格式(即將調(diào)用distance的對(duì)象由p1換為p3):53 System.out.println(p1.getPoint()+"到"+

p2.getPoint()+"的距離是:"+p3.distance(p1,p2));System.out.println(p1.getPoint()+"到"+

p3.getPoint()+"的距離是:"+p3.distance(p1,p3));55 System.out.println(p2.getPoint()+"到"+p3.getPoint()+"的距離是:"+p3.distance(p2,p3));執(zhí)行程序后,看結(jié)果是否相同,你能根據(jù)結(jié)果解釋其原因嗎?最后要說(shuō)明一點(diǎn),在程序的3個(gè)構(gòu)造方法中,都有一條輸出一個(gè)點(diǎn)坐標(biāo)值的語(yǔ)句,即程序中16行、22行和29行,這3行語(yǔ)句只是為了讓讀者看清在實(shí)例化一個(gè)對(duì)象時(shí),構(gòu)造方法確實(shí)被系統(tǒng)自動(dòng)調(diào)用了才加上去的,并非是構(gòu)造方法中必須的語(yǔ)句。2.2.3【相關(guān)知識(shí)】構(gòu)造方法的重載在案例程序2-2中,3個(gè)構(gòu)造方法的名稱相同,即類名都為MyPoint,不同的方法(即函數(shù))在程序中使用了相同的名稱。這在C語(yǔ)言等程序設(shè)計(jì)中是不允許的,但在面向?qū)ο蟪绦蛟O(shè)計(jì)中,同一個(gè)類中可能經(jīng)常要使用同名的方法,這是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特性,即方法的重載。所謂重載(overloading),是指在Java程序設(shè)計(jì)中,一個(gè)類中的同名且不同功能的方法。案例2-2中的3個(gè)構(gòu)造方法是方法重載的典型應(yīng)用。多個(gè)重載的構(gòu)造方法,其形參的個(gè)數(shù)或類型應(yīng)不同。使用方法重載時(shí),初學(xué)者需注意以下兩點(diǎn):

(1)參數(shù)類型和個(gè)數(shù)都相同,參數(shù)名稱不同時(shí),不能進(jìn)行方法重載(這是初學(xué)者常犯的錯(cuò)誤)。如在案例2-2中定義的類MyPoint中,增加一個(gè)給縱坐標(biāo)y初始化的構(gòu)造方法,即有如下的程序片段:1MyPoint(inta){2x=a;3System.out.println("產(chǎn)生點(diǎn)("+a+",0)");4} 56MyPoint(intb){7y=b;8System.out.println("產(chǎn)生點(diǎn)(0,"+b+")");9}盡管第1行和第6行的形參變量名稱不同,但由于重載方法的參數(shù)類型和個(gè)數(shù)相同,因此不能進(jìn)行重載。在程序編譯時(shí)會(huì)出現(xiàn)如下錯(cuò)誤:“已在MyPoint中定義MyPoint(int)MyPoint(intb){^”該錯(cuò)誤表示,已經(jīng)在MyPoint類中定義了有一個(gè)整形參數(shù)的構(gòu)造方法,不能再定義另外一個(gè)也只有一個(gè)整形參數(shù)的構(gòu)造方法。但是,如果將上面的程序片段改成如下形式,則程序編譯不會(huì)發(fā)生錯(cuò)誤:1MyPoint(inta){2x=a;3System.out.println("產(chǎn)生點(diǎn)("+a+",0)");4} 56MyPoint(floatb){7y=(int)b;8System.out.println("產(chǎn)生點(diǎn)("+b+",0)");9} 這是因?yàn)?,雖然兩個(gè)重載的方法都只有一個(gè)參數(shù),但它們的參數(shù)類型不同,所以編譯器在編譯程序時(shí)可以區(qū)分這兩個(gè)方法,就不會(huì)產(chǎn)生編譯錯(cuò)誤。

(2)一個(gè)類只要定義了構(gòu)造方法,那么編譯器將不會(huì)給該類添加默認(rèn)的構(gòu)造方法。例如,將案例2-2中的13~17行用/*…*/注釋掉(注意,這也是調(diào)試程序的一種技巧,一般可將暫時(shí)不需要執(zhí)行的語(yǔ)句注釋掉,而不要?jiǎng)h除),則在編譯程序時(shí)將出現(xiàn)如下錯(cuò)誤:TestMyPoint.java:46:找不到符號(hào)符號(hào):構(gòu)造函數(shù)MyPoint()位置:類MyPoint MyPointp1=newMyPoint();

1錯(cuò)誤說(shuō)明程序的46行“MyPointp1=newMyPoint();”要使用無(wú)參的默認(rèn)構(gòu)造方法實(shí)例化一個(gè)對(duì)象,但類MyPoint中沒(méi)有定義無(wú)參的構(gòu)造方法,所以編譯出錯(cuò)。最后對(duì)構(gòu)造方法總結(jié)如下:●一個(gè)類可以有多個(gè)構(gòu)造方法(通過(guò)構(gòu)造方法的重載來(lái)實(shí)現(xiàn));●如果類中沒(méi)有定義構(gòu)造方法,則編譯器給類提供一個(gè)默認(rèn)構(gòu)造方法,該構(gòu)造方法沒(méi)有參數(shù),而且方法體為空。2.3類的封裝面向?qū)ο蟪绦蛟O(shè)計(jì)有三個(gè)重要特性:封裝性、繼承性和多態(tài)性。其中封裝性是面向?qū)ο蟪绦蛟O(shè)計(jì)最重要的一個(gè)特性,下面詳細(xì)介紹對(duì)象封裝性的概念(繼承性和多態(tài)性將在后續(xù)章節(jié)中介紹)。2.3.1類的封裝現(xiàn)實(shí)生活中,對(duì)象是一個(gè)有機(jī)的整體,如說(shuō)到某個(gè)“人”,則這個(gè)人有姓名、性別等屬性,可以進(jìn)行“吃”、“唱”、“跑”等活動(dòng)(即操作,對(duì)應(yīng)方法)。體現(xiàn)在Java語(yǔ)言中,對(duì)象就是對(duì)一組變量和相關(guān)方法的封裝體,如圖2-10所示。圖2-10對(duì)象的封裝圖2-10中的成員變量是對(duì)象的核心,反映對(duì)象的外部特征,其值是受保護(hù)的,一般不允許外部對(duì)象對(duì)它進(jìn)行直接訪問(wèn)。成員方法代表對(duì)象的行為,主要是用來(lái)加工處理成員變量的。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,將數(shù)據(jù)成員和屬于此數(shù)據(jù)的操作方法都放在同一個(gè)對(duì)象中,這就是所謂的封裝(encapsulation)。在一個(gè)對(duì)象封裝體中,其他的對(duì)象只有通過(guò)成員方法來(lái)訪問(wèn)被隱藏的成員變量。舉一個(gè)日常生活中的例子,一臺(tái)家用電視機(jī)可以看做是一個(gè)封裝體,如果要調(diào)頻道、音量和色彩等,使用者不需要知道電視機(jī)內(nèi)部的電子線路,只要會(huì)使用調(diào)頻道、調(diào)音量、調(diào)色彩的外部調(diào)節(jié)按鈕即可。同樣在程序中,你并不需要知道一個(gè)對(duì)象的完整結(jié)構(gòu)是如何的,你只要知道完成某一功能要調(diào)用哪一個(gè)方法即可(即一個(gè)程序?qū)ν馓峁┑慕涌?。通過(guò)對(duì)象的封裝實(shí)現(xiàn)了程序的模塊化和信息隱藏。通過(guò)對(duì)類的成員施以一定的訪問(wèn)權(quán)限,實(shí)現(xiàn)了類中成員的信息隱藏。封裝性可以避免一個(gè)對(duì)象的數(shù)據(jù)成員被不正當(dāng)?shù)卮嫒。赃_(dá)到信息隱藏和保護(hù)對(duì)象的效果。封裝有兩個(gè)主要的好處:●模塊化(modularity):一個(gè)對(duì)象就是一個(gè)模塊?!裥畔㈦[藏:一個(gè)對(duì)象有公開(kāi)的接口可供其他的對(duì)象與之溝通,但對(duì)象仍然維持私有的信息及方法。

Java語(yǔ)言中,對(duì)象成員變量的保護(hù)是通過(guò)給成員變量加訪問(wèn)修飾符private來(lái)實(shí)現(xiàn)的。由private修飾的成員稱為私有成員。私有成員只允許由聲明它的類中的成員方法使用,即只能被這個(gè)類本身訪問(wèn)。注意:如果一個(gè)類的構(gòu)造方法聲明為private,則其他類不能生成該類的實(shí)例。2.3.2【案例2-3】圓類

1.案例描述在開(kāi)發(fā)一個(gè)數(shù)學(xué)軟件包的過(guò)程中,分配給程序員小王的任務(wù)是設(shè)計(jì)圓類,要求對(duì)一個(gè)圓對(duì)象可以設(shè)置圓的半徑,求圓的周長(zhǎng)與面積。

2.案例效果案例程序的執(zhí)行效果如圖2-11所示,圖中從第3行開(kāi)始輸出程序中兩個(gè)圓對(duì)象的信息圖2-11案例2-3的執(zhí)行結(jié)果

3.技術(shù)分析該程序比較簡(jiǎn)單,一個(gè)圓對(duì)象有半徑屬性,為了求圓的周長(zhǎng)和面積,還要定義一個(gè)屬性即圓周率π(程序中用PI表示)。該程序的關(guān)鍵問(wèn)題是要用面向?qū)ο蟮乃枷雭?lái)實(shí)現(xiàn),即要符合對(duì)象封裝性的特性。

4.程序解析下面是案例2-3的程序代碼。01//************************************02//案例:2.3程序名:TestCircle.java03//功能:定義圓類,求圓的周長(zhǎng)和半徑04//************************************0506//定義圓類07classCircle{08 //圓的屬性09 privatefloatradius;10 01//*************************************02//案例:2.3程序名:TestCircle.java03//功能:定義圓類,求圓的周長(zhǎng)和半徑04//*************************************0506//定義圓類07classCircle{08 //圓的屬性09 privatefloatradius;10 22 }23 24 //設(shè)置圓的半徑25 publicvoidsetRadius(floatr){26 radius=r;27 }28 29 //取得圓的半徑30 publicfloatgetRadius(){31 returnradius;32 }33 34 //求圓的周長(zhǎng)35 publicfloatgirth(){36 return2*PI*radius;37 }3839 //求圓的面積40 publicfloatarea(){41 returnPI*radius*radius;42 }43}4445//定義圓類的測(cè)試類TestCircle46classTestCircle{47 publicstaticvoidmain(Stringargs[]){48 //產(chǎn)生一個(gè)圓c1對(duì)象,調(diào)用無(wú)參數(shù)的構(gòu)造方法49 Circlec1=newCircle();50 //設(shè)置圓c1的半徑51 //c1.radius=21.1f;52 c1.setRadius(21.1f);53 //輸出圓c1的信息System.out.println("\n第1個(gè)圓的半徑="+

c1.getRadius()+",面積="+c1.area()+",周長(zhǎng)="+

c1.girth());55 56 //產(chǎn)生一個(gè)圓c2對(duì)象,調(diào)用有參數(shù)的構(gòu)造方法57 Circlec2=newCircle(12.24f);58 //輸出圓c2的信息System.out.println("第2個(gè)圓的半徑="+c2.getRadius()+

",面積="+c2.area()+",周長(zhǎng)="+c2.girth());60 61 //下面的程序段用于測(cè)試類的靜態(tài)(static)屬性,該知識(shí)點(diǎn)在后文介紹62 /*c1.PI=3.14159f;63 System.out.println("\nc1.PI="+c1.PI);64 System.out.println("c2.PI="+c2.PI);65 System.out.println("Circle.PI="+Circle.PI);66 67 c2.PI=3.14f;68 System.out.println("\nc1.PI="+c1.PI);69 System.out.println("c2.PI="+c2.PI); 70 System.out.println("Circle.PI="+Circle.PI);71 */72 }73}程序的第07~43行定義了一個(gè)圓類,該圓類有一個(gè)私有成員變量,即半徑radius。在Java語(yǔ)言中,類的私有成員前要用訪問(wèn)控制修飾符private,私有成員只能在定義私有成員類的內(nèi)部使用,如在Circle類中,16行、21行和26行等處使用了radius,這是正確的。如果在定義私有成員類的外部使用了私有成員,則會(huì)出現(xiàn)編譯錯(cuò)誤,如將程序中第51行的注釋去掉,編譯程序會(huì)發(fā)生如圖2-12所示的錯(cuò)誤。圖2-12案例2-3編譯時(shí)的錯(cuò)誤由圖2-12的第2行可以看出,程序TestCircle.java的51行有錯(cuò)誤,具體原因是,Circle中定義的私有成員radius在其他類中(TestCircle)進(jìn)行了訪問(wèn),這是不允許的。對(duì)于私有成員屬性,在一個(gè)類中一般要定義相應(yīng)的方法對(duì)其進(jìn)行設(shè)置與獲取。如果私有成員的屬性名為XXX,則一般使用類似于下面的方法設(shè)置其值(即所謂的設(shè)置器,如案例2-3中的25~27行定義的setRadius方法):voidsetXXX(參數(shù)列表){…}一般使用類似于下面的方法獲取私有屬性XXX的值(即所謂的讀取器,如案例2-3中的30~32行定義的getRadius方法):返回類型getXXX(){return…}類的成員屬性或成員方法前加public修飾符,表示公共成員,任何一個(gè)類都可以訪問(wèn)這些公共成員。例如案例2-3中的12行和所有方法成員,為了便于在Circle類外進(jìn)行訪問(wèn),都定義成了公共成員。程序的第35~37行,定義了求圓周長(zhǎng)的方法girth。程序的第40~42行,定義了求圓面積的方法area。程序的第46~73行,定義了一個(gè)測(cè)試Circle的類TestCircle,該類的第49行用無(wú)參的構(gòu)造方法實(shí)例化了一個(gè)圓對(duì)象c1,無(wú)參數(shù)的構(gòu)造方法將圓對(duì)象c1的半徑radius初始化為0。52行調(diào)用setRadius設(shè)置器方法將c1圓的半徑設(shè)置為21.1f(f表示單精度實(shí)數(shù))。57行調(diào)用有參數(shù)的構(gòu)造方法實(shí)例化了一個(gè)圓對(duì)象c2,由于構(gòu)造方法的參數(shù)是12.24f,因此圓對(duì)象c2的半徑為12.24。在程序中,多處在輸出信息的System.out.println()方法中使用了“\n”,同C語(yǔ)言類似,它表示一個(gè)轉(zhuǎn)義符,起到換行的作用。2.3.3【相關(guān)知識(shí)】類成員與實(shí)例成員一個(gè)類的成員屬性和成員方法,如果使用了static修飾符進(jìn)行了說(shuō)明,則稱為類成員;如果沒(méi)有使用static修飾符進(jìn)行說(shuō)明,則稱為實(shí)例成員。類成員包括類變量和類方法,類變量也叫靜態(tài)變量,類方法也叫靜態(tài)方法。實(shí)例成員包括實(shí)例變量和實(shí)例方法。

1.類變量在案例2-3中,類Circle中定義了一個(gè)圓周率π(在程序中用PI表示)。我們知道,所有圓的圓周率π都是相同的,即使沒(méi)有實(shí)例化任何一個(gè)圓對(duì)象,圓周率π的值是存在的和確定的。對(duì)于這類屬性,由于所有實(shí)例對(duì)象都取相同的值,并且在沒(méi)有對(duì)象生成前就有確定的值,因此,在Java語(yǔ)言中就要用一個(gè)特殊的標(biāo)記來(lái)標(biāo)識(shí)這種變量,這個(gè)標(biāo)記就是“static”(靜態(tài))關(guān)鍵字。被static標(biāo)記的變量在對(duì)象創(chuàng)建之前就可以使用,所以將其稱為類變量(即它屬于類,而不屬于實(shí)例對(duì)象)或靜態(tài)變量。類變量可以用下列方法引用:類名.變量名(如案例2-3程序中,第65行和70行的"Circle.PI")實(shí)例.變量名(如案例2-3程序中,第63行和68行的"c1.PI",第64行和69行的"c2.PI")第二種引用方式可以理解為是前一種引用方式的別名,它們都引用相同的內(nèi)存單元。為了更好地理解類變量,可以用圖2-13表示案例2-3中的類變量PI。圖2-13類變量示意圖如果將案例2-3程序中的62行和71行注釋去掉,然后編譯和運(yùn)行程序,則得到如圖2-14所示的結(jié)果。從圖2-14中可以看出,不論對(duì)c1.PI、c2.PI或Circle.PI中的哪一個(gè)賦值,輸出c1.PI、c2.PI和Circle.PI時(shí)其值都是相同的,因?yàn)樗鼈円玫氖窍嗤膬?nèi)存單元。圖2-14案例2-3中對(duì)類變量的演示結(jié)果

2.類方法有些類中的方法,在沒(méi)有創(chuàng)建該類的對(duì)象之前,也需要通過(guò)類名直接被調(diào)用。如一個(gè)程序中的main主方法,在沒(méi)有創(chuàng)建對(duì)象之前就要被系統(tǒng)調(diào)用,對(duì)于這類方法也要使用“static”關(guān)鍵字標(biāo)識(shí)。由于在創(chuàng)建對(duì)象之前就可以通過(guò)類名直接調(diào)用,因此這種方法屬于類,叫類方法或靜態(tài)方法。類方法可以用下列格式引用:類名.方法名實(shí)例.方法名注意1:在類方法中只能引用類變量,也就是說(shuō),靜態(tài)方法中不能使用非靜態(tài)成員(即不能引用下面介紹的實(shí)例變量)。注意2:靜態(tài)方法中不能使用this(在第3章介紹)和super(在第5章介紹)。注意3:靜態(tài)方法中可以定義和使用局部變量。在JavaAPI提供的數(shù)學(xué)工具M(jìn)ath類中,就定義了很多常用的數(shù)學(xué)函數(shù)(即方法)。這些方法由于都是靜態(tài)的,即所有方法都用static修飾,因此可以直接以“Math.函數(shù)名(參數(shù))”的方式調(diào)用,簡(jiǎn)化了程序的設(shè)計(jì),如案例2-2的34行。

3.實(shí)例變量與實(shí)例方法沒(méi)有用static修飾的成員叫實(shí)例成員。類的實(shí)例成員只有在用new關(guān)鍵字實(shí)例化對(duì)象后,才能被引用。實(shí)例成員必須用對(duì)象名來(lái)訪問(wèn)。同類的不同對(duì)象(實(shí)例),其實(shí)例成員變量在內(nèi)存中具有不同的存儲(chǔ)單元。如圖2-13所示Circle類的實(shí)例成員變量radius,對(duì)于對(duì)象c1和對(duì)象c2來(lái)說(shuō),在內(nèi)存中分配了不同的存儲(chǔ)空間,可以存儲(chǔ)不同的數(shù)值。為了便于理解實(shí)例成員,下面用一個(gè)實(shí)例演示類成員和實(shí)例成員的區(qū)別。01classStaticDemo{02 inta=4;//實(shí)例變量a03 staticintb=15;//類變量b04 05 //類方法show106 staticvoidshow1(){07 System.out.println("staticmethod.");08 //System.out.println("a="+a);//錯(cuò)誤1!09 System.out.println("b="+b);10 }11 12 //實(shí)例方法show213 voidshow2(){14 System.out.println("instancemethod.");15 System.out.println("a="+a);16 System.out.println("b="+b);17 }18}1920classTestStaticDemo{21 publicstaticvoidmain(Stringargs[]){22 //直接引用StaticDemo類的實(shí)例變量23 //System.out.println(StaticDemo.a);//錯(cuò)誤2!24 //直接引用StaticDemo類的類變量25 System.out.println(StaticDemo.b);26 //直接調(diào)用StaticDemo類的類方法27 StaticDemo.show1();28 //直接調(diào)用StaticDemo類的實(shí)例方法29 //StaticDemo.show2();//錯(cuò)誤3!30 31 StaticDemo.b=10;32 33 //實(shí)例化一個(gè)StaticDemo類的對(duì)象s134 StaticDemos1=newStaticDemo();35 System.out.println(s1.a);36 System.out.println(s1.b);37 s1.show1();38 s1.show2();39 }40}程序中有3處錯(cuò)誤,分別已經(jīng)用注釋標(biāo)出,你能說(shuō)明這3種錯(cuò)誤的原因嗎?技能拓展2.4使用UltraEdit編輯Java程序

UltraEdit是一個(gè)功能強(qiáng)大的文本編輯器軟件,它可以用來(lái)取代記事本,完成各種程序的編輯。對(duì)于Java語(yǔ)言的初學(xué)者來(lái)說(shuō),非常適合使用UltraEdit進(jìn)行程序編程。UltraEdit的主要特點(diǎn)是:●界面簡(jiǎn)潔,操作方便?!袼加玫拇鎯?chǔ)空間小(安裝后所占用的空間僅為幾個(gè)MB),啟動(dòng)速度快?!窨梢杂脕?lái)編輯ASCII碼文本和用十六進(jìn)制數(shù)(Hex)表示的文本信息,所以有些程序員常用它來(lái)修改EXE或DLL文件?!駜?nèi)建英文單詞檢查、Java語(yǔ)言、C++、VB等多種語(yǔ)言關(guān)鍵字的高亮度顯示功能。●可同時(shí)編輯多個(gè)文件。●查找與替換使用簡(jiǎn)便,有無(wú)限制的還原功能?!窨梢赃M(jìn)行不同編碼(ASCII、EBCDIC、UTF-8、Unicode等)之間文件的相互轉(zhuǎn)換?!窨梢詧?zhí)行DOS或Windows命令(程序)?!窨梢园盐谋緝?nèi)容直接顯示在瀏覽器上?!裰С侄喾N文件格式的編輯功能。UltraEdit支持的文件包括:*.TXT、*.DOC、*.BAT、*.INI、*.C(C語(yǔ)言源程序文件)、*.CPP(C++語(yǔ)言源程序文件)、*.H(頭文件)、*.HPP、*.HTML(或*.HTM)、*.java等,基本上覆蓋了所有的常見(jiàn)文件類型。

UltraEdit的安裝非常簡(jiǎn)單,安裝好以后要進(jìn)行注冊(cè)(不注冊(cè)的話可以免費(fèi)使用45天時(shí)間)。圖2-15是UltraEdit-32中文版的啟動(dòng)窗口。

UltraEdit具有強(qiáng)大的文本編輯功能,其編輯程序的常用功能介紹如下。圖2-15UltraEdit啟動(dòng)窗口2.4.1“文件”菜單在圖2-15所示窗口中的菜單欄中有“文件”菜單。文件菜單除了提供大家很熟悉的文件打開(kāi)、保存、關(guān)閉、打印、打印預(yù)覽、關(guān)閉以及退出UltraEdit的功能外,還提供了很多編輯軟件所不具有的“遠(yuǎn)程操作”(可以從遠(yuǎn)程的ftp服務(wù)器上下載文件或上傳文件)、“文件比較”、“文件排序”和“格式轉(zhuǎn)換”等功能。2.4.2“編輯”菜單

UltraEdit的編輯功能有撤消/重做、剪切、拷貝、粘貼等功能。幾個(gè)比較有特色的功能是:●剪貼板:共可以選擇10個(gè)不同的剪貼板,如圖2-16所示。在不同的剪貼板上存放不同的內(nèi)容,在粘貼時(shí)可以先選擇含有想要粘貼內(nèi)容的剪貼板,再進(jìn)行粘貼,以完成多個(gè)不同內(nèi)容的復(fù)制。刪除功能:UltraEdit提供了四種不同的刪除文本的方式,如圖2-17所示。圖2-16UltraEdit的剪貼板圖2-17UltraEdit的刪除功能●選擇功能:UltraEdit的編輯菜單中有一個(gè)“范圍選擇”功能,如圖2-18所示,該功能可以指定一個(gè)從某行開(kāi)始到某行結(jié)束,從某列開(kāi)始到某列結(jié)束的一個(gè)矩形區(qū)域?!瘛皬?fù)制文件全名”功能:可以將該文件的絕對(duì)路徑和名稱復(fù)制到剪貼板中,用以在需要的地方進(jìn)行粘貼?!癫迦搿叭掌诤蜁r(shí)間”。●“重置當(dāng)前行”功能:可以對(duì)光標(biāo)所在的行反復(fù)插入。圖2-18UltraEdit的范圍選擇功能2.4.3“搜索”菜單“搜索”菜單提供了查找、替換、定位、書(shū)簽標(biāo)記、字?jǐn)?shù)統(tǒng)計(jì)等功能。幾個(gè)比較有特色的功能是:●行定位功能:UltraEdit的“轉(zhuǎn)到行/頁(yè)”定位功能(快捷命令是Ctrl+G)可以將插入點(diǎn)快速轉(zhuǎn)換到某行或某頁(yè),在程序設(shè)計(jì)時(shí)很常用?!瘛岸辔募檎摇焙汀岸辔募鎿Q”功能:UltraEdit提供了從多個(gè)文件中查找字符的功能,如圖2-19所示,可以從一個(gè)給定的目錄中,對(duì)某種類型的文件查找特定的字符串。與多文件查找類似的功能還有多文件替換?!瘛芭鋵?duì)括號(hào)內(nèi)容”功能:在程序設(shè)計(jì)時(shí)可以對(duì)一個(gè)程序塊(即一對(duì){}中的內(nèi)容)進(jìn)行快速選定。圖2-19“多文件查找”對(duì)話框2.4.4“查看”菜單“查看”菜單中幾個(gè)比較常用的功能是:●語(yǔ)法著色:可以對(duì)所編輯的文件,根據(jù)其程序類型,選擇對(duì)關(guān)鍵詞進(jìn)行著色。●顯示行號(hào):每行前顯示行號(hào)。在編輯Java程序時(shí)常打開(kāi)該功能,以便于程序調(diào)試。●設(shè)置字號(hào)、增大字號(hào)與減小字號(hào)?!耧@示ACSII碼表。●將選定的行暫時(shí)隱藏起來(lái)。2.4.5“格式”菜單“格式”菜單中幾個(gè)比較常用的功能是:●選定內(nèi)容轉(zhuǎn)小寫(xiě)與選定內(nèi)容轉(zhuǎn)大寫(xiě)?!駝h除行尾空白(空格)?!裎募锌崭窈捅矸南嗷マD(zhuǎn)換。2.4.6“高級(jí)”菜單“高級(jí)”菜單提供了UltraEdit系統(tǒng)的配置、DOS命令和Windows命令的執(zhí)行等功能。下面說(shuō)明如何使用該功能編譯與執(zhí)行Java程序。用UltraEdit“高級(jí)”菜單中的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論