2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩97頁(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)介

1、《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》,,教學(xué)課件,第4章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ),主要內(nèi)容,4.1 面向?qū)ο蟮幕靖拍?.2 類的定義4.3 類和對(duì)象的使用 4.4 包package4.5 成員變量及方法的訪問(wèn)權(quán)限4.6 final、this及其它,,4.1 面向?qū)ο蟮幕靖拍?4.1.1面向?qū)ο缶幊痰母拍?4.1.2客觀事物的抽象,,4.1.1面向?qū)ο缶幊痰母拍?1、面向過(guò)程編程: 我們很多人使用

2、過(guò)Fortran、Basic,C等面向過(guò)程的程序設(shè)計(jì)語(yǔ)言,這些語(yǔ)言是按流程化的思想來(lái)組織的。在這些語(yǔ)言的設(shè)計(jì)思想中,通常將存放基本數(shù)據(jù)類型的變量作為程序處理對(duì)象、以變量的賦值作為程序的基本操作、以變量值的改變作為程序運(yùn)行的狀態(tài)。這種程序設(shè)計(jì)風(fēng)格存在著數(shù)據(jù)抽象簡(jiǎn)單、信息完全暴露、算法復(fù)雜、無(wú)法很好地描述客觀世界等缺點(diǎn)。在程序設(shè)計(jì)過(guò)程中,為了實(shí)現(xiàn)有限度的代碼重用,公共代碼被組織成為過(guò)程或函數(shù)。當(dāng)需要代碼重用時(shí),調(diào)用已經(jīng)組織好的過(guò)程或函數(shù)。在

3、這種應(yīng)用方式中,如果軟件項(xiàng)目龐大,程序的調(diào)試和維護(hù)將變得異常困難。,4.1.1面向?qū)ο缶幊痰母拍?2、面向?qū)ο缶幊蹋?而面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是將數(shù)據(jù)以及對(duì)于這些數(shù)據(jù)的操作,封裝在了一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中。這種模式更近似于現(xiàn)實(shí)世界,在這里,所有的對(duì)象都同時(shí)擁有屬性以及與這些屬性相關(guān)的行為。對(duì)象之間的聯(lián)系是通過(guò)消息來(lái)實(shí)現(xiàn)的,消息是請(qǐng)求對(duì)象執(zhí)行某一處理或回答某些信息的要求。某個(gè)對(duì)象在執(zhí)行相應(yīng)的處理時(shí),可以通過(guò)傳遞消息請(qǐng)求其

4、他對(duì)象完成某些處理工作或回答某些消息。其他對(duì)象在執(zhí)行所要求的處理活動(dòng)時(shí),同樣可以通過(guò)傳遞消息和另外的對(duì)象聯(lián)系。所以,一個(gè)面向?qū)ο蟪绦虻膱?zhí)行,就是靠對(duì)象間傳遞消息來(lái)完成的。,4.1.1面向?qū)ο缶幊痰母拍?面向?qū)ο缶幊蹋?面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新興的程序設(shè)計(jì)方法,或者是一種新的程序設(shè)計(jì)規(guī)范,它使用對(duì)象、類、繼承、封裝、消息等基本概念來(lái)進(jìn)行程序的設(shè)計(jì)。從現(xiàn)實(shí)世界中客觀存在的事物(即對(duì)象)出發(fā)來(lái)構(gòu)造軟件系統(tǒng),并且在系統(tǒng)構(gòu)造

5、中盡可能運(yùn)用人類的自然思維方式。開(kāi)發(fā)一個(gè)軟件是為了解決某些問(wèn)題,這些問(wèn)題所涉及的業(yè)務(wù)范圍稱作該軟件的問(wèn)題域。其應(yīng)用領(lǐng)域不僅僅是軟件,還有計(jì)算機(jī)體系結(jié)構(gòu)和人工智能等。,4.1.1面向?qū)ο缶幊痰母拍?面向?qū)ο蟮娜筇攸c(diǎn):封裝、繼承、多態(tài) 1)封裝  封裝就是把對(duì)象的屬性和和對(duì)這些屬性的操作封裝在一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),包含兩個(gè)含義:把對(duì)象的全部屬性和對(duì)屬性的全部操作結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單元(即對(duì)

6、象)。信息隱蔽,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外形成一個(gè)邊界〔或者說(shuō)形成一道屏障〕,只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。,4.1.1面向?qū)ο缶幊痰母拍?面向?qū)ο蟮娜筇攸c(diǎn):封裝、繼承、多態(tài) 2)繼承 繼承是一種由已有的類創(chuàng)建新類的機(jī)制。利用繼承,我們可以先創(chuàng)建一個(gè)擁有共有屬性的一般類,根據(jù)該一般類再創(chuàng)建具有特殊屬性的新類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。由繼承而得到的類稱為子類

