Java大學(xué)實(shí)用教程第四章_第1頁(yè)
Java大學(xué)實(shí)用教程第四章_第2頁(yè)
Java大學(xué)實(shí)用教程第四章_第3頁(yè)
Java大學(xué)實(shí)用教程第四章_第4頁(yè)
Java大學(xué)實(shí)用教程第四章_第5頁(yè)
已閱讀5頁(yè),還剩71頁(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、本章導(dǎo)讀 1. 類(lèi)聲明和類(lèi)體 2. 類(lèi)體的構(gòu)成 3.構(gòu)造方法與對(duì)象的創(chuàng)建 4. 對(duì)象的引用與實(shí)體 5. 成員變量 6. 方法,第4章 類(lèi)與對(duì)象,7. 方法重載 8. this關(guān)鍵字 9. 包 10. import 語(yǔ)句 11. 訪(fǎng)問(wèn)權(quán)限 12. 基本類(lèi)型數(shù)據(jù)的類(lèi)包裝 13. 反編譯和文檔生成器,4.1 類(lèi)聲明和類(lèi)體,類(lèi)是組成Java程序的基本要素。類(lèi)封裝了一類(lèi)對(duì)象的狀態(tài)和方法。類(lèi)是用來(lái)定義對(duì)象的模板??梢杂妙?lèi)創(chuàng)建對(duì)象,當(dāng)使用一個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象時(shí),我們也說(shuō)給出了這個(gè)類(lèi)的一個(gè)實(shí)例。 在語(yǔ)法上,類(lèi)由兩部分構(gòu)成:類(lèi)聲明和類(lèi)體?;靖袷綖椋?class 類(lèi)名 類(lèi)體的內(nèi)容 ,class是關(guān)鍵字,用來(lái)定義

2、類(lèi)?!癱lass 類(lèi)名”是類(lèi)的聲明部分,類(lèi)名必須是合法的Java標(biāo)識(shí)符。兩個(gè)大括號(hào)“”、“”以及之間的內(nèi)容稱(chēng)作類(lèi)體。 以下是兩個(gè)類(lèi)聲明的例子。 class Dog class 機(jī)動(dòng)車(chē) ,類(lèi)的名字不能是Java中的關(guān)鍵字,要符合標(biāo)識(shí)符規(guī)定,即名字可以由字母、下劃線(xiàn)、數(shù)字或美元符號(hào)組成,并且第一個(gè)字符不能是數(shù)字。但給類(lèi)命名時(shí),最好遵守下列習(xí)慣: (1)如果類(lèi)名使用拉丁字母,那么名字的首字母使用 大寫(xiě)字母,如Hello、Time、,People 等。 (2)類(lèi)名最好容易識(shí)別、見(jiàn)名知意。當(dāng)類(lèi)名由幾個(gè)“單詞”復(fù)合而成時(shí),每個(gè)單詞的首寫(xiě)字母使用大寫(xiě),如BeijingTime、AmericanGame、He

3、lloChina等。,返回,4.2 類(lèi)體的構(gòu)成,類(lèi)體內(nèi)容可以有2種類(lèi)型的成員: 1成員變量:通過(guò)變量聲明定義的變量,稱(chēng)作成員變量或域,用來(lái)刻畫(huà)類(lèi)創(chuàng)建的對(duì)象的屬性。將在后面的第3節(jié)詳細(xì)地討論成員變量。 2方法:方法是類(lèi)體的重要成員之一。其中的構(gòu)造方法是具有特殊地位的方法,供類(lèi)創(chuàng)建對(duì)象時(shí)使用,用來(lái)給出類(lèi)所創(chuàng)建的對(duì)象的初始狀態(tài),另一類(lèi)方法,可以由類(lèi)所創(chuàng)建的對(duì)象調(diào)用,對(duì)象調(diào)用這些方法操作成員變量形成一定的算法,體現(xiàn)對(duì)象具有某種功能。,下面是一個(gè)類(lèi)名為“機(jī)動(dòng)車(chē)”的類(lèi),類(lèi)體內(nèi)容的變量定義部分定義了2個(gè)float類(lèi)型的變量:“weight”、“height”和一個(gè)int型變量“speed”;方法定義部分定義

4、了3個(gè)方法:“changSpeed”、“getWeight”和“getHeight”。 成員變量的類(lèi)型可以是Java中的任何一種數(shù)據(jù)類(lèi)型,包括前面學(xué)習(xí)過(guò)的基本類(lèi)型:整型、浮點(diǎn)型、字符型、數(shù)組以及后面要學(xué)習(xí)的對(duì)象及接口。 成員變量在整個(gè)類(lèi)內(nèi)都有效,與它在類(lèi)體中書(shū)寫(xiě)的先后位置無(wú)關(guān),例如,前述的機(jī)動(dòng)車(chē)類(lèi)也可以寫(xiě)成:,在定義類(lèi)的成員變量時(shí)可以同時(shí)賦予初值,表明類(lèi)所創(chuàng)建的對(duì)象的初始狀態(tài)。需要注意的是。對(duì)成員變量的操作只能放在方法中,方法可以對(duì)成員變量進(jìn)行操作形成算法,如: 但是不可以這樣做:因?yàn)?,a=12是賦值語(yǔ)句,不是數(shù)據(jù)的聲明。類(lèi)的成員類(lèi)型中可以有數(shù)據(jù)和方法,即數(shù)據(jù)的定義和方法的定義,但沒(méi)有語(yǔ)句,語(yǔ)

