




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、v學(xué)習(xí)導(dǎo)讀學(xué)習(xí)導(dǎo)讀v 本章著重介紹本章著重介紹Java編程中類(lèi)和對(duì)象等非常重要的編程中類(lèi)和對(duì)象等非常重要的概念。概念。v Java程序是由一個(gè)個(gè)類(lèi)定義組成的,編寫(xiě)程序是由一個(gè)個(gè)類(lèi)定義組成的,編寫(xiě)Java程序的過(guò)程就是從現(xiàn)實(shí)世界中抽象出程序的過(guò)程就是從現(xiàn)實(shí)世界中抽象出Java可實(shí)現(xiàn)的可實(shí)現(xiàn)的類(lèi)并用合適的語(yǔ)句定義它們的過(guò)程,這個(gè)定義過(guò)程類(lèi)并用合適的語(yǔ)句定義它們的過(guò)程,這個(gè)定義過(guò)程包括對(duì)類(lèi)內(nèi)各種屬性和方法的定義,創(chuàng)建類(lèi)的對(duì)象,包括對(duì)類(lèi)內(nèi)各種屬性和方法的定義,創(chuàng)建類(lèi)的對(duì)象,也包括類(lèi)間的各種關(guān)系和接口的定義。也包括類(lèi)間的各種關(guān)系和接口的定義。v 方法是類(lèi)的主要組成部分。在一個(gè)類(lèi)中,程序方法是類(lèi)的主要組成
2、部分。在一個(gè)類(lèi)中,程序的作用體現(xiàn)在方法中。方法是的作用體現(xiàn)在方法中。方法是Java語(yǔ)言的基本構(gòu)件。語(yǔ)言的基本構(gòu)件。利用方法可以組成結(jié)構(gòu)良好的程序。本章介紹方法利用方法可以組成結(jié)構(gòu)良好的程序。本章介紹方法的構(gòu)成規(guī)則和設(shè)計(jì)、使用方法的基本要點(diǎn)。的構(gòu)成規(guī)則和設(shè)計(jì)、使用方法的基本要點(diǎn)。v Java的應(yīng)用程序接口(的應(yīng)用程序接口(API)大量的軟件包庫(kù)。大量的軟件包庫(kù)。第4章 類(lèi)和對(duì)象第4章 類(lèi)和對(duì)象v4.1.面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蟮幕靖拍顅4.2 類(lèi)類(lèi)v4.3 方法方法v4.4 訪問(wèn)控制符訪問(wèn)控制符v4.5 靜態(tài)修飾符、靜態(tài)字段和方法靜態(tài)修飾符、靜態(tài)字段和方法v4.6 抽象類(lèi)與抽象方法抽象類(lèi)與抽
3、象方法v4.7 最終類(lèi)、最終屬性、最終方法與終結(jié)器最終類(lèi)、最終屬性、最終方法與終結(jié)器v本章小結(jié)本章小結(jié)v思考與練習(xí)思考與練習(xí) 4.1.面向?qū)ο蟮幕靖拍顚W(xué)習(xí)要點(diǎn)之二學(xué)習(xí)要點(diǎn)之二OOD方法提供了抽象數(shù)據(jù)類(lèi)型機(jī)制,遵循軟件設(shè)計(jì)的三條重要原則,即抽象、信息隱藏和模塊化;雙重模塊化數(shù)據(jù)對(duì)數(shù)據(jù)的操作信息處理+封裝4.1.面向?qū)ο蟮幕靖拍顅4.1.1 抽象v1什么是抽象 抽象就是抽出事物的本質(zhì)特性而暫時(shí)不考慮它們的細(xì)節(jié)。過(guò)程抽象和數(shù)據(jù)抽象是常用的兩種主要抽象手段。 客觀世界的對(duì)象和操作 計(jì)算機(jī)算法 解空間 數(shù)據(jù) 程序員對(duì)問(wèn)題的表達(dá)(抽象) 客觀世界的算法 結(jié)果 客觀世界的對(duì)象 程序設(shè)計(jì)的對(duì)象和操作 輸出
4、數(shù)據(jù) 問(wèn)題空間 v2如何用面向?qū)ο蟮姆椒▽?shí)現(xiàn)抽象如何用面向?qū)ο蟮姆椒▽?shí)現(xiàn)抽象 一個(gè)抽象數(shù)據(jù)類(lèi)型(Abstract Data Type,ADT)可以分解成4個(gè)部分,如圖4-2所示。語(yǔ)法和語(yǔ)義構(gòu)成抽象數(shù)據(jù)類(lèi)型ADT的說(shuō)明,讓使用者了解這個(gè)抽象數(shù)據(jù)類(lèi)型的特征。屬性和方法構(gòu)成ADT的實(shí)現(xiàn),展示這個(gè)ADT是怎樣做成的。 抽象數(shù)據(jù)類(lèi)型 說(shuō)明 實(shí)現(xiàn) 語(yǔ)法 語(yǔ)義 屬性 方法 圖4-2 抽象數(shù)據(jù)類(lèi)型 v4.1.2 封裝封裝 將信息隱蔽的過(guò)程稱為封裝。 有兩方面的原因促使我們控制對(duì)成員的訪問(wèn)。 第一個(gè)原因是防止程序員接觸他們不該接觸的東西通常是內(nèi)部數(shù)據(jù)類(lèi)型的設(shè)計(jì)思想。若只是為了解決特定的問(wèn)題,用戶只需操作接口即可
5、,毋需明白這些信息。 第二個(gè)原因是允許庫(kù)設(shè)計(jì)人員修改內(nèi)部結(jié)構(gòu),不用擔(dān)心它會(huì)對(duì)客戶程序員造成什么影響。 v4.1.3 對(duì)象對(duì)象 可將對(duì)象想象對(duì)象(可將對(duì)象想象對(duì)象(objectobject)應(yīng)是應(yīng)是實(shí)際問(wèn)題域中有意義的個(gè)體或概念實(shí)體。實(shí)際問(wèn)題域中有意義的個(gè)體或概念實(shí)體。此外,對(duì)象應(yīng)該具有記憶自身狀態(tài)的能此外,對(duì)象應(yīng)該具有記憶自身狀態(tài)的能力。同時(shí)對(duì)象應(yīng)該以某種方式與系統(tǒng)發(fā)力。同時(shí)對(duì)象應(yīng)該以某種方式與系統(tǒng)發(fā)生關(guān)聯(lián),既對(duì)象應(yīng)該與系統(tǒng)中其他有意生關(guān)聯(lián),既對(duì)象應(yīng)該與系統(tǒng)中其他有意義的對(duì)象進(jìn)行消息傳遞,并提供外部服義的對(duì)象進(jìn)行消息傳遞,并提供外部服務(wù)。務(wù)。 v4.1.3 對(duì)象對(duì)象l(1) (1) 所有東西都
6、是對(duì)象??蓪?duì)象想象成一種新型變所有東西都是對(duì)象??蓪?duì)象想象成一種新型變量;它保存著數(shù)據(jù),但可要求它對(duì)自身進(jìn)行操作。量;它保存著數(shù)據(jù),但可要求它對(duì)自身進(jìn)行操作。 l(2) (2) 程序是一大堆對(duì)象的組合;通過(guò)消息傳遞,各對(duì)程序是一大堆對(duì)象的組合;通過(guò)消息傳遞,各對(duì)象知道自己該做些什么。象知道自己該做些什么。 l(3) (3) 每個(gè)對(duì)象都有自己的存儲(chǔ)空間,可容納其他對(duì)象。每個(gè)對(duì)象都有自己的存儲(chǔ)空間,可容納其他對(duì)象。l(4) (4) 每個(gè)對(duì)象都有一種類(lèi)型。根據(jù)語(yǔ)法,每個(gè)對(duì)象都每個(gè)對(duì)象都有一種類(lèi)型。根據(jù)語(yǔ)法,每個(gè)對(duì)象都是某個(gè)是某個(gè)“類(lèi)類(lèi)”的一個(gè)的一個(gè)“實(shí)例實(shí)例”。其中,。其中,“類(lèi)類(lèi)”(Class
7、Class)是是“類(lèi)型類(lèi)型”(TypeType)的同義詞。一個(gè)類(lèi)最重要的特征就的同義詞。一個(gè)類(lèi)最重要的特征就是是“能將什么消息發(fā)給它?能將什么消息發(fā)給它?”l(5 5)同一類(lèi)所有對(duì)象都能接收相同的消息。)同一類(lèi)所有對(duì)象都能接收相同的消息。 4.2 類(lèi) 類(lèi)是現(xiàn)實(shí)世界某些對(duì)象的共同特征類(lèi)是現(xiàn)實(shí)世界某些對(duì)象的共同特征(屬性和操作屬性和操作)的的表示,對(duì)象是類(lèi)的實(shí)例表示,對(duì)象是類(lèi)的實(shí)例。類(lèi)的屬性類(lèi)的屬性:就是類(lèi)的靜態(tài)屬性的簡(jiǎn)稱,指類(lèi)內(nèi)包就是類(lèi)的靜態(tài)屬性的簡(jiǎn)稱,指類(lèi)內(nèi)包含的各項(xiàng)數(shù)據(jù),如變量或其他類(lèi)的對(duì)象;含的各項(xiàng)數(shù)據(jù),如變量或其他類(lèi)的對(duì)象;類(lèi)的服務(wù)類(lèi)的服務(wù): 則被稱為成員函數(shù)或方法。則被稱為成員函數(shù)或方
8、法。4.2 類(lèi) 類(lèi)的基本定義方法如下:修飾符修飾符 class 類(lèi)名類(lèi)名 extends 父類(lèi)父類(lèi) implements 接口名接口名 類(lèi)成員變量聲明類(lèi)成員變量聲明 類(lèi)方法聲明類(lèi)方法聲明 類(lèi)的修飾符用來(lái)說(shuō)明類(lèi)的特殊性質(zhì)。 分為三種:訪問(wèn)控制符:public 公共類(lèi)公共類(lèi)抽象類(lèi)說(shuō)明符:abstract最終類(lèi)說(shuō)明符:f inal 接口名跟在implements關(guān)鍵字后面,用來(lái)說(shuō)明當(dāng)前類(lèi)中實(shí)現(xiàn)了哪個(gè)接口定義的功能和方法。 接口是Java語(yǔ)言用來(lái)實(shí)現(xiàn)多重繼承的一種特殊機(jī)制,我們將在后面詳細(xì)介紹它的使用方法。v1關(guān)于類(lèi)頭關(guān)于類(lèi)頭-class class關(guān)鍵字,在它的后面,應(yīng)跟隨新數(shù)據(jù)類(lèi)型的名稱。(注意不
9、要把class寫(xiě)成Class)。 父類(lèi)名跟在extends 關(guān)鍵字后面,用來(lái)說(shuō)明當(dāng)前類(lèi)是哪個(gè)已經(jīng)存在類(lèi)的子類(lèi),存在繼承關(guān)系。繼承是類(lèi)與類(lèi)之間的一種非常重要的關(guān)系。v1關(guān)于類(lèi)頭關(guān)于類(lèi)頭-類(lèi)的修飾符類(lèi)的修飾符“public”(公共)公共) 意味著后續(xù)的定義任何人均可使用?!皃rivate”(私有)私有)意味著除您自己、類(lèi)型的創(chuàng)建者以及那個(gè)類(lèi)型的內(nèi)部函數(shù)成員,其他任何人都不能訪問(wèn)后續(xù)的定義信息?!皃rotected”(受保護(hù)的)受保護(hù)的)與“private”相似,只是一個(gè)繼承的類(lèi)可訪問(wèn)受保護(hù)的成員,但不能訪問(wèn)私有成員。“friendly”(友好的)友好的)若某樣?xùn)|西是“友好的”,意味著它只能在這個(gè)包
10、裝的范圍內(nèi)使用(所以這一訪問(wèn)級(jí)別有時(shí)也叫作“包裝訪問(wèn)”)?!皏1關(guān)于類(lèi)頭關(guān)于類(lèi)頭-接口名接口名接口名跟在接口名跟在implements關(guān)鍵字后面,用來(lái)關(guān)鍵字后面,用來(lái)說(shuō)明當(dāng)前類(lèi)中實(shí)現(xiàn)了哪個(gè)接口定義的功能說(shuō)明當(dāng)前類(lèi)中實(shí)現(xiàn)了哪個(gè)接口定義的功能和方法。接口是和方法。接口是Java語(yǔ)言用來(lái)實(shí)現(xiàn)多重繼語(yǔ)言用來(lái)實(shí)現(xiàn)多重繼承的一種特殊機(jī)制,我們將在后面詳細(xì)介承的一種特殊機(jī)制,我們將在后面詳細(xì)介紹它的使用方法。紹它的使用方法。2關(guān)于類(lèi)體關(guān)于類(lèi)體 類(lèi)體的定義要包括類(lèi)的具體內(nèi)容,包括類(lèi)體的定義要包括類(lèi)的具體內(nèi)容,包括類(lèi)的屬性與方法。類(lèi)的屬性與方法。class Java中聲明類(lèi)屬性為簡(jiǎn)單變量的語(yǔ)法如下:中聲明類(lèi)屬性
11、為簡(jiǎn)單變量的語(yǔ)法如下: 修飾符修飾符 變量類(lèi)型變量類(lèi)型 變量名變量名 =變量初值變量初值; 變量類(lèi)型和變量名是聲明一個(gè)變量必變量類(lèi)型和變量名是聲明一個(gè)變量必不可少的部分;變量的類(lèi)型是簡(jiǎn)單數(shù)據(jù)類(lèi)不可少的部分;變量的類(lèi)型是簡(jiǎn)單數(shù)據(jù)類(lèi)型,如型,如int、double等。等。2關(guān)于類(lèi)體關(guān)于類(lèi)體-類(lèi)的屬性類(lèi)的屬性2關(guān)于類(lèi)體關(guān)于類(lèi)體-類(lèi)的方法類(lèi)的方法Java中聲明方法的語(yǔ)法如下:中聲明方法的語(yǔ)法如下: 修飾符修飾符 返回值類(lèi)型返回值類(lèi)型 方法名方法名(參數(shù)參數(shù)列表列表)throws 例外名例外名1,例外名,例外名2, 方法體:方法體: 局部變量聲明;局部變量聲明; 語(yǔ)句序列;語(yǔ)句序列; 類(lèi)的方法,又稱類(lèi)的
12、方法,又稱為成員函數(shù),用為成員函數(shù),用來(lái)規(guī)定類(lèi)屬性上來(lái)規(guī)定類(lèi)屬性上的操作,實(shí)現(xiàn)類(lèi)的操作,實(shí)現(xiàn)類(lèi)的內(nèi)部功能的機(jī)的內(nèi)部功能的機(jī)制,同時(shí)也是類(lèi)制,同時(shí)也是類(lèi)與外界進(jìn)行交互與外界進(jìn)行交互的重要窗口。的重要窗口。 類(lèi)中定義的方法通常起到兩種作用:一是圍繞著類(lèi)的類(lèi)中定義的方法通常起到兩種作用:一是圍繞著類(lèi)的屬性進(jìn)行各種操作;二是與其他的類(lèi)或?qū)ο筮M(jìn)行數(shù)據(jù)交流、屬性進(jìn)行各種操作;二是與其他的類(lèi)或?qū)ο筮M(jìn)行數(shù)據(jù)交流、消息傳遞等操作。消息傳遞等操作。注意:系統(tǒng)調(diào)用方法的最大特點(diǎn):注意:系統(tǒng)調(diào)用方法的最大特點(diǎn):不需要在程序里書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用不需要在程序里書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用方法的命令方法的命令 Java語(yǔ)言中定義的方法有兩類(lèi)
13、:語(yǔ)言中定義的方法有兩類(lèi): 一類(lèi)是需要程序書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用命令來(lái)調(diào)用的方法,一類(lèi)是需要程序書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用命令來(lái)調(diào)用的方法,稱為程序調(diào)用方法,例如稱為程序調(diào)用方法,例如isPrime (); 另一類(lèi)是運(yùn)行過(guò)程中系統(tǒng)自動(dòng)調(diào)用的方法,稱為系統(tǒng)方另一類(lèi)是運(yùn)行過(guò)程中系統(tǒng)自動(dòng)調(diào)用的方法,稱為系統(tǒng)方法,例如我們前面程序中的法,例如我們前面程序中的action()、paint()、init()等。這等。這兩類(lèi)方法的定義和使用原則有很大差異。兩類(lèi)方法的定義和使用原則有很大差異。 2關(guān)于類(lèi)體關(guān)于類(lèi)體-類(lèi)的方法類(lèi)的方法4.2.2 用戶程序自定義類(lèi)用戶程序自定義類(lèi) Java程序員把注意力放在創(chuàng)建稱為類(lèi)的用戶程序員把注意
14、力放在創(chuàng)建稱為類(lèi)的用戶自定義類(lèi)型(自定義類(lèi)型(user-defined type)上,類(lèi)也稱上,類(lèi)也稱為程序員定義的類(lèi)型(為程序員定義的類(lèi)型(programmer-defined type),),每個(gè)類(lèi)都含有數(shù)據(jù)和一組操作數(shù)據(jù)的每個(gè)類(lèi)都含有數(shù)據(jù)和一組操作數(shù)據(jù)的方法,類(lèi)中的數(shù)據(jù)部分稱為實(shí)例變量。用戶定方法,類(lèi)中的數(shù)據(jù)部分稱為實(shí)例變量。用戶定義類(lèi)型(即類(lèi))的實(shí)例稱為對(duì)象。義類(lèi)型(即類(lèi))的實(shí)例稱為對(duì)象。 下面是一個(gè)簡(jiǎn)單化的下面是一個(gè)簡(jiǎn)單化的EmployeeEmployee類(lèi),在編寫(xiě)今后的職工工資類(lèi),在編寫(xiě)今后的職工工資系統(tǒng)時(shí),會(huì)用到它。系統(tǒng)時(shí),會(huì)用到它。class Employee /構(gòu)造函數(shù)構(gòu)造函
15、數(shù)public Employee(String n,double s,int year,int month,int day) name = n; /職工姓名職工姓名 salary = s; /職工工資職工工資 hireDay=new GregorianCalendar(year,month-1,day);/出勤數(shù)出勤數(shù)/方法方法1public String getName() return name;/更多的方法更多的方法/屬性的實(shí)例屬性的實(shí)例private String name;private double salary;private Date hireDay;4.2.3 創(chuàng)建類(lèi)及類(lèi)的實(shí)
16、例對(duì)象創(chuàng)建類(lèi)及類(lèi)的實(shí)例對(duì)象 對(duì)象是類(lèi)的一個(gè)實(shí)例,類(lèi)是同種對(duì)象的抽象,對(duì)象是類(lèi)的一個(gè)實(shí)例,類(lèi)是同種對(duì)象的抽象,是創(chuàng)建對(duì)象的模板。在程序中創(chuàng)建是創(chuàng)建對(duì)象的模板。在程序中創(chuàng)建個(gè)對(duì)象將在內(nèi)個(gè)對(duì)象將在內(nèi)存中開(kāi)辟一塊空間,其中包括該對(duì)象的屬性和方法。存中開(kāi)辟一塊空間,其中包括該對(duì)象的屬性和方法。 我們將分步講述這個(gè)類(lèi)的實(shí)現(xiàn)細(xì)節(jié)。創(chuàng)建對(duì)象使我們將分步講述這個(gè)類(lèi)的實(shí)現(xiàn)細(xì)節(jié)。創(chuàng)建對(duì)象使用關(guān)鍵字運(yùn)算符用關(guān)鍵字運(yùn)算符newnew,例如下面的語(yǔ)句將創(chuàng)建例如下面的語(yǔ)句將創(chuàng)建EmployeeEmployee的對(duì)象:的對(duì)象:【例【例4.14.1】顯示三個(gè)員工的相關(guān)信息】顯示三個(gè)員工的相關(guān)信息4.2.3 創(chuàng)建類(lèi)及類(lèi)的實(shí)例對(duì)象
17、創(chuàng)建類(lèi)及類(lèi)的實(shí)例對(duì)象在程序中我們構(gòu)造了一個(gè)在程序中我們構(gòu)造了一個(gè)EmployeeEmployee數(shù)組,并給它賦給三個(gè)數(shù)組,并給它賦給三個(gè)EmployeeEmployee對(duì)對(duì)象象。關(guān)于數(shù)組我們將在下一章講述。關(guān)于數(shù)組我們將在下一章講述。 staff0 = staff0 = newnew Employee( Employee(張三張三, 75000,1987, 12, 15);, 75000,1987, 12, 15); staff1 =staff1 = new new Employee(Employee(李四李四, 50000,1989, 10, 1);, 50000,1989, 10, 1);
18、 staff2 = staff2 = newnew Employee( Employee(王五王五, 40000,1990, 3, 15);, 40000,1990, 3, 15); 創(chuàng)建對(duì)象以某個(gè)類(lèi)為模板,這個(gè)類(lèi)里定義了哪創(chuàng)建對(duì)象以某個(gè)類(lèi)為模板,這個(gè)類(lèi)里定義了哪些屬性和方法,新建的對(duì)象就必然在內(nèi)存里擁有些屬性和方法,新建的對(duì)象就必然在內(nèi)存里擁有相應(yīng)的屬性和方法。相應(yīng)的屬性和方法。 可見(jiàn),相對(duì)于簡(jiǎn)單數(shù)據(jù)類(lèi)型,類(lèi)就是用戶自己可見(jiàn),相對(duì)于簡(jiǎn)單數(shù)據(jù)類(lèi)型,類(lèi)就是用戶自己定義的復(fù)雜的抽象數(shù)據(jù)類(lèi)型:而相對(duì)于簡(jiǎn)單變量定義的復(fù)雜的抽象數(shù)據(jù)類(lèi)型:而相對(duì)于簡(jiǎn)單變量,對(duì)象就是復(fù)雜的既包括數(shù)據(jù)又包括方法代碼的,對(duì)象就
19、是復(fù)雜的既包括數(shù)據(jù)又包括方法代碼的復(fù)雜數(shù)據(jù)單位。復(fù)雜數(shù)據(jù)單位。4.2.4 構(gòu)造函數(shù)構(gòu)造函數(shù)v1構(gòu)造函數(shù)的一般概念構(gòu)造函數(shù)的一般概念v2創(chuàng)建自己的構(gòu)造函數(shù)創(chuàng)建自己的構(gòu)造函數(shù)v3構(gòu)造函數(shù)的作用構(gòu)造函數(shù)的作用4.2.4 構(gòu)造函數(shù)構(gòu)造函數(shù)-構(gòu)造函數(shù)的一般概念構(gòu)造函數(shù)的一般概念 要使用對(duì)象,首先必須構(gòu)造它們,并指定它們的初始狀態(tài),要使用對(duì)象,首先必須構(gòu)造它們,并指定它們的初始狀態(tài),然后將方法應(yīng)用于對(duì)象。然后將方法應(yīng)用于對(duì)象。 在在Java程序設(shè)計(jì)語(yǔ)言中,使用構(gòu)造函數(shù)(程序設(shè)計(jì)語(yǔ)言中,使用構(gòu)造函數(shù)(constructor)來(lái)構(gòu)來(lái)構(gòu)造新的實(shí)例。一個(gè)構(gòu)造函數(shù)是一個(gè)新的方法,它的作用是構(gòu)造造新的實(shí)例。一個(gè)構(gòu)造函
20、數(shù)是一個(gè)新的方法,它的作用是構(gòu)造并初始化對(duì)象。并初始化對(duì)象。構(gòu)造函數(shù)是類(lèi)的一種特殊方法,它的特殊性主要體現(xiàn)在如下的構(gòu)造函數(shù)是類(lèi)的一種特殊方法,它的特殊性主要體現(xiàn)在如下的幾個(gè)方面:幾個(gè)方面:(1)構(gòu)造函數(shù)的方法名與類(lèi)名相同。)構(gòu)造函數(shù)的方法名與類(lèi)名相同。(2)構(gòu)造函數(shù)沒(méi)有返回類(lèi)型。)構(gòu)造函數(shù)沒(méi)有返回類(lèi)型。(3)構(gòu)造函數(shù)的主要作用是完成對(duì)類(lèi)對(duì)象的初始化工作。)構(gòu)造函數(shù)的主要作用是完成對(duì)類(lèi)對(duì)象的初始化工作。(4)構(gòu)造函數(shù)不能由編程人員顯式地直接調(diào)用。)構(gòu)造函數(shù)不能由編程人員顯式地直接調(diào)用。(5)在創(chuàng)建一個(gè)類(lèi)的新對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類(lèi)的)在創(chuàng)建一個(gè)類(lèi)的新對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類(lèi)的構(gòu)造函數(shù)
21、為新對(duì)象初始化。構(gòu)造函數(shù)為新對(duì)象初始化。4.2.4 構(gòu)造函數(shù)構(gòu)造函數(shù)-創(chuàng)建自己的構(gòu)造函數(shù)創(chuàng)建自己的構(gòu)造函數(shù) 構(gòu)造函數(shù)的名字和類(lèi)的名字是相同的。當(dāng)構(gòu)造構(gòu)造函數(shù)的名字和類(lèi)的名字是相同的。當(dāng)構(gòu)造Employee類(lèi)的對(duì)象時(shí),此構(gòu)造函數(shù)被啟動(dòng),實(shí)例字段賦初值,在類(lèi)的對(duì)象時(shí),此構(gòu)造函數(shù)被啟動(dòng),實(shí)例字段賦初值,在Java中,定義和初始化是統(tǒng)一的中,定義和初始化是統(tǒng)一的兩者缺一不可。兩者缺一不可。 例如,用下面的代碼創(chuàng)建例如,用下面的代碼創(chuàng)建Employee類(lèi)的一個(gè)實(shí)例時(shí),類(lèi)的一個(gè)實(shí)例時(shí),new Employee (“James Bond”,100000,1950,1,1);構(gòu)造函數(shù)的特點(diǎn)有:構(gòu)造函數(shù)的特點(diǎn)有
22、:(1 1)構(gòu)造函數(shù)和類(lèi)具有相同的名字。)構(gòu)造函數(shù)和類(lèi)具有相同的名字。(2 2)一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù)。)一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù)。(3 3)構(gòu)造函數(shù)可以有)構(gòu)造函數(shù)可以有0 0個(gè)、個(gè)、1 1個(gè)或多個(gè)參數(shù)。個(gè)或多個(gè)參數(shù)。(4 4)構(gòu)造函數(shù)沒(méi)有返回值。)構(gòu)造函數(shù)沒(méi)有返回值。(5 5)構(gòu)造函數(shù)總是和)構(gòu)造函數(shù)總是和newnew運(yùn)算符一起被調(diào)用。運(yùn)算符一起被調(diào)用。4.2.4 構(gòu)造函數(shù)構(gòu)造函數(shù)-構(gòu)造函數(shù)的作用構(gòu)造函數(shù)的作用(1)對(duì)象初始化)對(duì)象初始化(2 2)引入更多的靈活度(變量賦值或更復(fù)雜的操作)引入更多的靈活度(變量賦值或更復(fù)雜的操作)(3)Java中可以不定義構(gòu)造函數(shù)中可以不定義構(gòu)造函數(shù) J
23、ava中可以不定義構(gòu)造函數(shù),此時(shí)系統(tǒng)會(huì)自動(dòng)為該系統(tǒng)中可以不定義構(gòu)造函數(shù),此時(shí)系統(tǒng)會(huì)自動(dòng)為該系統(tǒng)生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)的名字與類(lèi)名相生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)的名字與類(lèi)名相同,它沒(méi)有任何形式參數(shù),也不完成任何操作。同,它沒(méi)有任何形式參數(shù),也不完成任何操作。 為了避免失去控制,一般將構(gòu)造函數(shù)的聲明與創(chuàng)建分開(kāi)為了避免失去控制,一般將構(gòu)造函數(shù)的聲明與創(chuàng)建分開(kāi)處理。處理。 4.3.1 方法概述方法概述4.3 方法 Java程序是由一個(gè)個(gè)類(lèi)定義組成的,類(lèi)有兩個(gè)部分:程序是由一個(gè)個(gè)類(lèi)定義組成的,類(lèi)有兩個(gè)部分:屬性和方法。屬性描述類(lèi)是什么,屬性和方法。屬性描述類(lèi)是什么,方法描述類(lèi)做什么
24、方法描述類(lèi)做什么。任。任何對(duì)象都有獨(dú)立的內(nèi)存存儲(chǔ)它的屬性。類(lèi)的所有的對(duì)象共何對(duì)象都有獨(dú)立的內(nèi)存存儲(chǔ)它的屬性。類(lèi)的所有的對(duì)象共享存貯在內(nèi)存的方法。享存貯在內(nèi)存的方法。 換言之:方法是類(lèi)的主要組成部分。在一個(gè)類(lèi)中,程換言之:方法是類(lèi)的主要組成部分。在一個(gè)類(lèi)中,程序的作用體現(xiàn)在方法中。序的作用體現(xiàn)在方法中。 方法即是方法即是JAVA創(chuàng)建一個(gè)有名字的子程序。一個(gè)主方法創(chuàng)建一個(gè)有名字的子程序。一個(gè)主方法和若干個(gè)子方法構(gòu)成。主方法調(diào)用其他方法,其他方法間和若干個(gè)子方法構(gòu)成。主方法調(diào)用其他方法,其他方法間也可互相調(diào)用,同一個(gè)方法可被一個(gè)或多個(gè)方法調(diào)用任意也可互相調(diào)用,同一個(gè)方法可被一個(gè)或多個(gè)方法調(diào)用任意次。
25、次。 4.3.1 方法概述方法概述Java程序的基本結(jié)構(gòu)如下:程序的基本結(jié)構(gòu)如下:引入引入Java類(lèi)庫(kù);類(lèi)庫(kù);定義用戶類(lèi)定義用戶類(lèi)1 定義類(lèi)定義類(lèi)1的若干變量或?qū)ο螅旱娜舾勺兞炕驅(qū)ο螅?定義類(lèi)定義類(lèi)1的方法的方法1; 定義類(lèi)定義類(lèi)1的方法的方法2;定義類(lèi)定義類(lèi)1的方法的方法M1;定義用戶類(lèi)定義用戶類(lèi)2定義類(lèi)定義類(lèi)2的若干變量或?qū)ο螅旱娜舾勺兞炕驅(qū)ο螅憾x類(lèi)定義類(lèi)2的方法的方法1;定義類(lèi)定義類(lèi)2的方法的方法2;定義類(lèi)定義類(lèi)2的方法的方法M24.3.1 方法概述方法概述 Java語(yǔ)言的方法實(shí)現(xiàn)子任務(wù)處理時(shí),有下面幾語(yǔ)言的方法實(shí)現(xiàn)子任務(wù)處理時(shí),有下面幾個(gè)原則與規(guī)律:個(gè)原則與規(guī)律:(1)算法中需要細(xì)化
26、的步驟、程序中重復(fù)的代碼)算法中需要細(xì)化的步驟、程序中重復(fù)的代碼以及重載父類(lèi)方法都可以定義成類(lèi)的方法。以及重載父類(lèi)方法都可以定義成類(lèi)的方法。(2)界面清晰。)界面清晰。(3)大小適中。)大小適中。(4)方法有兩種:一種是標(biāo)準(zhǔn)方法,)方法有兩種:一種是標(biāo)準(zhǔn)方法,Java API提提供了豐富的類(lèi)和方法,這些方法提供了程序員所需供了豐富的類(lèi)和方法,這些方法提供了程序員所需的許多功能。另一種是用戶自定義的方法,以解決的許多功能。另一種是用戶自定義的方法,以解決用戶專(zhuān)門(mén)需要。用戶專(zhuān)門(mén)需要。(5)Java應(yīng)用程序中,程序的執(zhí)行從應(yīng)用程序中,程序的執(zhí)行從main類(lèi)開(kāi)始,類(lèi)開(kāi)始,調(diào)用其他方法后又回到調(diào)用其他方
27、法后又回到main類(lèi),在類(lèi),在main類(lèi)中結(jié)束類(lèi)中結(jié)束整個(gè)程序的運(yùn)行。整個(gè)程序的運(yùn)行。4.3.2 定義方法定義方法v1聲明方法頭聲明方法頭v2聲明方法體聲明方法體Java中聲明方法的語(yǔ)法如下:中聲明方法的語(yǔ)法如下: 修飾符修飾符 返回值類(lèi)型返回值類(lèi)型 方法名方法名(參數(shù)參數(shù)列表列表)throws 例外名例外名1,例外名,例外名2, 方法體:方法體: 局部變量聲明;局部變量聲明; 語(yǔ)句序列;語(yǔ)句序列; 類(lèi)的方法,又稱類(lèi)的方法,又稱為成員函數(shù),用為成員函數(shù),用來(lái)規(guī)定類(lèi)屬性上來(lái)規(guī)定類(lèi)屬性上的操作,實(shí)現(xiàn)類(lèi)的操作,實(shí)現(xiàn)類(lèi)的內(nèi)部功能的機(jī)的內(nèi)部功能的機(jī)制,同時(shí)也是類(lèi)制,同時(shí)也是類(lèi)與外界進(jìn)行交互與外界進(jìn)行交互
28、的重要窗口。的重要窗口。4.3.2 定義方法定義方法-聲明方法頭聲明方法頭1聲明方法頭聲明方法頭 方法頭一般由方法名、參數(shù)列表、返回類(lèi)型、方法頭一般由方法名、參數(shù)列表、返回類(lèi)型、方法修飾符和方法拋出的例外五部分組成。方法修飾符和方法拋出的例外五部分組成。(1)方法名可以是任何有效的標(biāo)識(shí)符,命名規(guī)則與標(biāo)識(shí)符命名規(guī)則相同。(2)類(lèi)型說(shuō)明符用來(lái)指定方法返回值的類(lèi)型,方法最多只能返回一個(gè)值。(3)參數(shù)列表是方法的輸入接口,它列出了一系列形式參數(shù)的類(lèi)型和名稱,在方法參數(shù)表的右括號(hào)后加一個(gè)分號(hào)是語(yǔ)法錯(cuò)誤。參數(shù)表以逗號(hào)為分隔符,其中包含了方法被調(diào)用時(shí)傳遞給方法的參數(shù)說(shuō)明。對(duì)于方法定義中的每一個(gè)參數(shù),方法調(diào)用
29、時(shí)必須有一個(gè)參量與之對(duì)應(yīng),而且該參量的類(lèi)型必須與對(duì)應(yīng)參數(shù)類(lèi)型相一致。4.3.2 定義方法定義方法-聲明方法體聲明方法體方法頭定義了方法的性質(zhì),方法體則定義了方法的具體內(nèi)容。方法頭定義了方法的性質(zhì),方法體則定義了方法的具體內(nèi)容。 方法體通常起到兩種作用,一是圍繞類(lèi)的屬性進(jìn)行各種操作;方法體通常起到兩種作用,一是圍繞類(lèi)的屬性進(jìn)行各種操作;二是與其他的類(lèi)與對(duì)象進(jìn)行數(shù)據(jù)交流、消息傳遞等操作。二是與其他的類(lèi)與對(duì)象進(jìn)行數(shù)據(jù)交流、消息傳遞等操作。在一個(gè)方法中定義另一個(gè)方法將產(chǎn)生語(yǔ)法錯(cuò)誤。在一個(gè)方法中定義另一個(gè)方法將產(chǎn)生語(yǔ)法錯(cuò)誤。(1)最好避免局部變量)最好避免局部變量“屏蔽屏蔽”實(shí)例變量,在一個(gè)類(lèi)中不使實(shí)例
30、變量,在一個(gè)類(lèi)中不使用同名標(biāo)識(shí)符就可以做到這一點(diǎn);方法調(diào)用中參數(shù)用來(lái)傳遞數(shù)用同名標(biāo)識(shí)符就可以做到這一點(diǎn);方法調(diào)用中參數(shù)用來(lái)傳遞數(shù)值、傳遞引用,同時(shí)方法還可以嵌套、遞歸調(diào)用。值、傳遞引用,同時(shí)方法還可以嵌套、遞歸調(diào)用。(2)方法體中如果指定了非)方法體中如果指定了非void的返回值類(lèi)型,方法中就必的返回值類(lèi)型,方法中就必須包含一條須包含一條return語(yǔ)句保證任何情況下都有返回?cái)?shù)值,語(yǔ)句保證任何情況下都有返回?cái)?shù)值,return語(yǔ)句后面語(yǔ)句后面(不能跟任何表達(dá)式不能跟任何表達(dá)式?);4.3.2 定義方法定義方法-聲明方法體聲明方法體例如下面的語(yǔ)句為部門(mén)類(lèi)例如下面的語(yǔ)句為部門(mén)類(lèi)Department定
31、義了若干方法:定義了若干方法:Class Department int m_ DeptNo; 部門(mén)編號(hào)部門(mén)編號(hào) String m_DeptName; 部門(mén)名稱部門(mén)名稱 int m_DeptTotalEmp;部門(mén)雇員數(shù)部門(mén)雇員數(shù) ManagerEmployee m_DeptMgr; 部門(mén)主管部門(mén)主管 int getDeptNo( ) 獲取當(dāng)前對(duì)象的部門(mén)號(hào)獲取當(dāng)前對(duì)象的部門(mén)號(hào) return _DeptNo; 返回這個(gè)對(duì)象的部門(mén)號(hào)返回這個(gè)對(duì)象的部門(mén)號(hào) v4.3.3 方法的調(diào)用方法的調(diào)用v1系統(tǒng)調(diào)用方法系統(tǒng)調(diào)用方法v2程序調(diào)用方法程序調(diào)用方法 Java語(yǔ)言中調(diào)用方法有兩類(lèi):語(yǔ)言中調(diào)用方法有兩類(lèi): 一類(lèi)
32、是需要程序書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用命令來(lái)調(diào)用的方法,一類(lèi)是需要程序書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用命令來(lái)調(diào)用的方法,稱為程序調(diào)用方法,例如稱為程序調(diào)用方法,例如isPfime (); 另一類(lèi)是運(yùn)行過(guò)程中系統(tǒng)自動(dòng)調(diào)用的方法,稱為系統(tǒng)方另一類(lèi)是運(yùn)行過(guò)程中系統(tǒng)自動(dòng)調(diào)用的方法,稱為系統(tǒng)方法,例如我們前面程序中的法,例如我們前面程序中的action()、paint()、init()等。這等。這兩類(lèi)方法的定義和使用原則有很大差異。兩類(lèi)方法的定義和使用原則有很大差異。 注意:系統(tǒng)調(diào)用方法的最大特點(diǎn):不需要在程序里書(shū)寫(xiě)專(zhuān)門(mén)的調(diào)用方法的命令v4.3.3 方法的調(diào)用方法的調(diào)用 在類(lèi)中調(diào)用類(lèi)自身的方法,可以直接使用這個(gè)方法的在類(lèi)中調(diào)用類(lèi)自身的
33、方法,可以直接使用這個(gè)方法的名稱;調(diào)用其他對(duì)象或類(lèi)的方法,則需要使用該對(duì)象或類(lèi)名稱;調(diào)用其他對(duì)象或類(lèi)的方法,則需要使用該對(duì)象或類(lèi)為前綴。例如在為前綴。例如在isSameDept( )方法中,語(yǔ)句方法中,語(yǔ)句 if(getDeptNo( )dgetDeptNo( )中通過(guò)中通過(guò)getDeptNo( )調(diào)用當(dāng)前對(duì)象自身的方法并獲得當(dāng)前對(duì)調(diào)用當(dāng)前對(duì)象自身的方法并獲得當(dāng)前對(duì)象的部門(mén)號(hào),通過(guò)象的部門(mén)號(hào),通過(guò)dgetDeptNo( )調(diào)用形式參數(shù)調(diào)用形式參數(shù)d的方法獲的方法獲得得d的部門(mén)編號(hào)。這里的形式參數(shù)的部門(mén)編號(hào)。這里的形式參數(shù)d也是一個(gè)也是一個(gè)Depamnent類(lèi)類(lèi)的對(duì)象。的對(duì)象。v4.3.3 方法
34、的調(diào)用方法的調(diào)用(實(shí)例實(shí)例)boolean setDeptNo(int NewNo) /把當(dāng)前部門(mén)號(hào)重新設(shè)置稱參數(shù)值把當(dāng)前部門(mén)號(hào)重新設(shè)置稱參數(shù)值 if( NewNo 0) /若給出的新部門(mén)號(hào)合法若給出的新部門(mén)號(hào)合法 m_DeptNo=NewNo;/修改類(lèi)屬性修改類(lèi)屬性m_DeptNo return true; /返回返回true,聲明部門(mén)編號(hào)修改成功聲明部門(mén)編號(hào)修改成功 else return false; /若形式參數(shù)給出新部門(mén)號(hào)非法,返回若形式參數(shù)給出新部門(mén)號(hào)非法,返回false 4.3.4 Java API中的方法中的方法 1Math類(lèi)的方法類(lèi)的方法2Math方法的調(diào)用實(shí)例方法的調(diào)用實(shí)例
35、 在Java中,Java API(Application Program Interface,也稱為Java類(lèi)庫(kù))提供了豐富的類(lèi)和方法,可以執(zhí)行常見(jiàn)的算術(shù)運(yùn)算、字符串操作、字符操作、輸入輸出、錯(cuò)誤檢查等操作。4.3.4 Java API中的方法中的方法-Math類(lèi)的方法類(lèi)的方法 方法方法說(shuō)明說(shuō)明方法方法說(shuō)明說(shuō)明abs(x)x的絕對(duì)值的絕對(duì)值(這個(gè)方法還有這個(gè)方法還有float,int和和long型值的版本型值的版本)max(x,y)取取x和和y中較大者。中較大者。ceil(x)不小于不小于x的最小整數(shù)的最小整數(shù)(向上取整向上取整)min (x,y)取取x和和y中較小者。中較小者。cos(x)x
36、的余弦函數(shù)值的余弦函數(shù)值(x以弧度為單以弧度為單位位)pow (x,y)x的的y次冪次冪exp(x)指數(shù)方法指數(shù)方法e的的x次冪次冪sin (x)x的正弦函數(shù)值的正弦函數(shù)值(x以弧度為單位以弧度為單位)floor(x)不大于不大于x的最大整數(shù)的最大整數(shù)(向下取整向下取整)sqrt (x)x的平方根的平方根log(x)x的自然對(duì)數(shù)的自然對(duì)數(shù)(以以e為底為底) 4.3.4 Java API中的方法中的方法-Math方法的調(diào)用實(shí)例方法的調(diào)用實(shí)例 調(diào)用方法的一般格式是先寫(xiě)方法名,然后是左括號(hào),調(diào)用方法的一般格式是先寫(xiě)方法名,然后是左括號(hào),接著是參數(shù)(接著是參數(shù)(argument)或由逗號(hào)分隔的參數(shù)表,
37、最或由逗號(hào)分隔的參數(shù)表,最后是右括號(hào)。例如,要計(jì)算并且打印出后是右括號(hào)。例如,要計(jì)算并且打印出900的平方根,的平方根,調(diào)用方法的語(yǔ)句格式:調(diào)用方法的語(yǔ)句格式:System.out.prtntln(Math.sqrt(900);注意,所有Math類(lèi)方法的調(diào)用必須采用方法名前冠以類(lèi)名Math和點(diǎn)(.)運(yùn)算符的形式?!纠?4.2】擲一個(gè)六面骰子6000次的程序 4.4 訪問(wèn)控制符訪問(wèn)控制符 Java推出了“訪問(wèn)控制修飾符”的概念,允許庫(kù)創(chuàng)建者聲明哪些東西是客戶程序員可以使用的,哪些是不可使用的。這種訪問(wèn)控制的級(jí)別在“最大訪問(wèn)”和“最小訪問(wèn)”的范圍之間,分別包括:public,“defaut”(無(wú)關(guān)
38、鍵字),protected以及private。下面的列表說(shuō)明訪問(wèn)控制修飾符含義: 類(lèi)的訪問(wèn)控制修飾符(一種符號(hào))類(lèi)的訪問(wèn)控制修飾符(一種符號(hào)) public公共訪問(wèn)公共訪問(wèn)屬性與方法的訪問(wèn)控制修飾符(四種符號(hào))屬性與方法的訪問(wèn)控制修飾符(四種符號(hào)) 符號(hào)符號(hào)publicprotectedprivate protectedprivate 含義含義公共訪問(wèn)公共訪問(wèn)保護(hù)訪問(wèn)保護(hù)訪問(wèn)私有保護(hù)訪問(wèn)私有保護(hù)訪問(wèn)私有訪問(wèn)私有訪問(wèn) 4.4 訪問(wèn)控制符訪問(wèn)控制符v4.4.1 公共訪問(wèn)控制符公共訪問(wèn)控制符public Java中類(lèi)的訪問(wèn)控制符只有一個(gè):public,即公共的。一個(gè)類(lèi)被聲明為公共類(lèi),表明它可以被所有
39、的其他類(lèi)所訪問(wèn)和引用,這里的訪問(wèn)和引用是指這個(gè)類(lèi)作為整體是可見(jiàn)和可使用的,程序的其他部分可以創(chuàng)建這個(gè)類(lèi)的對(duì)象、訪問(wèn)這個(gè)類(lèi)內(nèi)部可見(jiàn)的成員變量和調(diào)用它的可見(jiàn)的方法。 一個(gè)類(lèi)作為整體對(duì)程序的其他部分可見(jiàn),并不能代表類(lèi)內(nèi)的所有屬性和方法也同時(shí)對(duì)程序的其他部分可見(jiàn),前者只是后者的必要條件,類(lèi)的屬性和方法能否為所有其他類(lèi)所訪問(wèn),還要看這些屬性和方法自己的訪問(wèn)控制符。 實(shí)例字段應(yīng)用public關(guān)鍵字,這是一種非常糟糕的做法,破壞封裝。4.4.2 缺省訪問(wèn)控制符缺省訪問(wèn)控制符 假如一個(gè)類(lèi)沒(méi)有訪問(wèn)控制符,說(shuō)明它具有缺省的訪問(wèn)控制特性。這種缺省的訪問(wèn)控制權(quán)規(guī)定該類(lèi)只能被同一個(gè)包中的類(lèi)訪問(wèn)和引用,而不可以被其他包中
40、的類(lèi)使用,這種訪問(wèn)特性稱為包訪問(wèn)性。通過(guò)聲明類(lèi)的訪問(wèn)控制符可以使整個(gè)程序結(jié)構(gòu)清晰、嚴(yán)謹(jǐn),減少可能產(chǎn)生類(lèi)間干擾和錯(cuò)誤。 4.4.3 私有訪問(wèn)控制符私有訪問(wèn)控制符private 用private修飾的屬性或方法只能被該類(lèi)自身所訪問(wèn)和修改,而不能被任何其他類(lèi),包括該類(lèi)的子類(lèi),來(lái)獲取和引用。 v1. 對(duì)私有數(shù)據(jù)訪問(wèn)的方法對(duì)私有數(shù)據(jù)訪問(wèn)的方法例如有三個(gè)實(shí)例字段,它們含有在Employee類(lèi)的實(shí)例內(nèi)部被操作的數(shù)據(jù)。private string name;private double salary;private Date hireDay; private(私有的)關(guān)鍵字用來(lái)確保可以訪問(wèn)這些實(shí)例字段的只能是
41、Employee類(lèi)本身的方法。 4.4.3 私有訪問(wèn)控制符私有訪問(wèn)控制符privatev2. 私有方法私有方法 在實(shí)現(xiàn)類(lèi)時(shí),我們使所有的數(shù)據(jù)字段都是私有的,因?yàn)楣_(kāi)的數(shù)據(jù)是危險(xiǎn)的。對(duì)于方法又是什么情況呢 ?雖然大多數(shù)方法是公開(kāi)的,但是私有方法也經(jīng)常使用。這些方法只能被同一個(gè)分離的方法。 總起來(lái)說(shuō),在下面的情況下可以選擇私有方法:(1)與類(lèi)的使用者無(wú)關(guān)的那些方法。 (2)如果類(lèi)的實(shí)現(xiàn)改變了,不容易維護(hù)的那些方法。 4.4.4 保護(hù)訪問(wèn)控制符保護(hù)訪問(wèn)控制符protectedv 用用protected修飾的成員變量可以被三種類(lèi)所引修飾的成員變量可以被三種類(lèi)所引用:該類(lèi)自身、與它在同一個(gè)包中的其他類(lèi)、
42、在其用:該類(lèi)自身、與它在同一個(gè)包中的其他類(lèi)、在其他包中的該類(lèi)的子類(lèi)。使用他包中的該類(lèi)的子類(lèi)。使用protected修飾符的主要修飾符的主要作用是允許其他包中的它的子類(lèi)來(lái)訪問(wèn)父類(lèi)的特定作用是允許其他包中的它的子類(lèi)來(lái)訪問(wèn)父類(lèi)的特定屬性。屬性。v protected關(guān)鍵字為我們引入了一種名為關(guān)鍵字為我們引入了一種名為“繼承繼承”的概念,它以現(xiàn)有的類(lèi)為基礎(chǔ),并在其中加入新的的概念,它以現(xiàn)有的類(lèi)為基礎(chǔ),并在其中加入新的成員,同時(shí)不會(huì)對(duì)現(xiàn)有的類(lèi)產(chǎn)生影響成員,同時(shí)不會(huì)對(duì)現(xiàn)有的類(lèi)產(chǎn)生影響我們將這我們將這種現(xiàn)有的類(lèi)稱為種現(xiàn)有的類(lèi)稱為“基礎(chǔ)類(lèi)基礎(chǔ)類(lèi)”或者或者“基本類(lèi)基本類(lèi)”(Base Class)。)。亦可改變那
43、個(gè)類(lèi)現(xiàn)有成員的行為。對(duì)于從亦可改變那個(gè)類(lèi)現(xiàn)有成員的行為。對(duì)于從一個(gè)現(xiàn)有類(lèi)的繼承,我們說(shuō)自己的新類(lèi)一個(gè)現(xiàn)有類(lèi)的繼承,我們說(shuō)自己的新類(lèi)“擴(kuò)展擴(kuò)展”(extends)了那個(gè)現(xiàn)有的類(lèi)。了那個(gè)現(xiàn)有的類(lèi)。 v4.4.5 私有保護(hù)訪問(wèn)控制符私有保護(hù)訪問(wèn)控制符private protected private和protected按順序連用構(gòu)成一個(gè)完整的訪問(wèn)控制符:私有保護(hù)訪問(wèn)控制符。用privateprotected修飾的成員變量可以被兩種類(lèi)訪問(wèn)和引用,一種是該類(lèi)本身,一種是該類(lèi)的所有子類(lèi),不論這些子類(lèi)是與該類(lèi)在同一個(gè)包里,還是處于其他的包中。 相對(duì)于protected,privateprotected修飾符
44、把同一包內(nèi)的非子類(lèi)排除在可訪問(wèn)的范圍之外,使得成員變量更專(zhuān)有于具有明確繼承關(guān)系的類(lèi),而不是松散地組合在一起的包。 訪問(wèn)控制符訪問(wèn)控制符 當(dāng)前當(dāng)前類(lèi)類(lèi) (D)當(dāng)前類(lèi)的所有子當(dāng)前類(lèi)的所有子類(lèi)類(lèi)(C)當(dāng)前類(lèi)所在的當(dāng)前類(lèi)所在的包包(B) 所有類(lèi)所有類(lèi)(A) privateprotected* publicprivate protected A:所所有有類(lèi)類(lèi) D:本本類(lèi)類(lèi) B:包包中中的的類(lèi)類(lèi) C:所所有有子子類(lèi)類(lèi) E:包包中中 子子類(lèi)類(lèi) 圖圖4-3 程序中的訪問(wèn)控制區(qū)域程序中的訪問(wèn)控制區(qū)域4.5靜態(tài)修飾符、靜態(tài)字段和方法v4.5.1 靜態(tài)修飾符靜態(tài)修飾符 (2)另一種情形是我們需要一個(gè)特殊的方法,它沒(méi)
45、有與這個(gè)類(lèi)的任何對(duì)象關(guān)聯(lián)。也就是說(shuō),即使沒(méi)有創(chuàng)建對(duì)象,也需要一個(gè)能調(diào)用的方法。 static一項(xiàng)重要的用途就是幫助我們?cè)诓槐貏?chuàng)建對(duì)象的前提下調(diào)用那個(gè)方法。 4.5靜態(tài)修飾符、靜態(tài)字段和方法v4.5.1 靜態(tài)修飾符靜態(tài)修飾符 static稱為靜態(tài)修飾符,它可以修飾類(lèi)中的屬性和方法。使用static(靜態(tài))關(guān)鍵字,可滿足兩方面的要求:(1)一種情形是只想用一個(gè)存儲(chǔ)區(qū)域來(lái)保存一個(gè)特定的數(shù)據(jù)無(wú)論要?jiǎng)?chuàng)建多少個(gè)對(duì)象,甚至根本不創(chuàng)建對(duì)象;被static修飾的屬性稱為靜態(tài)屬性,這類(lèi)屬性一個(gè)最本質(zhì)的特點(diǎn)是:它們是類(lèi)的屬性,而不屬于任何一個(gè)類(lèi)的具體對(duì)象。換句話說(shuō),對(duì)于該類(lèi)的任何一個(gè)具體對(duì)象而言,靜態(tài)屬性是一個(gè)公共
46、的存儲(chǔ)單元,任何一個(gè)類(lèi)的對(duì)象訪問(wèn)它時(shí),取到的都是相同的數(shù)值,同樣任何一個(gè)類(lèi)的對(duì)象去修改它時(shí),也都是在對(duì)同一個(gè)內(nèi)存單元做操作。v4.5.2 靜態(tài)字段靜態(tài)字段 如果把一個(gè)字段定義為如果把一個(gè)字段定義為static.(靜態(tài)的),那么在一個(gè)類(lèi)中只能有靜態(tài)的),那么在一個(gè)類(lèi)中只能有一個(gè)這類(lèi)字段。一個(gè)這類(lèi)字段。 v4.5.3 靜態(tài)常量靜態(tài)常量 靜態(tài)變量是很少見(jiàn)的。然而,靜態(tài)常量卻很普遍。例如,靜態(tài)變量是很少見(jiàn)的。然而,靜態(tài)常量卻很普遍。例如,MathMath類(lèi)中定類(lèi)中定義了一個(gè)靜態(tài)常量:義了一個(gè)靜態(tài)常量:public class Mathpublic class Math public static fi
47、nal double PI=3.1.4159265358979323846;public static final double PI=3.1.4159265358979323846; v4.5.4 靜態(tài)方法靜態(tài)方法v4.5.5 main方法方法4.5.4 靜態(tài)方法靜態(tài)方法 聲明一個(gè)方法為聲明一個(gè)方法為static至少有三重含義:至少有三重含義:(1)使用這個(gè)方法時(shí),應(yīng)該使用類(lèi)名做前綴,而不是某一)使用這個(gè)方法時(shí),應(yīng)該使用類(lèi)名做前綴,而不是某一個(gè)具體的對(duì)象名;個(gè)具體的對(duì)象名;(2)static的方法是屬于某個(gè)對(duì)象的方法,在這個(gè)對(duì)象創(chuàng)建的方法是屬于某個(gè)對(duì)象的方法,在這個(gè)對(duì)象創(chuàng)建時(shí)對(duì)象的方法在內(nèi)存
48、中擁有自己專(zhuān)用的代碼段;而時(shí)對(duì)象的方法在內(nèi)存中擁有自己專(zhuān)用的代碼段;而static的方法是屬于整個(gè)類(lèi)的,它在內(nèi)存中的代碼段將隨著類(lèi)的方法是屬于整個(gè)類(lèi)的,它在內(nèi)存中的代碼段將隨著類(lèi)的定義而分配和裝載,不被任何一個(gè)對(duì)象專(zhuān)有;的定義而分配和裝載,不被任何一個(gè)對(duì)象專(zhuān)有;(3)由于)由于static方法是屬于整個(gè)類(lèi)的,所以它不能操縱和處方法是屬于整個(gè)類(lèi)的,所以它不能操縱和處理屬于某個(gè)對(duì)象的成員變量,而只能處理屬于整個(gè)類(lèi)的理屬于某個(gè)對(duì)象的成員變量,而只能處理屬于整個(gè)類(lèi)的成員變量。成員變量。 4.5.5 main方法方法 main方法并不對(duì)任何對(duì)象施加操作。實(shí)際上,當(dāng)程方法并不對(duì)任何對(duì)象施加操作。實(shí)際上,當(dāng)
49、程序開(kāi)始執(zhí)行時(shí),還不存在任何對(duì)象。靜態(tài)方法被執(zhí)行,序開(kāi)始執(zhí)行時(shí),還不存在任何對(duì)象。靜態(tài)方法被執(zhí)行,并構(gòu)造程序所需的對(duì)象。并構(gòu)造程序所需的對(duì)象。 提示提示 每個(gè)類(lèi)都可以有一個(gè)每個(gè)類(lèi)都可以有一個(gè)main方法。這是對(duì)類(lèi)進(jìn)行方法。這是對(duì)類(lèi)進(jìn)行單元測(cè)試的一個(gè)很方便技巧。單元測(cè)試的一個(gè)很方便技巧。 4.6抽象類(lèi)與抽象方法v4.6.1 抽象類(lèi)抽象類(lèi)v當(dāng)一個(gè)類(lèi)被聲明為abstract時(shí),這個(gè)類(lèi)被稱為是抽象類(lèi)。所謂抽象類(lèi)就是沒(méi)有具體實(shí)例對(duì)象的類(lèi)。v針對(duì)這個(gè)問(wèn)題,Java專(zhuān)門(mén)提供了一種機(jī)制,名為“抽象方法”。它屬于一種不完整的方法,只含有一個(gè)聲明,沒(méi)有方法主體。下面是抽象方法聲明時(shí)采用的語(yǔ)法:vabstract
50、void X();v人類(lèi)就是一個(gè)典型的抽象類(lèi)。我們知道,類(lèi)是對(duì)象的集合,對(duì)象是類(lèi)的實(shí)例化,而人類(lèi)這個(gè)類(lèi)卻不存在一個(gè)僅屬于它的具體對(duì)象。 abstract是抽象修飾符,可以用來(lái)修飾類(lèi)或方法。v4.6.2 抽象方法抽象方法 作為類(lèi)方法修飾符,作為類(lèi)方法修飾符,abstract則聲明了一則聲明了一種僅有方法頭,而沒(méi)有具體的方法體和操作種僅有方法頭,而沒(méi)有具體的方法體和操作實(shí)現(xiàn)的抽象方法。實(shí)現(xiàn)的抽象方法。 可見(jiàn),可見(jiàn),abstractabstract方法只有方法頭的聲明,方法只有方法頭的聲明,而用一個(gè)分號(hào)來(lái)代替方法體的定義:至于方而用一個(gè)分號(hào)來(lái)代替方法體的定義:至于方法體的具體實(shí)現(xiàn),那是由當(dāng)前類(lèi)的不同
51、子類(lèi)法體的具體實(shí)現(xiàn),那是由當(dāng)前類(lèi)的不同子類(lèi)在它們各自的類(lèi)定義中完成的。在它們各自的類(lèi)定義中完成的。 需要特別注意的是,所有的抽象方法,都必須需要特別注意的是,所有的抽象方法,都必須存在于抽象類(lèi)之中。存在于抽象類(lèi)之中。 除了抽象方法,抽象類(lèi)也可以有具體的數(shù)據(jù)和除了抽象方法,抽象類(lèi)也可以有具體的數(shù)據(jù)和方法。例如,方法。例如,PersonPerson類(lèi)存儲(chǔ)人的名字并且用一個(gè)類(lèi)存儲(chǔ)人的名字并且用一個(gè)具體的方法來(lái)返回它。具體的方法來(lái)返回它。 在在Java編程語(yǔ)言中抽象方法是非常重要的概念。編程語(yǔ)言中抽象方法是非常重要的概念。在接口里你會(huì)大量的用到它。在接口里你會(huì)大量的用到它。 4.7最終類(lèi)、最終屬性、最
52、終方法與終結(jié)器final是最終修飾符,它可以修飾類(lèi)、屬性和方法。另外終結(jié)器的關(guān)鍵字與final很相近,一并介紹。4.7.1 最終類(lèi)最終類(lèi) 如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不能既被聲明為abstract的,又被聲明為final的。被定義成final的類(lèi),通常是一些有特殊作用的、用來(lái)完成標(biāo)準(zhǔn)功能的類(lèi),將一個(gè)類(lèi)定義為final則可以將它的內(nèi)容、屬性和功能固定下來(lái),與它的類(lèi)名形成穩(wěn)定的映射關(guān)系,從而保證引用這個(gè)類(lèi)時(shí)所實(shí)現(xiàn)的功能是準(zhǔn)確無(wú)誤的。 v4.7.2 最終屬性最終屬性 無(wú)論無(wú)論static還是還是final字段,都只能存儲(chǔ)一個(gè)數(shù)據(jù),字段,都
53、只能存儲(chǔ)一個(gè)數(shù)據(jù),而且不得改變。而且不得改變。 許多程序設(shè)計(jì)語(yǔ)言都有自己的辦法告訴編譯器某許多程序設(shè)計(jì)語(yǔ)言都有自己的辦法告訴編譯器某個(gè)數(shù)據(jù)是個(gè)數(shù)據(jù)是“常數(shù)常數(shù)”。常數(shù)主要應(yīng)用于下述兩個(gè)方面:。常數(shù)主要應(yīng)用于下述兩個(gè)方面:(1)編譯期常數(shù),它永遠(yuǎn)不會(huì)改變;)編譯期常數(shù),它永遠(yuǎn)不會(huì)改變;(2)在運(yùn)行期初始化的一個(gè)值,我們不希望它發(fā)生)在運(yùn)行期初始化的一個(gè)值,我們不希望它發(fā)生變化。變化。 可以把一個(gè)實(shí)例字段定義為可以把一個(gè)實(shí)例字段定義為final(不能改變的不能改變的)。在對(duì)象被構(gòu)造時(shí),這種字段必須被初始化。即,必在對(duì)象被構(gòu)造時(shí),這種字段必須被初始化。即,必須保證在每一個(gè)構(gòu)造函數(shù)結(jié)束之前其值已被設(shè)定
54、。須保證在每一個(gè)構(gòu)造函數(shù)結(jié)束之前其值已被設(shè)定。以后字段的值不能改變。以后字段的值不能改變。4.7.3 最終方法最終方法 之所以要使用之所以要使用final方法,可能是出于對(duì)兩方面理由的考方法,可能是出于對(duì)兩方面理由的考慮。慮。 第一個(gè)是為方法第一個(gè)是為方法“上鎖上鎖”,防止任何繼承類(lèi)改變它的本來(lái),防止任何繼承類(lèi)改變它的本來(lái)含義。設(shè)計(jì)程序時(shí),若希望一個(gè)方法的行為在繼承期間保持含義。設(shè)計(jì)程序時(shí),若希望一個(gè)方法的行為在繼承期間保持不變,而且不可被覆蓋或改寫(xiě),就可以采取這種做法。不變,而且不可被覆蓋或改寫(xiě),就可以采取這種做法。 采用采用final方法的第二個(gè)理由是程序執(zhí)行的效率方法的第二個(gè)理由是程序執(zhí)
55、行的效率。 4.8 本章小結(jié) v1.關(guān)于類(lèi)關(guān)于類(lèi)v必須要學(xué)會(huì)如何創(chuàng)建、引用和繼承已建立的類(lèi)。必須要學(xué)會(huì)如何創(chuàng)建、引用和繼承已建立的類(lèi)。Java程序程序的基本單位是類(lèi)。類(lèi)的定義可以看作是建立對(duì)象的原形。的基本單位是類(lèi)。類(lèi)的定義可以看作是建立對(duì)象的原形。你建立類(lèi)之后,就可用它來(lái)建立許多你需要的對(duì)象。你建立類(lèi)之后,就可用它來(lái)建立許多你需要的對(duì)象。Java把每一個(gè)可執(zhí)行的成分都變成類(lèi),使面向?qū)ο蟀l(fā)展到極點(diǎn)。把每一個(gè)可執(zhí)行的成分都變成類(lèi),使面向?qū)ο蟀l(fā)展到極點(diǎn)。v類(lèi)的基本定義方法如下:類(lèi)的基本定義方法如下:v修飾符修飾符 class 類(lèi)名類(lèi)名 extends 父類(lèi)父類(lèi) implements 接口名接口名vv 類(lèi)成員變量聲明類(lèi)成員變量聲明v 類(lèi)方法聲明類(lèi)方法聲明v2關(guān)于對(duì)象關(guān)于對(duì)象v 對(duì)象是類(lèi)的一個(gè)實(shí)例,類(lèi)是同種對(duì)象的抽象對(duì)象是類(lèi)的一個(gè)實(shí)例,類(lèi)是同種對(duì)象的抽象綜合,是創(chuàng)建對(duì)象的模板。在程序中創(chuàng)建綜合,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 油氣回收系統(tǒng)管理制度樣本
- 優(yōu)化橡膠產(chǎn)品成型技術(shù)操作流程
- 企業(yè)培訓(xùn)員工的課件
- 沉井施工勞務(wù)合作及質(zhì)量檢測(cè)服務(wù)合同
- 智能化個(gè)人信用貸款服務(wù)合同樣本
- 跨境電商采購(gòu)合同風(fēng)險(xiǎn)分析與應(yīng)對(duì)措施
- 年度銷(xiāo)售計(jì)劃方案
- 樓盤(pán)垃圾清理方案
- 餐飲業(yè)品牌授權(quán)入股合作框架協(xié)議
- 離婚協(xié)議書(shū)范本:財(cái)產(chǎn)分割與子女撫養(yǎng)協(xié)議細(xì)則
- 2025河南行政執(zhí)法資格考試模擬卷(含答案)
- 車(chē)輛掛名使用權(quán)轉(zhuǎn)讓與免責(zé)保障協(xié)議
- 2025年華僑港澳臺(tái)學(xué)生聯(lián)招考試英語(yǔ)試卷試題(含答案詳解)
- DL-T5706-2014火力發(fā)電工程施工組織設(shè)計(jì)導(dǎo)則
- JT-T 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程專(zhuān)項(xiàng)施工方案編制審查規(guī)程
- 機(jī)場(chǎng)FOD防范管理課件
- 機(jī)電安裝安全監(jiān)理實(shí)施細(xì)則
- 《中外音樂(lè)史》自學(xué)考試大綱(共6頁(yè))
- 氣體滅火打壓方案-七氟丙烷FM200
- 醫(yī)學(xué)生物化學(xué)課件PPT
- 淺談核電質(zhì)量保證體系建設(shè)
評(píng)論
0/150
提交評(píng)論