7、,被繼承的類稱為父類或超類。Java不支持多重繼承,子類只能有一個(gè)父類。 在Java編程語(yǔ)言中,通過(guò)繼承可利用已有的類,并擴(kuò)展它的屬性和方法。這個(gè)已有的類可以是語(yǔ)言本身提供的、其他程序員編寫(xiě)的或程序員原來(lái)編寫(xiě)的。繼承在Java中無(wú)所不在。,4.1.1面向?qū)ο缶幊痰母拍?面向?qū)ο蟮娜筇攸c(diǎn):封裝、繼承、多態(tài) 3)多態(tài)  對(duì)象的多態(tài)是由封裝和繼承引出的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的另一特征。主要體現(xiàn)在兩個(gè)方面:方法重載時(shí)實(shí)現(xiàn)的靜

8、態(tài)多態(tài)和方法重載時(shí)實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)。 多態(tài)性使得我們的同一方法,可以有多種形式。另外父類中定義的屬性或方法被子類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為,同一個(gè)屬性或方法在父類及其各個(gè)子類中可以具有不同的語(yǔ)義。,4.1.2客觀事物的抽象,為了使計(jì)算機(jī)能夠處理和理解客觀事物,必須對(duì)事物進(jìn)行抽象,以求得事物的本質(zhì)。現(xiàn)實(shí)事物紛繁復(fù)雜,因此,在事物抽象過(guò)程中,必須忽略抽象事物中那些與當(dāng)前目的無(wú)關(guān)的特征,求取對(duì)當(dāng)前需求有直