5、句必須放在方法中。,返回,4.3構(gòu)造方法與對(duì)象的創(chuàng)建,類(lèi)中有一部分方法稱(chēng)作構(gòu)造方法,類(lèi)創(chuàng)建對(duì)象時(shí)需使用構(gòu)造方法,以便給類(lèi)所創(chuàng)建的對(duì)象一個(gè)合理的初始狀態(tài)。構(gòu)造方法是一種特殊方法,它的名字必須與它所在的類(lèi)的名字完全相同,并且不返回任何數(shù)據(jù)類(lèi)型,即它是void型,但void必須省略不寫(xiě)。Java允許一個(gè)類(lèi)中有若干個(gè)構(gòu)造方法,但這些構(gòu)造方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類(lèi)型不同。下面的Rect類(lèi)有兩個(gè)構(gòu)造方法:,當(dāng)使用一個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象時(shí),我們也說(shuō)給出了這個(gè)類(lèi)的一個(gè)實(shí)例。創(chuàng)建一個(gè)對(duì)象包括對(duì)象的聲明和為對(duì)象分配成員變量?jī)蓚€(gè)步驟。 1對(duì)象的聲明。 一般格式為: 類(lèi)的名字 對(duì)象名字;

6、 如: Rect rectangleOne;,2為聲明的對(duì)象分配成員變量 使用new運(yùn)算符和類(lèi)的構(gòu)造方法為聲明的對(duì)象分配成員變量,如果類(lèi)中沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法(默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的,你一定還記得構(gòu)造方法的名字必須和類(lèi)名相同這一規(guī)定),上述的Rect類(lèi)提供了2個(gè)構(gòu)造方法,下面都是合法的創(chuàng)建對(duì)象的語(yǔ)句: rectangleOne =new Rect(); 或 rectangleOne =new Rect(10,20);,如果類(lèi)里定義了一個(gè)或多個(gè)構(gòu)造方法,那么Java不提 供默認(rèn)的構(gòu)造方法。如果上述Rect只提供一個(gè)帶參數(shù)的構(gòu)造方法,代碼: rectangleOne =new

7、Rect(); 創(chuàng)建對(duì)象是非法的。 創(chuàng)建對(duì)象的代碼: rectangleOne =new Rect(10,20); 會(huì)實(shí)現(xiàn)下述兩件事: (1)為成員變量分配內(nèi)存空間,然后執(zhí)行構(gòu)造方法中的語(yǔ)句 。 (2)給出一個(gè)信息,已確保這些成員變量是屬于對(duì)象 rectangleOne的 。,創(chuàng)建對(duì)象就是指為它分配成員變量,并獲得一個(gè)引用,以確保這些成員變量由它來(lái)“操作管理”。為對(duì)象分配成員變量后,內(nèi)存模型由聲明對(duì)象時(shí)的模型圖4.1,變成如圖4.2所示,箭頭示意對(duì)象可以操作這些屬于自己的成員變量。,3創(chuàng)建多個(gè)不同的對(duì)象 一個(gè)類(lèi)通過(guò)使用new運(yùn)算符可以創(chuàng)建多個(gè)不同的對(duì)象,這些對(duì)象將被分配不同的內(nèi)存空間,因此,改

8、變其中一個(gè)對(duì)象的狀態(tài)不會(huì)影響其它對(duì)象的狀態(tài)。例如,我們使用前面的Rect類(lèi)創(chuàng)建兩個(gè)對(duì)象:rectangleOne、rectangleTwo。 rectangleOne =new Rect(10,20); rectangleTwo =new Rect(33,66); 當(dāng)創(chuàng)建對(duì)象rectangleOne時(shí),Rect類(lèi)中的成員變量sizeA、sizeB被分配內(nèi)存空間,并返回一個(gè)引用給ectangleOne;,當(dāng)再創(chuàng)建一個(gè)對(duì)象rectangleTwo時(shí),Rect類(lèi)中的成員 變量sizeA、sizeB再一次被分配內(nèi)存空間,并返回一個(gè) 引用給rectangleTwo 。內(nèi)存模型如圖4.3所示。,4使用對(duì)象

9、 對(duì)象不僅可以操作自己的變量改變狀態(tài),而且還擁有了使用創(chuàng)建它的那個(gè)類(lèi)中的方法的能力,對(duì)象通過(guò)使用這些方法可以產(chǎn)生一定的行為。 通過(guò)使用運(yùn)算符“.”,對(duì)象可以實(shí)現(xiàn)對(duì)自己的變量訪(fǎng)問(wèn) 和方法的調(diào)用。 (1)對(duì)象操作自己的變量(對(duì)象的屬性) (2)對(duì)象調(diào)用類(lèi)中的方法(對(duì)象的功能) 下面例子1中,“Lader”類(lèi)創(chuàng)建了2個(gè)對(duì)象:laderOne, laderTwo。,返回,4.4 對(duì)象的引用與實(shí)體,我們已經(jīng)知道,當(dāng)用類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí),成員變量被分配內(nèi)存空間,這些內(nèi)存空間稱(chēng)做該對(duì)象的實(shí)體或變量,而對(duì)象中存放著引用,以確保這些變量由該對(duì)象操作使用。因此,如果兩個(gè)對(duì)象有相同的引用,那么就具有同樣的實(shí)體。 假如

10、使用例子1“Lader”類(lèi)的構(gòu)造方法創(chuàng)建了兩個(gè)對(duì)象 t1,t2。 t1=new Lader(11,22,33); t2=new Lader(6,12,18);,Java具有“垃圾收集”機(jī)制,Java的運(yùn)行環(huán)境周期地檢測(cè)某個(gè)實(shí)體是否已不再被任何對(duì)象所引用,如果發(fā)現(xiàn)這樣的實(shí)體,就釋放實(shí)體占有的內(nèi)存。因此,Java編程人員不必象C+程序員那樣,要時(shí)刻自己檢查哪些對(duì)象應(yīng)該釋放內(nèi)存。當(dāng)把變量t2中存放的引用賦給t1后,最初分配給對(duì)象t1的成員變量(實(shí)體)所占有的內(nèi)存就會(huì)被釋放。 沒(méi)有實(shí)體的對(duì)象稱(chēng)作空對(duì)象??諏?duì)象不能使用,即不能讓一個(gè)空對(duì)象去調(diào)用方法產(chǎn)生行為。假如程序中使用了空對(duì)象,程序在運(yùn)行時(shí)會(huì)出現(xiàn)異常

11、:NullPointerException。由于對(duì)象是動(dòng)態(tài)地分配實(shí)體,所以Java的編譯器對(duì)空對(duì)象不做檢查。因此,在編寫(xiě)程序時(shí)要避免使用空對(duì)象。,返回,4.5 成員變量,用關(guān)鍵字static修飾的成員變量稱(chēng)作靜態(tài)變量或類(lèi)變量, 而沒(méi)有使用static修飾的成員變量稱(chēng)作實(shí)例變量。例如,下述A類(lèi)中,x是實(shí)例變量,而y是類(lèi)變量。 class A float x; static int y; 類(lèi)變量是與類(lèi)相關(guān)聯(lián)的數(shù)據(jù)變量,也就是說(shuō),類(lèi)變量是和該類(lèi)所創(chuàng)建的所有對(duì)象相關(guān)聯(lián)的變量,改變其中一個(gè)對(duì)象的這個(gè)類(lèi)變量就同時(shí)改變了其它對(duì)象的這個(gè)類(lèi)變量。,因此,類(lèi)變量不僅可以通過(guò)某個(gè)對(duì)象訪(fǎng)問(wèn)也可以直接通過(guò)類(lèi)名訪(fǎng)問(wèn)。 實(shí)

12、例變量?jī)H僅是和相應(yīng)的對(duì)象關(guān)聯(lián)的變量,也就是說(shuō),不同對(duì)象的實(shí)例變量互不相同,即分配不同的內(nèi)存空間,改變其中一個(gè)對(duì)象的實(shí)例變量不會(huì)影響其它對(duì)象的這個(gè)實(shí)例變量。實(shí)例變量必須通過(guò)對(duì)象訪(fǎng)問(wèn)。 下面例子2中,兩個(gè)“ Lader”對(duì)象共享bottom。效果如圖4.7,2常量 如果一個(gè)成員變量修飾為final,就是常量,常量的名字習(xí)慣用大寫(xiě)字母,例如: final int MAX; final修飾的成員變量不占用內(nèi)存,這意味著在聲明final成員變量時(shí),必須要初始化。對(duì)于final修飾的成員變量,對(duì)象可以操作使用,但不能做更改操作。下面的例子給出了常量的用法。效果如圖4.9,返回,4.6 方法,我們已經(jīng)知道,

13、類(lèi)體內(nèi)容可以有2種類(lèi)型的成員:成員變量和方法。其中一部分方法稱(chēng)作構(gòu)造方法,供類(lèi)創(chuàng)建對(duì)象時(shí)使用,用來(lái)給出類(lèi)所創(chuàng)建的對(duì)象的初始狀態(tài)。另一部分方法可分為實(shí)例方法和類(lèi)方法,類(lèi)所創(chuàng)建的對(duì)象可以調(diào)用這些方法形成一定的算法,體現(xiàn)對(duì)象具有某種功能。當(dāng)對(duì)象調(diào)用方法時(shí),方法中出現(xiàn)的成員變量就是指分配給該對(duì)象的成員變量。對(duì)象不可以調(diào)用構(gòu)造方法,構(gòu)造方法是專(zhuān)門(mén)用來(lái)創(chuàng)建對(duì)象的。 方法的定義包括兩部分:方法聲明和方法體。一般格式為:,方法聲明部分 方法體的內(nèi)容 1方法聲明和方法體 最基本的方法聲明包括方法名和方法的返回類(lèi)型,返回類(lèi)型也簡(jiǎn)稱(chēng)作方法的類(lèi)型。如: float area() . ,方法的名字必須符合標(biāo)識(shí)符規(guī)定。在