9、接影響的因素。因此,針對(duì)客觀事物的抽象必須掌握一定的抽象原則。 我們知道,當(dāng)確定了一個(gè)圓形的圓心位置和圓的半徑后,就可以在平面上確定一個(gè)圓。因此,抽象出來(lái)的圓的要素為圓心和半徑。,4.1.2客觀事物的抽象,用數(shù)據(jù)結(jié)構(gòu)來(lái)表示,如下:class Circle{point center; // 圓心float rudius; // 半徑}其中class是面向?qū)ο蟪绦蛟O(shè)計(jì)常用來(lái)定義“類”這種數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵

10、字。,4.1.2客觀事物的抽象,添加一些基本的行為如獲取圓的面積,表示如下:class Circle { point center; // 屬性或成員 float radius; // 屬性或成員 double getArea(){ // 方法 return radius*radius*3.1415926; }},4.1.2客觀事物

11、的抽象,添加一些基本的行為如獲取圓的面積,表示如下:class Circle { point center; // 屬性或成員 float radius; // 屬性或成員 double getArea(){ // 方法 return radius*radius*3.1415926; }},第4章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ),4.1 面向

12、對(duì)象的基本概念4.2 類的定義4.3 類和對(duì)象的使用 4.4 包package4.5 成員變量及方法的訪問(wèn)權(quán)限4.6 final、this及其它,,4.2 類的定義,4.2.1 類聲明4.2.2 類體4.2.3 實(shí)例化對(duì)象4.2.4 構(gòu)造方法說(shuō)明 4.2.5 對(duì)象的清除4.2.6 方法重載,,4.2.1類聲明,類的聲明舉例:class Circle { point center;

13、 // 屬性或成員 float radius; // 屬性或成員 double getArea(){ // 方法 return radius*radius*3.1415926; }}public class Rectangle extends Shapes implement Display{ …… // 類體} //

14、下面的Rectangle類繼承了Shapes父類,實(shí)現(xiàn)了接口 Display,是一個(gè)公共類。,4.2.1類聲明,類聲明的格式如下: [修飾符] class 類名 [extends 超類名] [implements接口名列表] {……}可能的選項(xiàng)有:[public][abstract|final] class 類名 [extends 超類名] [implements 接口名列表]{……} public(公

15、共):public修飾的類能被所有的類訪問(wèn)。 abstract(抽象):abstract修飾的類不能被實(shí)例化,它包含 有未實(shí)現(xiàn)的方法。 final(最終):final修飾的類不能被繼承,即不能有子類。 注意: abstract和final不能同時(shí)作為一個(gè)類的修飾符。,4.2.1類聲明,類名: 習(xí)慣上類名的第一個(gè)字母大寫(xiě),但這不是必須的。類的名字不能是Java 中的關(guān)鍵字,要符合標(biāo)識(shí)符規(guī)定,即名字可

16、以由字母,下劃線,數(shù)字或美圓符號(hào)組成,并且第一個(gè)字符不能是數(shù)字。但給類命名時(shí),最好遵守如下習(xí)慣: 如果類名使用拉丁字母,那么名字的首寫(xiě)字母使用大寫(xiě)字母,例如Hello、Time、People等。 類名最好見(jiàn)名知意,當(dāng)類名由幾個(gè)”單詞”復(fù)合而成時(shí),每個(gè)單詞的首寫(xiě)字母使用大寫(xiě),如BeijingTime、AmericanMap、HelloChina等。,4.2.1類聲明,extends(繼承): extend

17、s保留字用來(lái)表明新創(chuàng)建的類繼承哪個(gè)類,被繼承的類稱為此類的父類。extends后面只能跟一個(gè)父類名。 implements(實(shí)現(xiàn)): 用來(lái)表明這個(gè)類實(shí)現(xiàn)了哪些接口,接口名可以有多個(gè)。例如:下面的類是合法的:class MyC1ass { //空類,沒(méi)有任何用處,但是合法 }又如:下面的Rectangle類繼承了Shapes父類,實(shí)現(xiàn)了接口Display,是一個(gè)公共類。public class Rectang

18、le extends Shapes implement Display{ …… // 類體},4.2.2類體,類體中定義了該類所有的成員變量和該類所支持的方法,其格式說(shuō)明如下: { [成員變量說(shuō)明] [成員方法說(shuō)明] },4.2.2類體,類體:{[public | protected | private ] [static] [final] [transient] [volatile] type vari

19、ableName;          //成員變量[public | protected | private ] [static][final | abstract] [native] [synchronized]returnType methodName([paramList]) [throws exceptionList]{statements}              //成員方法},4.2.2類體,1.成員變量說(shuō)明

20、 成員變量又稱值域。成員變量的說(shuō)明類似于方法的局部變量說(shuō)明,所不同的是,成員變量定義在類中,是類成員的一部分,整個(gè)類都可以訪問(wèn)它。Java中成員變量說(shuō)明形式如下: [修飾符] 成員變量類型 成員變量名列表; 例如:private int number;成員變量的修飾符有以下幾種:缺省訪問(wèn)修飾符、public、protected、private、final、static、transient和volatile。關(guān)于

21、這些修飾符的含義以后將講到。,4.2.2類體,2.成員變量使用 類的成員變量在定義它的類內(nèi)部,可以直接通過(guò)成員變量名來(lái)訪問(wèn)。class Circle {static final float PI=3.1415926f; // 常量 private Point center; // 屬性或成員private float radius; // 屬性或成員static Color color;

22、public float area;float getArea(){ // 方法 return radius*radius*PI; //內(nèi)部訪問(wèn)成員變量}},4.2.2類體,如果從類的外部訪問(wèn),類變量和類對(duì)象變量的使用方法是不同。訪問(wèn)類變量的格式如下: 類名.類變量名 例如我們可以采用下面形式訪問(wèn)上例中的靜態(tài)變量color的:Circle.color,由此可見(jiàn),訪問(wèn)類變量與類的對(duì)象構(gòu)造和對(duì)

23、象都無(wú)關(guān)。類變量名必須用static修飾。更詳細(xì)的說(shuō)明見(jiàn)后面的章節(jié)。訪問(wèn)實(shí)例變量的格式如下: 對(duì)象名.實(shí)例變量名 例如Circle c1=new Circle(); //c1是對(duì)象名System.out.println(“area=”+c1.area);,4.2.2類體,3、成員方法說(shuō)明 在Java中,方法總是Java類的一個(gè)組成部分。通過(guò)類的方法,改變對(duì)象的狀態(tài)。方法說(shuō)明分為方法首部說(shuō)明和方法體兩部分。 方

24、法首部說(shuō)明的格式如下: [方法修飾符] 返回值類型 方法名([形參列表])[throws異常列表] 可能的選項(xiàng)有:[public | protected | private ] [static][final | abstract] [native] [synchronized] returnType methodName([paramList])[throws exceptionList]//方法聲明{……},4.2.2

25、類體,4.方法體 方法體是實(shí)現(xiàn)這個(gè)方法的代碼段,它由“{”和“}”括起來(lái)的語(yǔ)句序列構(gòu)成。方法體也可以是一個(gè)分號(hào)“;”,表示無(wú)方法體,該方法沒(méi)有實(shí)現(xiàn)。當(dāng)且僅當(dāng)方法的修飾符中有abstract或native時(shí),方法才無(wú)方法體。例如求解三角形問(wèn)題時(shí)可以編寫(xiě)Triangle類,在Triangle類可以有如下的3個(gè)方法。程序如下:,4.2.2類體,4.方法體 class Triangle{ double sizdA,siddB,siddC

26、; //三角形的三邊void setSide(double a,double b,double c){ //該方法用來(lái)賦初值sideA=a;sideB=b;sideC=c;}boolean isOrNotTriangle(){ //判斷是否是三角形的方法 if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideB+sideC>si

27、deA){ return true;}else{ return flase;}}},4.2.2類體,5.方法的調(diào)用 成員方法又分為類方法(靜態(tài)方法)和對(duì)象方法(實(shí)例方法)兩類。他們的調(diào)用是有區(qū)別的。前面已經(jīng)簡(jiǎn)單討論了類變量。類變量不屬于由類定義的個(gè)別實(shí)例對(duì)象,而是屬于定義它的類;實(shí)例變量是針對(duì)實(shí)例的。這些討論同樣也適用于類方法。 類方法調(diào)用形式如下: 類名.類靜態(tài)方法名(實(shí)參列表) 對(duì)象方法調(diào)用形式如下

28、: 類對(duì)象名.類非靜態(tài)方法名(實(shí)參列表) 例如Circle c1=new Circle(); // r1是對(duì)象名System.out.println(“area=”+c1.getArea());,4.2.3 實(shí)例化對(duì)象,前面講過(guò),類是創(chuàng)建對(duì)象的模板.當(dāng)使用一個(gè)類創(chuàng)建了一個(gè)對(duì)象時(shí),我們也說(shuō)我們給出了這個(gè)類的一個(gè)實(shí)例。通常的格式為:Type objectName=new Type([parameterList]);創(chuàng)建一個(gè)

29、對(duì)象包括對(duì)象的聲明、為對(duì)象分配內(nèi)存空間和賦初值三個(gè)步驟。1、對(duì)象的聲明格式為:類的名字 對(duì)象名字;如 People zhangPing;這里People 是一個(gè)類的名字,zhangPing是我們聲明的對(duì)象的名字.,4.2.3 實(shí)例化對(duì)象,2、 為聲明的對(duì)象分配內(nèi)存.使用new 運(yùn)算符和類的構(gòu)造方法為聲明的對(duì)象分配內(nèi)存,如果類中沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法。默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的,構(gòu)造方法的名字必須和類名相

30、同。用new可以為一個(gè)類實(shí)例化多個(gè)不同的對(duì)象,這些對(duì)象分別占用不同的內(nèi)存空間,因此改變其中一個(gè)對(duì)象的狀態(tài)不會(huì)影響其他對(duì)象的狀態(tài)。3、最后一步是執(zhí)行構(gòu)造方法,進(jìn)行初始化。zhangPing=new People(“20040101”); zhongYong=new People(“20040102”); //實(shí)例化另外一個(gè)對(duì)象。上面三個(gè)步驟,通??梢詫?xiě)成如下簡(jiǎn)潔的形式:People zhangPing=new People(“2

31、0040101”);,4.2.3 實(shí)例化對(duì)象,【例4-1】下面的例子將建立雇員信息類EmpInfo,并實(shí)例化對(duì)象,然后打印出若干信息。// EmpInfo.javapublic class EmpInfo { String name; // 雇員的姓名 String designation; // 雇員的職務(wù) String department; // 雇員的部門(mén) void print(

32、) { // 成員方法 System.out.println(name + " is " + designation + " at " + department); },4.2.3 實(shí)例化對(duì)象,public static void main(String argv[]){ EmpInfo employee = new EmpInfo(); //

33、 創(chuàng)建對(duì)象并實(shí)例化 employee.name = " Robert Javaman " ; // 給成員變量賦值 employee.designation = " Manager " ; //給成員變量賦值 employee.department = " Coffee Shop " ; //給成員變量賦值 employee.print(

34、); // 調(diào)用方法print() } }運(yùn)行結(jié)果如下:Robert Javaman is Manager at Coffee Shop,4.2.4構(gòu)造方法,每當(dāng)由類構(gòu)造對(duì)象時(shí)都要調(diào)用該類特定的構(gòu)造方法,在Java中,每個(gè)類都至少有一個(gè)構(gòu)造方法。構(gòu)造方法可以確保用戶正確地構(gòu)造類的對(duì)象,同時(shí),構(gòu)造方法也會(huì)對(duì)對(duì)象作初始化工作。構(gòu)造方法說(shuō)明形式如下: [構(gòu)造方法修飾符] 方法名([形

35、式參數(shù)列表]) [throws異常列表] {方法體 }構(gòu)造方法修飾符與一般方法修飾符相同,讀者可參見(jiàn)4.2.2小節(jié)。,4.2.4構(gòu)造方法,構(gòu)造方法不能像一般的方法那樣被直接調(diào)用,它是在構(gòu)造類的實(shí)例的時(shí)候被new關(guān)鍵字調(diào)用的。當(dāng)我們構(gòu)造一個(gè)類的實(shí)例的時(shí)候,編譯器主要完成以下三件事情: (1) 為對(duì)象分配內(nèi)存空間; (2) 初始化對(duì)象中的實(shí)例變量的值

36、,初始值可以是缺省值,或者變量按指定的值初始化; (3) 調(diào)用對(duì)象的構(gòu)造方法。 一個(gè)類的構(gòu)造方法可以有多個(gè),它們都具有相同的方法名,即類名。編譯器根據(jù)參數(shù)的類型來(lái)決定調(diào)用哪個(gè)構(gòu)造方法。這就是構(gòu)造方法的多態(tài)。,4.2.4構(gòu)造方法,構(gòu)造方法分為缺省的構(gòu)造方法(不帶參數(shù))和帶參數(shù)的構(gòu)造方法。 (1)缺省的構(gòu)造方法 如果類的定義沒(méi)有編寫(xiě)構(gòu)造方法,Java語(yǔ)言會(huì)自動(dòng)為用戶提供。這個(gè)由Java自動(dòng)提

37、供的構(gòu)造方法就是所謂的缺省構(gòu)造方法。缺省的構(gòu)造方法確保每個(gè)Java類都至少有一個(gè)構(gòu)造方法,該方法應(yīng)符合方法的定義。 例如在例4-1的類EmpInfo中,我們沒(méi)有定義構(gòu)造方法,則Java自動(dòng)提供了一個(gè)缺省的構(gòu)造方法,如下: public EmpInfo(){} //缺省的構(gòu)造方法,4.2.4構(gòu)造方法,構(gòu)造方法分為缺省的構(gòu)造方法(不帶參數(shù))和帶參數(shù)的構(gòu)造方法。,4.2.4構(gòu)造方法,構(gòu)造方法分為缺省的構(gòu)造方

38、法(不帶參數(shù))和帶參數(shù)的構(gòu)造方法。 (2)帶參數(shù)的構(gòu)造方法 帶有參數(shù)的構(gòu)造方法能夠?qū)崿F(xiàn)這樣的功能:當(dāng)構(gòu)造一個(gè)新對(duì)象時(shí),類構(gòu)造方法可以按需要將一些指定的參數(shù)傳遞給對(duì)象的變量。,4.2.4構(gòu)造方法,【例4-3】在例4-1的基礎(chǔ)上編寫(xiě)帶參數(shù)的構(gòu)造方法。// EmpInfoC.javapublic class EmpInfoC { String name; // 雇員的姓名 String desig

39、nation; // 雇員的職務(wù) String department; // 雇員的部門(mén) // 帶參數(shù)的構(gòu)造方法 public EmpInfoC(String name,String designation,String department){ this.name=name; this.designation=designation; this.department=depart

40、ment;} void print() { // 成員方法 System.out.println(name + " is " + designation + " at " + department); }},4.2.4構(gòu)造方法,【例4-3】在例4-1的基礎(chǔ)上編寫(xiě)帶參數(shù)的構(gòu)造方法。 public static void main(String argv[])

41、{ EmpInfoC employee = new EmpInfoC("Robert Javaman ","Manager","Coffee Shop"); employee.print(); // 調(diào)用方法print() } }運(yùn)行結(jié)果如下:Robert Javaman is Manager at Coff

42、ee Shop由于采用了帶有參數(shù)的構(gòu)造方法來(lái)實(shí)例化對(duì)象,同時(shí)對(duì)對(duì)象進(jìn)行初始化,與例4-1相比較,代碼少了,更簡(jiǎn)潔更清晰了,如下: EmpInfo employee = new EmpInfo(); // 創(chuàng)建對(duì)象并實(shí)例化 employee.name = " Robert Javaman " ; // 給成員變量賦值 employee.designation = "

43、Manager " ; //給成員變量賦值 employee.department = " Coffee Shop " ; //給成員變量賦值 employee.print(); // 調(diào)用方法print() },4.2.5 對(duì)象的清除,Java運(yùn)行時(shí)系統(tǒng)通過(guò)垃圾收集器周期性地釋放無(wú)用對(duì)象所使用的內(nèi)存,完成對(duì)

44、象的清除。當(dāng)不存在對(duì)一個(gè)對(duì)象的引用時(shí),該對(duì)象成為一個(gè)無(wú)用對(duì)象。Java的垃圾收集器自動(dòng)掃描對(duì)象的動(dòng)態(tài)內(nèi)存區(qū),對(duì)被引用的對(duì)象加標(biāo)記,然后把沒(méi)有引用的對(duì)象作為垃圾收集起來(lái)并釋放。垃圾收集器作為一個(gè)線程運(yùn)行,當(dāng)系統(tǒng)的內(nèi)存用盡或程序中調(diào)用System.gc()要求進(jìn)行垃圾收集時(shí),垃圾收集線程與系統(tǒng)同步運(yùn)行,否則垃圾收集器在系統(tǒng)空閑時(shí)異步地執(zhí)行。在對(duì)象作為垃圾被收集器釋放前,Java運(yùn)行時(shí)系統(tǒng)會(huì)自動(dòng)調(diào)用對(duì)象的方法finialize(),使它清除自

45、己所使用的資源。 在類的定義中,除了必須定義創(chuàng)建類實(shí)例的方法外,還可以在定義中提供用于對(duì)象清除的方法finialize(),它的格式如下: protected void finalize() throws Throwable{ //撤銷對(duì)象 } finalize()方法是類java.long.Object中最基本的方法。 前面已經(jīng)講過(guò),Java提供自動(dòng)內(nèi)存垃圾收集和處理程序。然而,在某些情況下,當(dāng)一

46、個(gè)類被破壞后,需要親自執(zhí)行一些垃圾收集器不能處理的特殊清理工作。,4.2.6 方法重載,方法重載(Method Overloading)就是一個(gè)類中可以有多個(gè)方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類型不同,或者是返回值不同。 這也是面向?qū)ο蟮某绦蛟O(shè)計(jì)中的奇妙之處,重載反映了大千世界的變化。 從另外的含義上來(lái)講,重載也可以看成是同一個(gè)方法具有不同的版本,每個(gè)版本之間在參數(shù)特征和返回值

47、方面有差別。重載是Java實(shí)現(xiàn)多態(tài)性的一種方式。 當(dāng)調(diào)用一個(gè)重載方法時(shí),JVM自動(dòng)根據(jù)當(dāng)前對(duì)方法的調(diào)用形式在類的定義中匹配形式符合的成員方法,匹配成功后,執(zhí)行參數(shù)類型、數(shù)量均相同的成員方法。方法重載在Java的API類庫(kù)中得到大量的使用。,4.2.6 方法重載,【例4-4】關(guān)于成員方法重載的例子//DemoOverload.javaclass Demo2{ int a,b; int method(){

48、 //成員方法一 return a+b; } int method(int c){ //成員方法二 return a+b+c; } int method(int c,int d){ //成員方法三 return a+b+c+d; } Demo2(int a,int b) { //構(gòu)造方法 this.a = a;

49、 this.b = b; }},4.2.6 方法重載,【例4-4】關(guān)于成員方法重載的例子public class DemoOverload{public static void main(String args[]){ Demo2 aDemo2 = new Demo2(1,2); //實(shí)例化 int a = aDemo2.method(); //調(diào)用成員方法一 S

50、ystem.out.println(a); int b = aDemo2.method(3); //調(diào)用成員方法二 System.out.println(b); int c = aDemo2.method(3,4);//調(diào)用成員方法三 System.out.println(c);}}上面程序的運(yùn)行結(jié)果為:3610,4.2.6 方法重載,【例4-5】構(gòu)造方法也可以重載

51、,// ConstructionOverload.javaclass Demo{ int a,b,c;//成員變量 public Demo(){} //構(gòu)造方法1 public Demo(int a) { //構(gòu)造方法2 this.a = a; } public Demo(int a,int b) { //構(gòu)造方法3 this.a = a;this.b = b;

52、} public Demo(int a,int b,int c) {//構(gòu)造方法4 this.a = a;this.b = b;this.c = c;} },4.2.6 方法重載,public class ConstructionOverload{public static void main(String args[]){ //應(yīng)用第一種構(gòu)造方法 Demo aDe

53、mo = new Demo(); System.out.println("方法一成員變量a:"+aDemo.a); System.out.println("方法一成員變量b:"+aDemo.b); System.out.println("方法一成員變量c:"+aDemo.c); //應(yīng)用第二種構(gòu)造方法

54、 Demo bDemo = new Demo(1); System.out.println("方法二成員變量a:"+bDemo.a); System.out.println("方法二成員變量b:"+bDemo.b); System.out.println("方法二成員變量c:"+bDemo.c);……,4.2.6 方法重載,從上面的程

55、序中可以看到構(gòu)造方法的重載。在該程序中,方法Demo()被定義了四次,每次參數(shù)不同。第一個(gè)構(gòu)造方法,沒(méi)有參數(shù),也沒(méi)有方法體,它和系統(tǒng)的缺省構(gòu)造方法是一致的。缺省的構(gòu)造方法確保每個(gè)Java類都至少有一個(gè)構(gòu)造方法。如果程序中給出了帶參數(shù)的構(gòu)造方法,而沒(méi)有給出缺省構(gòu)造方法,這時(shí)調(diào)用缺省構(gòu)造方法將導(dǎo)致錯(cuò)誤。 在調(diào)用構(gòu)造方法時(shí),由于使用的是同一方法名,因此根據(jù)構(gòu)造方法的參數(shù)就能找到需要運(yùn)行的哪個(gè)方法。,第4章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ),4

56、.1 面向?qū)ο蟮幕靖拍?.2 類的定義4.3 類和對(duì)象的使用 4.4 包package4.5 成員變量及方法的訪問(wèn)權(quán)限4.6 final、this及其它,,4.3 類和對(duì)象的使用,4.3.1實(shí)例變量和類變量4.3.2 實(shí)例方法和類方法,,4.3.1實(shí)例變量和類變量,在生成每個(gè)類的實(shí)例對(duì)象時(shí),Java運(yùn)行時(shí)系統(tǒng)為每個(gè)對(duì)象的實(shí)例變量分配一塊內(nèi)存,然后可以通過(guò)該對(duì)象來(lái)訪問(wèn)這些實(shí)例的變量。不同對(duì)象的實(shí)例變量是不同的。

57、而對(duì)于類變量來(lái)說(shuō),在生成類的第一個(gè)實(shí)例對(duì)象時(shí),Java運(yùn)行時(shí)系統(tǒng)對(duì)這個(gè)對(duì)象的每個(gè)類變量分配一塊內(nèi)存,以后再生成該類的實(shí)例對(duì)象時(shí),這些實(shí)例對(duì)象將共享同一個(gè)類變量,每個(gè)實(shí)例對(duì)象對(duì)類變量的改變都會(huì)直接影響到其他實(shí)例對(duì)象。類變量可以通過(guò)類名直接訪問(wèn),也可以通過(guò)實(shí)例對(duì)象來(lái)訪問(wèn),兩種方法的結(jié)果是相同的。,4.3.2 實(shí)例方法和類方法,實(shí)例方法可以對(duì)當(dāng)前對(duì)象的實(shí)例變量進(jìn)行操作,也可以對(duì)類變量進(jìn)行操作,但類方法不能訪問(wèn)實(shí)例變量。實(shí)例方法必須由實(shí)例對(duì)象來(lái)

58、調(diào)用,而類方法除了可由實(shí)例對(duì)象調(diào)用外,還可以由類名直接調(diào)用。另外,在類方法中不能使用this或super。 關(guān)于類方法的使用,有如下一些限制: (1) 在類方法中不能引用對(duì)象變量。 (2) 在類方法中不能使用super、this關(guān)鍵字。 (3) 類方法不能調(diào)用類中的對(duì)象方法。 如果違反這些限制,你的程序就會(huì)導(dǎo)致編譯錯(cuò)誤。 與類方法相比,實(shí)例方法幾乎沒(méi)有什么限制: (1) 實(shí)例方法可以引