14、給方法起名字時(shí)應(yīng)遵守以下習(xí)慣:名字如果使用拉丁字母,首寫(xiě)字母使用小寫(xiě)。如果由多個(gè)單詞組成,從第2個(gè)單詞開(kāi)始的其它單詞的首寫(xiě)字母使用大寫(xiě)。例如 float getTrangleArea() void setCircleRadius(double radius) 等。 方法聲明之后的一對(duì)大括號(hào)“”、“”以及之間的內(nèi)容稱(chēng)作方法的方法體。類(lèi)中的方法必須要有方法體,如果方法的類(lèi)型是void類(lèi)型,方法體中也可以不書(shū)寫(xiě)任何語(yǔ)句。,2方法體的構(gòu)成 方法體的內(nèi)容包括變量的定義和合法的Java語(yǔ)句,在方法體中聲明的變量以及方法的參數(shù)稱(chēng)作局部變量,局部變量?jī)H僅在該方法內(nèi)有效。方法的參數(shù)在整個(gè)方法內(nèi)有效,方法內(nèi)定義的

15、局部變量從它定義的位置之后開(kāi)始有效。寫(xiě)一個(gè)方法和C語(yǔ)言中寫(xiě)一個(gè)函數(shù)完全類(lèi)似,只不過(guò)在這里稱(chēng)作方法。局部變量的名字必須符合標(biāo)識(shí)符規(guī)定,遵守習(xí)慣:名字如果使用拉丁字母,首寫(xiě)字母使用小寫(xiě)。如果由多個(gè)單詞組成,從第2個(gè)單詞開(kāi)始的其它單詞的首寫(xiě)字母使用大寫(xiě)。,3實(shí)例方法與類(lèi)方法 除構(gòu)造方法外,其他的方法可分為實(shí)例方法或類(lèi)方法。方法聲明中用關(guān)鍵字static修飾的稱(chēng)作類(lèi)方法或靜態(tài)方法,不用static修飾的稱(chēng)作實(shí)例方法。一個(gè)類(lèi)中的方法可以互相調(diào)用:實(shí)例方法可以調(diào)用該類(lèi)中實(shí)例方法或類(lèi)方法;類(lèi)方法只能調(diào)用該類(lèi)的類(lèi)方法,不能調(diào)用實(shí)例方法;如: A類(lèi)中的max方法和getMaxSqrt方法是類(lèi)方法;sum和min

16、方法是實(shí)例方法。,實(shí)例方法可以操作成員變量,無(wú)論是實(shí)例變量或類(lèi)變量;而類(lèi)方法只能操作類(lèi)變量不能操作實(shí)例變量,也就是說(shuō)類(lèi)方法中不能有操作實(shí)例變量的語(yǔ)句。二者為何有著這樣的區(qū)別呢? (1)實(shí)例方法必須通過(guò)對(duì)象來(lái)調(diào)用 (2)類(lèi)方法可以通過(guò)類(lèi)名調(diào)用 無(wú)論類(lèi)方法或?qū)嵗椒?,?dāng)被調(diào)用執(zhí)行時(shí),方法中的局部變量才被分配內(nèi)存空間,方法調(diào)用完畢,局部變量即刻釋放所占的內(nèi)存。 下面的例子4,通過(guò)類(lèi)名調(diào)用類(lèi)方法。,4參數(shù)傳值 當(dāng)方法被調(diào)用時(shí),如果方法有參數(shù),參數(shù)必須要實(shí)例化,即參數(shù)變量必須有具體的值。在Java中,方法的所有參數(shù)都是“傳值”的,也就是說(shuō),方法中參數(shù)變量的值是調(diào)用者指定的值的拷貝。如果向方法的int型參

17、數(shù)x傳遞一個(gè)int值,那么參數(shù)x得到的值是傳遞值的拷貝。方法如果改變參數(shù)的值,不會(huì)影響向參數(shù)“傳值”的變量的值。 (1)基本數(shù)據(jù)類(lèi)型參數(shù)的傳值 下面的例子5中,向一個(gè)方法的基本型參數(shù)傳值。效果如圖4.11,(2)引用類(lèi)型參數(shù)的傳值 Java的引用型數(shù)據(jù)包括我們以前學(xué)習(xí)過(guò)的對(duì)象、數(shù)組 以及后面將要學(xué)習(xí)的接口。當(dāng)參數(shù)是引用類(lèi)型時(shí),“傳值”傳遞的是變量的引用而不是變量所引用的實(shí)體。 圖4.13 引用類(lèi)型參數(shù)的傳值 如果改變參數(shù)變量所引用的實(shí)體,就會(huì)導(dǎo)致原變量的實(shí)體發(fā)生同樣的變化,因?yàn)?,兩個(gè)引用型變量如果具有同樣的引用,就會(huì)用同樣的實(shí)體。但是,改變參數(shù)的引用不會(huì)影響向其傳值的變量的引用。 下面的例子6