59、用對(duì)象變量(這是顯然的),也可以引用類變量。 (2) 實(shí)例方法中可以使用super、this關(guān)鍵字。 (3) 實(shí)例方法中可以調(diào)用類方法。,4.3.2 實(shí)例方法和類方法,【例4-6】下面是關(guān)于實(shí)例變量的例子//instVar.javaclass koA{ int a; public void display(){ System.out.print(" a="+a); } }

60、 public class instVar{ public static void main(String args[]){ koA a1=new koA(); a1.a=10; //a1是一個(gè)實(shí)例對(duì)象 koA a2=new koA(); a2.a=20; // a2是另一個(gè)實(shí)例對(duì)象a1.display();a2.display(); }}運(yùn)行結(jié)果為

61、a=10 a=20,4.3.2 實(shí)例方法和類方法,【例4-7】 下面是類變量的例子// classVar.javaclass koB{ static int a; public void display(){ System.out.print(" a="+a); } } public class classVar{ public static void main(Stri

62、ng args[]){ koB a1=new koB(); a1.a=10; //a1是一個(gè)實(shí)例對(duì)象 koB a2=new koB(); a2.a=20; //a2是另一個(gè)實(shí)例對(duì)象 koB.a=50; //類方法直接訪問(wèn)類變量a1.display(); a2.display(); }}運(yùn)行結(jié)果為:a=50 a=50,4.3.2 實(shí)例

63、方法和類方法,【例4-8】下面是類方法使用的例子// classMethodTest.javaclass member{static int classVar; int instanceVar;static void setClassVar(int i){ classVar=i;// instanceVar=i; //在類方法中不能引用實(shí)例成員。}static int getClassVar( ){

64、 return classVar;}void setInstanceVar(int i ){ classVar=i; instanceVar=i;}int getInstanceVar(){return instanceVar; }},4.3.2 實(shí)例方法和類方法,public class classMethodTest{ public static void main(String args[]){

65、 member m1=new member( ); member m2=new member( ); m1.setClassVar(1); m2.setClassVar(2);System.out.println("m1.classVar="+m1.getClassVar( )+ " m2.classVar="+m2.getClassVar( )); m1.setInstanceVa

66、r(11); m2.setInstanceVar(22);System.out.println("m1.InstanceVar="+m1.getInstanceVar( )+ " m2.InstanceVar="+m2.getInstanceVar( ));}}運(yùn)行結(jié)果為: m1.classVar=2 m2.classVar=2 m1.InstanccVar=11 m