18、向一個(gè)方法的引用型參數(shù)傳值。效果如圖4.13,在上述例子6中,tom調(diào)用方法f把對(duì)象jerry的引用“傳值”給參數(shù)a后,對(duì)象jerry和對(duì)象a就具有同樣的成員變量,即同樣實(shí)體。因此,jerry和a就具有同樣的功能,也就是說(shuō)a調(diào)用方法產(chǎn)生的行為和jerry調(diào)用同一方法產(chǎn)生的行為完全相同。當(dāng)對(duì)象a執(zhí)行 a=null; 后,a就不再有任何實(shí)體,變成一個(gè)空對(duì)象,如果再執(zhí)行: a.setLeg(100);就會(huì)引起NullPointerExcetion異常。但是,jerry的引用沒(méi)有發(fā)生任何變化,它依然引用著原來(lái)的實(shí)體,仍然可以調(diào)用方法產(chǎn)生行為。 在下面的例子7中,“Cone”類(lèi)在創(chuàng)建對(duì)象時(shí),將一個(gè)“Ci

19、rcle”對(duì)象的引用“傳值”給“Cone”對(duì)象的“bottom”。效果如圖4.14,返回,4.8 方法重載,方法重載是指一個(gè)類(lèi)中可以有多個(gè)方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類(lèi)型不同。方法的返回類(lèi)型和參數(shù)的名字不參與比較,也就是說(shuō),如果兩個(gè)方法的名字相同,即使類(lèi)型不同,也必須保證參數(shù)不同。 下面例4-8 Area類(lèi)中g(shù)etArea方法是一個(gè)重載方法。效果如圖4.15,返回,4.9 this 關(guān)鍵字,this是Java的一個(gè)關(guān)鍵字,可以出現(xiàn)在實(shí)例方法和構(gòu)造方法中,但不可以出現(xiàn)在類(lèi)方法中。 1在構(gòu)造方法中使用this this關(guān)鍵字可以出現(xiàn)在類(lèi)的構(gòu)造方

20、法中,代表使用該 構(gòu)造方法所創(chuàng)建的對(duì)象。 下述例子9中的構(gòu)造方法中出現(xiàn)了this,表示該對(duì)象在構(gòu)造自己時(shí)調(diào)用了方法cry()。 2在實(shí)例方法中使用this this關(guān)鍵字可以出現(xiàn)在類(lèi)的實(shí)例方法中,代表使用該方法的當(dāng)前對(duì)象。,我們已經(jīng)知道,實(shí)例方法可以操作成員變量。實(shí)際上,當(dāng)成員變量在實(shí)例方法中出現(xiàn)時(shí),默認(rèn)的格式是: this.成員變量; 意思是當(dāng)前對(duì)象的成員變量,如: class A int x; void f() this.x=100; ,在上述A類(lèi)中的實(shí)例方法f中出現(xiàn)了this,this就代表使用f的當(dāng)前對(duì)象。所以,this.x就表示當(dāng)前對(duì)象的變量x,當(dāng)對(duì)象調(diào)用方法f時(shí),將100賦給該對(duì)象

21、的變量x。因此,當(dāng)一個(gè)對(duì)象調(diào)用方法時(shí),方法中的成員變量就是指分配給該對(duì)象的成員變量。因此,通常情況下,可以省略成員變量名字前面的“this.”。 我們知道類(lèi)的實(shí)例方法可以調(diào)用類(lèi)的其它方法,調(diào)用的默認(rèn)格式是 this.方法;,如:在上述B類(lèi)中的方法f中出現(xiàn)了this,this代表使用方法f的當(dāng)前對(duì)象,所以,方法f的方法體中this.g()就是當(dāng)前對(duì)象調(diào)用方法g,也就是說(shuō),當(dāng)某個(gè)對(duì)象調(diào)用方法f過(guò)程中,又調(diào)用了方法g。由于這種邏輯關(guān)系非常明確,一個(gè)方法調(diào)用另一個(gè)方法時(shí)可以省略方法名字前面的“this.”。 3類(lèi)方法中不可以使用this this不能出現(xiàn)在類(lèi)方法中,這是因?yàn)?,?lèi)方法可以通過(guò)類(lèi)名直接調(diào)用

22、,這時(shí),可能還沒(méi)有任何對(duì)象誕生。,4使用this區(qū)分成員變量和局部變量 我們已經(jīng)知道,成員變量在整個(gè)類(lèi)內(nèi)有效,局部變量?jī)H在方法內(nèi)有效。在方法體中聲明的變量以及方法的參數(shù)稱(chēng)作局部變量,方法的參數(shù)在整個(gè)方法內(nèi)有效,方法內(nèi)定義的局部變量從它定義的位置之后開(kāi)始有效。 如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即這個(gè)成員變量在這個(gè)方法內(nèi)暫時(shí)失效。如: 這時(shí)如果想在該方法內(nèi)使用成員變量,成員變量前面的“this.”就不可以省略,如: this.sideA、this.sideB、this.sideC就分別表示當(dāng)前對(duì)象的成員變量sideA、sideB、sideC。,返回,4.10 包,通過(guò)關(guān)鍵

23、字package聲明包語(yǔ)句。package 語(yǔ)句作為Java源文件的第一條語(yǔ)句,指明該源文件定義的類(lèi)所在的包。package語(yǔ)句的一般格式為: package 包名; 如果源程序中省略了package語(yǔ)句,源文件中所定義命名的類(lèi)被隱含地認(rèn)為是無(wú)名包的一部分,即源文件中定義命名的類(lèi)在同一個(gè)包中,但該包沒(méi)有名字。 包名可以是一個(gè)合法的標(biāo)識(shí)符,也可以是若干個(gè)標(biāo)識(shí)符加“.”分割而成,如: package sunrise; package ;,程序如果使用了包語(yǔ)句,例如: package tom.jiafei; 那么你的目錄結(jié)構(gòu)必須包含有如下的結(jié)構(gòu) tomjiafei 比如 c:1000tomjiafe

24、i 并且要將源文件編譯后得到的全部字節(jié)碼文件拷貝到目錄c:1000tomjiafei中,如果你事先將源文件保存到c:1000tomjiafei中,然后編譯源文件,那么生成的字節(jié)碼文件就直接保存到當(dāng)前目錄中了,如: c:1000tomjiafeijavac 源文件 我們將下述例子10的源文件保存到c:1000tomjiafei。效果如圖4.17,然后編譯原文件: c:1000tomjiafeijavac Example.java 運(yùn)行程序時(shí)必須到tomjiafei的上一層目錄1000中來(lái)運(yùn)行,如: c:1000java tom.jiafei. Example 因?yàn)槠鹆税?lèi)Example的全名

25、已經(jīng)是:tom.jiafei. Example(就好比大連的全名是:“中國(guó).遼寧.大連”)。 包名應(yīng)該避免與其他包名沖突。但要做到這一點(diǎn)似乎很困難,如果你的包需要在全世界是唯一的,Sun公司 建議大家使用自己所在公司的Internet域名倒置后做包名,例如,將域名“”的倒置“.sina”做包名。,2使用參數(shù)“d”編譯源文件 javac 可以使用參數(shù)-d指定生成的字節(jié)嗎文件所在的目錄。如果不使用參數(shù)-d,javac在當(dāng)前目錄生成字節(jié)碼文件。 如果源文件沒(méi)有包名,使用參數(shù)-d可以將字節(jié)碼文件存放到你指定的有效目錄中,例如: javac d F:tsinghua1000 MyFile.java 將源

26、文件MyFile.java生成的全部字節(jié)碼文件存放到F:tsinghua1000。 如果源文件使用包語(yǔ)句聲明了包名,使用參數(shù)-d時(shí)要格外小心。假設(shè)源文件的包名是tom.jiafei,保存在在D:2000中,,下述編譯命令: D:2000javac d F:tsinghua1000 MyFile.java 會(huì)在F:tsinghua1000目錄下新建子目錄結(jié)構(gòu)tomjiafe并將字節(jié)碼文件存放到F: tsinghua1000tomjiafei中。 而下述編譯命令: D:2000javac d . MyFile.java 會(huì)在當(dāng)前目錄2000下新建子目錄結(jié)構(gòu)tomjiafei,并將字節(jié)碼文件存放到D

27、:2000tomjiafei中。,返回,4.11 import 語(yǔ)句,使用import 語(yǔ)句可以引入包中的類(lèi)。在編寫(xiě)源文件時(shí), 除了自己編寫(xiě)類(lèi)外,我們經(jīng)常需要使用Java提供的許多類(lèi),這些類(lèi)可能在不同的包中。在學(xué)習(xí)Java語(yǔ)言時(shí),使用已經(jīng)存在的類(lèi),避免一切從頭做起,這是面向?qū)ο缶幊痰囊粋€(gè)重要方面。 1 .使用類(lèi)庫(kù)中的類(lèi) 為了能使用Java提供給我們的類(lèi),我們可以使用import語(yǔ)句來(lái)引入包中類(lèi)。在一個(gè)Java源程序中可以有多個(gè)import語(yǔ)句,它們必須寫(xiě)在package語(yǔ)句(假如有package語(yǔ)句的話(huà))和源文件中類(lèi)的定義之間.。,Java為我們提供了大約130多個(gè)包,如: java.appl