67、2.InstanceVar=22,第4章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ),4.1 面向?qū)ο蟮幕靖拍?.2 類的定義4.3 類和對(duì)象的使用 4.4 包package4.5 成員變量及方法的訪問(wèn)權(quán)限4.6 final、this及其它,,4.4 包package,4.4.1 package語(yǔ)句4.4.2 import語(yǔ)句4.4.3 編譯和運(yùn)行包,,4.4 包package,由于Java編譯器為每個(gè)類生成一個(gè)字節(jié)碼文

68、件,且文件名與類名相同,因此同名的類有可能發(fā)生沖突。為了解決這一問(wèn)題,Java提供包來(lái)管理類名空間。包實(shí)際上提供了一種命名機(jī)制和可見(jiàn)性限制機(jī)制。Java虛擬機(jī)(JVM)決定如何創(chuàng)建和存儲(chǔ)包、子包以及相應(yīng)的編譯單元,并決定哪些頂層包名稱在特定的編譯中是可見(jiàn)的,以及決定哪些包是可訪問(wèn)的。包可以存儲(chǔ)在在當(dāng)?shù)匚募到y(tǒng)中、分布式文件系統(tǒng)當(dāng)中,或者某種形式的數(shù)據(jù)庫(kù)中。Java系統(tǒng)必須支持至少一個(gè)無(wú)名包(也叫缺省包),一般為當(dāng)前目錄。在開(kāi)發(fā)小的或

69、者臨時(shí)的應(yīng)用程序或者剛剛開(kāi)始開(kāi)發(fā)時(shí),用無(wú)名包是非常方便的。,4.4.1 package語(yǔ)句,package語(yǔ)句作為Java源文件的第一條語(yǔ)句,指明該文件中定義的類所在的包。(若缺省該語(yǔ)句,則指定為無(wú)名包)。它的格式為:package pkg1[.pkg2[.pkg3…]];Java編譯器把包對(duì)應(yīng)于文件系統(tǒng)的目錄。例如:名為myPackage的包中,所有類文件都將存儲(chǔ)在目錄myPackage下。同時(shí),package語(yǔ)句中,用“.”來(lái)

溫馨提示

  • 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ù)僅提供信息存儲(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)論