28、et 包含所有的實(shí)現(xiàn)Java applet的類(lèi) java.awt 包含抽象窗口工具集中的圖形、文本、窗口GUI類(lèi) java.awt.image 包含抽象窗口工具集中的圖像處理類(lèi) java.lang 包含所有的基本語(yǔ)言類(lèi) java.io 包含所有的輸入輸出類(lèi) 包含所有實(shí)現(xiàn)網(wǎng)絡(luò)功能的類(lèi) java.util 包含有用的數(shù)據(jù)類(lèi)型類(lèi),如果使用import語(yǔ)句引入了整個(gè)包中的類(lèi),那么可能會(huì)增加編譯時(shí)間。但絕對(duì)不會(huì)影響程序運(yùn)行的性能。Java運(yùn)行平臺(tái)由所需要的Java類(lèi)庫(kù)和虛擬機(jī)組成,這些類(lèi)庫(kù)被包含在一個(gè)jrelib中的壓縮文件rt.jar中,當(dāng)程序執(zhí)行時(shí),Java運(yùn)行平臺(tái)從類(lèi)庫(kù)中加載程序真正使用的類(lèi)字節(jié)碼

29、到內(nèi)存。 下面的例子11使用了java.util包中的Date類(lèi),用來(lái)顯示本機(jī)的當(dāng)前時(shí)間。,2使用自定義包中的類(lèi) 我們也可以使用import 語(yǔ)句引入自定義包中的類(lèi)。如: import tom.jiafei.*; 我們也可以對(duì)單獨(dú)的一個(gè)類(lèi)進(jìn)行 編譯,生成字節(jié)碼文件然后供其它類(lèi)使用。 以下的源文件SquareEquation.java只有一個(gè)類(lèi)組成,這個(gè)類(lèi)可以被其它的程序引入使用,該源文件的包名是tom.jiafei。 為了使程序能使用tom.jiafei包中的類(lèi),我們必須在 classpath中指明我們包的位置,假設(shè)tom.jiafei的位置是:c:2000,即在c:2000下有子目錄tomj

30、iafei。更新classpath的設(shè)置,在命令行執(zhí)行如下命令: set classpath=E:jdk1.5jrelibrt.jar;.;c:2000,也可以將上述命令添加到Classpath值中。在Windows2000系統(tǒng)中,右擊“我的電腦”,彈出快捷菜單,然后選擇“屬性”命令,彈出“系統(tǒng)特性”對(duì)話(huà)框,再單擊該對(duì)話(huà)框中的高級(jí)選項(xiàng),然后單擊“環(huán)境變量”按鈕。對(duì)于Win9x系統(tǒng)可以將上述命令寫(xiě)到autoexec.bat文件中。 將下述源文件SquareEquation.java編譯得到的字節(jié)碼文件拷貝到D:ch4tomjiafei中。下面的例子12的源文件保存在 D:Ch4目錄中,并用imp

31、ort 語(yǔ)句引入包tom.jiafei中的SquareEquation類(lèi)。,3使用無(wú)名包中的類(lèi) 我們也可以使用無(wú)名包中的類(lèi)。假如上述SquareEquation.java源文件中沒(méi)有使用包語(yǔ)句,如果一個(gè)程序使用SquareEquation類(lèi),可以將該類(lèi)的字節(jié)碼文件存放在當(dāng)前程序所在的目錄中。 編寫(xiě)一個(gè)有價(jià)值的類(lèi)是令人高興的事情,你可以將這樣的類(lèi)打包,形成有價(jià)值的“軟件產(chǎn)品”,供其他軟件開(kāi)發(fā)者使用。 4避免類(lèi)名混淆 Java運(yùn)行環(huán)境總是先到程序所在目錄中尋找程序所使用的類(lèi),然后加載到內(nèi)存。如果在當(dāng)前目錄沒(méi)有發(fā)現(xiàn)所需要的類(lèi),就到import語(yǔ)句所指的包中查找。,如果在當(dāng)前目錄沒(méi)有發(fā)現(xiàn)所需要的類(lèi),就

32、到import語(yǔ)句所指的包中查找。如果在當(dāng)前目錄中尋找到了要加載的類(lèi),那么程序就不會(huì)再加載import語(yǔ)句引入的同名類(lèi)。,返回,4.12 訪(fǎng)問(wèn)權(quán)限,類(lèi)有2種重要的成員:成員變量和方法。類(lèi)創(chuàng)建的對(duì)象可以通過(guò)“.”運(yùn)算符訪(fǎng)問(wèn)分配給自己的變量,也可以通過(guò)“.”運(yùn)算符調(diào)用類(lèi)中的實(shí)例方法和類(lèi)方法。類(lèi)在定義聲明成員變量和方法時(shí),可以用關(guān)鍵字private、protected和public來(lái)說(shuō)明成員變量和方法的訪(fǎng)問(wèn)權(quán)限,使得對(duì)象訪(fǎng)問(wèn)自己的變量和使用方法受到一定的限制。 1私有變量和私有方法 用關(guān)鍵字private修飾的成員變量和方法被稱(chēng)為私有變量和私有方法。 對(duì)于私有成員變量或方法,只有在本類(lèi)中創(chuàng)建該類(lèi)的對(duì)

33、象時(shí),這個(gè)對(duì)象才能訪(fǎng)問(wèn)自己的私有成員變量和類(lèi)中的私有方法,如例子13,例子14所示。效果如圖4.21,2共有變量和共有方法 用public修飾的成員變量和方法被稱(chēng)為共有變量和共有方法,如: class A public float weight; /weight被修飾為public的float型變量。 public float f(float a,float b) /方法 f是public方法。 ,當(dāng)我們?cè)谌魏我粋€(gè)類(lèi)中用類(lèi)A 創(chuàng)建了一個(gè)對(duì)象后,該 對(duì)象能訪(fǎng)問(wèn)自己的public變量和類(lèi)中的public方法。如: class B void g() A a=new A(); a.weight=23f

34、; /合法。 a.f(3,4); /合法。 ,3友好變量和友好方法 不用private、public 、protected修飾符的成員變量和方法被稱(chēng)為友好變量和友好方法,如: class A float weight; /weight是友好的float型變量。 float f(float a,float b) /方法 f是友好方法。 ,假如B與A是同一個(gè)包中的類(lèi),那么,下述B類(lèi)中的a.weight、a.f(3,4)都是合法的。 class B void g() A cat=new A(); a.weight=23f; /合法。 a.f(3,4); /合法。 ,4受保護(hù)的成員變量和方法 用pro

35、tected修飾的成員變量和方法被稱(chēng)為受保護(hù)的成員變量和受保護(hù)的方法,如: class A protected float weight; /weight被修飾為public的float型變量。 protected float f(float a,float b) /方法 f是public方法。 ,假如B與A是同一個(gè)包中的類(lèi),那么,B類(lèi)中的a.weight、a.f(3,4)都是合法的。 class B void g() Tom a=new Tom(); a.weight=23f; /合法。 a.f(3,4); /合法。 ,5public類(lèi)與友好類(lèi) 類(lèi)聲明時(shí),如果關(guān)鍵字class前面加上publ

36、ic關(guān)鍵字,就稱(chēng)這樣的是一個(gè)public類(lèi),不能用protected和private修飾類(lèi)。如: public class A 可以在任何另外一個(gè)類(lèi)中,使用public類(lèi)創(chuàng)建對(duì)象。如果一個(gè)類(lèi)不加public修飾,如: class A ,6關(guān)于構(gòu)造方法 private、public 、protected修飾符的意義也同樣適合于構(gòu)造方法。如果一個(gè)類(lèi)沒(méi)有明確地聲明構(gòu)造方法,那么public類(lèi)的默認(rèn)構(gòu)造方法是public的,友好類(lèi)的默認(rèn)構(gòu)造方法是友好的。需要注意的是,如果一個(gè)public類(lèi)定義聲明的構(gòu)造方法中沒(méi)有public的,那么在另外一個(gè)類(lèi)中使用該類(lèi)創(chuàng)建對(duì)象時(shí),使用的構(gòu)造方法就不是 public的

37、,創(chuàng)建對(duì)象就受到一定的限制。 假設(shè)對(duì)象a是A類(lèi)創(chuàng)建的,我們把對(duì)象對(duì)成員的訪(fǎng)問(wèn)權(quán)限總結(jié)在下表4.1中 表4.1 對(duì)象訪(fǎng)問(wèn)成員,返回,4.13 對(duì)象的組合,一個(gè)類(lèi)可以把對(duì)象作為自己的成員變量,如果用這樣的類(lèi)創(chuàng)建對(duì)象,那么該對(duì)象中就會(huì)有其它對(duì)象,也就是說(shuō)該對(duì)象將其他對(duì)象作為自己的組成部分(這就是人們常說(shuō)的Has-A),或者說(shuō)該對(duì)象是由幾個(gè)對(duì)象組合而成 .例子15,4.14 基本類(lèi)型數(shù)據(jù)的類(lèi)包裝,Java的基本數(shù)據(jù)類(lèi)型包括:byte、int、short、long、float、double、char。Java同時(shí)也提供了基本數(shù)據(jù)類(lèi)型相關(guān)的類(lèi),實(shí)現(xiàn)了對(duì)基本數(shù)據(jù)類(lèi)型的封裝。這些類(lèi)在java.lang包中,分

38、別是:Byte、Integer、Short、Long、Float、Double和Character類(lèi)。 1.Double和Float類(lèi)/引用類(lèi)型變量、方法new Double類(lèi)和Float類(lèi)實(shí)現(xiàn)了對(duì)double和float基本型數(shù)據(jù)的類(lèi)包裝。 可以使用Double類(lèi)的構(gòu)造方法:,Double (double num) 創(chuàng)建一個(gè)Double類(lèi)型的對(duì)象;使用Float類(lèi)的構(gòu)造方法: Float (float num) 創(chuàng)建一個(gè)Float類(lèi)型的對(duì)象。Double對(duì)象調(diào)用doubleValue()方法可以返回該對(duì)象含有的double型數(shù)據(jù);Float對(duì)象調(diào)用floatValue()方法可以返回該對(duì)象含有的float型數(shù)據(jù)。 Byte、Integer、Short和Long對(duì)象分別調(diào)用byteValue ()、intValue()、shortValue ()和longValue ()方法可以返回該對(duì)象含有的基本型數(shù)據(jù)。,3.character類(lèi)

溫馨提示

  • 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)論