版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章
面向?qū)ο蠡A(chǔ)朱海波副教授1主要內(nèi)容:
1.面向?qū)ο蠡靖拍?.Java的類與對(duì)象3.成員變量與封裝4.成員方法2
理解面向?qū)ο缶幊痰幕靖拍盍私忸惖姆庋b方法如何創(chuàng)建類和對(duì)象了解成員變量和成員方法的特性學(xué)習(xí)使用OOP方式進(jìn)行程序設(shè)計(jì)
教學(xué)目的和要求:3重點(diǎn)與難點(diǎn)重點(diǎn):類和對(duì)象的概念,及實(shí)際應(yīng)用難點(diǎn): 類的設(shè)計(jì)4
4.1面向?qū)ο蟮幕靖拍?.2類4.3對(duì)象4.4方法4.5訪問(wèn)控制修飾符4.6靜態(tài)修飾符、靜態(tài)字段和方法4.7抽象類與抽象方法4.8最終類、最終屬性、最終方法與終結(jié)器本章小結(jié)目錄54.1面向?qū)ο蟾拍?、對(duì)象2、對(duì)象的封裝3、類和實(shí)例4、消息5、繼承6、對(duì)象之間的關(guān)系61、對(duì)象對(duì)象
(object):面向?qū)ο蠹夹g(shù)的核心。我們可以把我們所生活的真實(shí)世界(RealWorld)看成是由許多大小不同的對(duì)象所組成的。對(duì)象可以是有生命的個(gè)體,比如一個(gè)人或一只鳥(niǎo)。7對(duì)象對(duì)象也可以是無(wú)生命的個(gè)體,比如一輛汽車(chē)或一臺(tái)計(jì)算機(jī)。8對(duì)象對(duì)象還可以是一件抽象的概念,如天氣的變化或者鼠標(biāo)所產(chǎn)生的事件,或者是一個(gè)自然數(shù)。1239對(duì)象的屬性和行為環(huán)顧周?chē)氖澜?,任何地方都可以看到?duì)象,例如:人、狗、汽車(chē)、計(jì)算機(jī)、桌子、椅子等等。不管是有生命的對(duì)象還是無(wú)生命的對(duì)象,它們都有一些共同的特征:屬性和行為。10對(duì)象的屬性和行為例如,人有姓名、年齡、身高、職業(yè)等屬性,有工作、吃飯、運(yùn)動(dòng)等行為。而汽車(chē)有形狀、顏色、品牌等屬性,有啟動(dòng)、加速、剎車(chē)、轉(zhuǎn)彎等行為。11軟件對(duì)象軟件對(duì)象:現(xiàn)實(shí)世界中的對(duì)象在計(jì)算機(jī)中的抽象表示,即仿照現(xiàn)實(shí)對(duì)象而建立的。軟件對(duì)象也有狀態(tài)和行為,軟件對(duì)象用變量表示對(duì)象的狀態(tài)、用方法來(lái)實(shí)現(xiàn)對(duì)象的行為。一個(gè)軟件對(duì)象就是變量和相關(guān)方法的集合。軟件對(duì)象=變量+方法12軟件對(duì)象的特性對(duì)象名:唯一標(biāo)識(shí),區(qū)別于其它對(duì)象的標(biāo)志,例如car;變量:對(duì)象所處的狀態(tài),例如汽車(chē)行駛的速度;方法:通過(guò)改變對(duì)象的狀態(tài),來(lái)實(shí)現(xiàn)對(duì)象的行為,例如通過(guò)加速這個(gè)方法來(lái)改變汽車(chē)的速度;接口:與外界通信的通道。注意:今后,在不引起歧義的情況下,我們把軟件對(duì)象簡(jiǎn)稱為對(duì)象。13對(duì)象和實(shí)體的關(guān)系對(duì)象是對(duì)現(xiàn)實(shí)世界中實(shí)體的抽象Why?實(shí)體太復(fù)雜啦!How?取其關(guān)心的部分!What?對(duì)象是抽象的,對(duì)象是部分的!人抽象
142、對(duì)象的封裝一個(gè)對(duì)象的變量(狀態(tài))構(gòu)成這個(gè)對(duì)象的核心,一般不將其對(duì)外公布,而是將對(duì)變量進(jìn)行操作的方法對(duì)外公開(kāi),這樣變量就被隱藏起來(lái)。這種將對(duì)象的變量置于方法的保護(hù)之下的方式稱為封裝。變量方法外部訪問(wèn)152、對(duì)象的封裝例如:可以把汽車(chē)抽象成一個(gè)對(duì)象,用變量表示它當(dāng)前的狀態(tài),如速度、油量、所處的位置等,它的行為則可以有加速、剎車(chē)、換檔等。我們?cè)隈{駛汽車(chē)時(shí),只需要知道如何操作相應(yīng)的方法就可以了,不用考慮汽車(chē)內(nèi)部是如何實(shí)現(xiàn)諸如提速、剎車(chē)等行為。16封裝將對(duì)象的私有數(shù)據(jù)隱藏起來(lái),其他對(duì)象不能直接訪問(wèn)這些私有數(shù)據(jù),必須通過(guò)調(diào)用該對(duì)象的相關(guān)方法來(lái)間接訪問(wèn)。私有數(shù)據(jù)
方法
方法數(shù)據(jù)對(duì)象A對(duì)象B公有數(shù)據(jù)17對(duì)象封裝的好處通過(guò)將對(duì)象進(jìn)行封裝,能把對(duì)別的對(duì)象來(lái)說(shuō)并不重要的對(duì)象的實(shí)現(xiàn)細(xì)節(jié)隱蔽起來(lái),從而在使用一個(gè)對(duì)象時(shí),只需知道調(diào)用它的方法而無(wú)需知道該方法是如何實(shí)現(xiàn)的。(1)模塊化:一個(gè)對(duì)象的源代碼的編寫(xiě)和維護(hù)獨(dú)立于其他對(duì)象的源代碼,而且,對(duì)象的使用也很方便;(2)信息隱蔽:每個(gè)對(duì)象都有一個(gè)公共接口使得其他對(duì)象可以與其通信,但對(duì)象的私有信息和方法則由它自己維護(hù),并且改變這些私有信息和方法不會(huì)影響到使用它的其他對(duì)象。183、類在現(xiàn)實(shí)世界里,有許多同“種類”的對(duì)象。而這些同“種類”的對(duì)象可被歸類為一個(gè)“類”。例如,我們可將世界上所有的動(dòng)物歸為動(dòng)物類,所有的汽車(chē)歸類為汽車(chē)類。動(dòng)物類汽車(chē)類19對(duì)象與類classTaxi{intcolor;intdoor_number;
intspeed;
voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}
類抽象軟件對(duì)象歸類現(xiàn)實(shí)生活中的對(duì)象20類的概念類是對(duì)多個(gè)具有相似行為的對(duì)象的一種抽象,描述了屬于該類型的所有對(duì)象的性質(zhì),即類定義了所有某種類型的對(duì)象的共有的變量和方法。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類是程序的基本單元。Athlete21類與實(shí)例
(instance)汽車(chē)類有些共同的狀態(tài)(汽缸排氣量、排檔數(shù)、顏色、輪胎數(shù)……)和行為(換檔、開(kāi)燈、剎車(chē)……),但每一臺(tái)汽車(chē)有個(gè)別的狀態(tài)和方法可以不同于其他汽車(chē)。你的汽車(chē)只是這世界中許多汽車(chē)中的一個(gè)。我們就稱你的汽車(chē)對(duì)象是汽車(chē)類中的一個(gè)實(shí)例(instance)。汽車(chē)類(class)實(shí)例(instance)new你的車(chē)22對(duì)象和類的關(guān)系類是同類對(duì)象的集合和抽象{學(xué)生A、學(xué)生B……}學(xué)生類對(duì)象是類的一個(gè)實(shí)例化學(xué)生類學(xué)生A234、消息(message)單獨(dú)一個(gè)對(duì)象一般沒(méi)有什么用處,在大的應(yīng)用程序中通常包括許多對(duì)象,并通過(guò)這些對(duì)象之間的交互來(lái)完成一個(gè)復(fù)雜的功能。例如在多媒體教室教學(xué)活動(dòng)中,包括教師對(duì)象、學(xué)生對(duì)象、計(jì)算機(jī)對(duì)象、投影儀對(duì)象、擴(kuò)音器對(duì)象以及桌子等對(duì)象,通過(guò)這些對(duì)象之間的交互才能順利完成我們的教學(xué)活動(dòng)。24通過(guò)各個(gè)對(duì)象之間的交互,程序就可以實(shí)現(xiàn)更高級(jí)的功能以及更復(fù)雜的行為。軟件對(duì)象是通過(guò)相互間傳遞消息來(lái)實(shí)現(xiàn)交互的。對(duì)象B對(duì)象Amessage25當(dāng)對(duì)象A想讓對(duì)象B執(zhí)行某項(xiàng)任務(wù)時(shí),對(duì)象A就向?qū)ο驜傳遞消息。有時(shí),接受消息的對(duì)象需要了解更多的信息,以明確它該做什么,這時(shí)就需要傳遞一些參數(shù)。例如,要使汽車(chē)加速,必須發(fā)給它一個(gè)消息,告訴它做何種動(dòng)作(即加速),以及實(shí)現(xiàn)這個(gè)動(dòng)作所需的參數(shù)(即需要達(dá)到的速度等)。發(fā)送消息的實(shí)質(zhì)就是要調(diào)用接受消息的對(duì)象的方法,所以發(fā)送消息可分為三個(gè)步驟:(1)確定接受消息的對(duì)象;(2)確定調(diào)用對(duì)象的哪個(gè)方法;(3)傳遞此方法所需要的參數(shù)。26
一個(gè)消息由3個(gè)元素所組成:1.消息目標(biāo)對(duì)象(你的汽車(chē))。2.執(zhí)行方法的名字(換檔)。3.執(zhí)行方法所需用的參數(shù)(parameters)(低、高速檔)。消息的好處
1.一個(gè)對(duì)象的行為是通過(guò)它的方法來(lái)表達(dá),所以消息傳遞支持所有對(duì)象之間可能的交互。2.發(fā)送消息的對(duì)象與接受消息的對(duì)象不需要在相同的程序中,或者相同的機(jī)器上。275、子類和繼承什么是子類?子類是作為另一個(gè)類的擴(kuò)充或修正所定義的一個(gè)類。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass28繼承的概念什么是繼承?繼承即子類可以利用父類中定義的方法和變量,就像它們屬于子類本身一樣。classCar{intcolor_number;intdoor_number;intspeed;
push_break(){…}add_oil(){…}}
classTrash_CarextendsCar{doubleamount;fill_trash(){…}}29類層級(jí)(classhierarchy)類的繼承關(guān)系不僅僅只是一層關(guān)系,它可以有好幾層。這種樹(shù)狀關(guān)系,我們稱作類層級(jí)(classhierarchy)。至于層級(jí)數(shù)可依照實(shí)際需要而定
。30類層級(jí)(classhierarchy)
子類繼承了父類的變量及方法。如此便可重復(fù)使用父類中的變量及方法。這就是繼承的好處。不僅如此,子類不受父類的限制,還可增加自己的變量及方法。例如在出租車(chē)中加了一個(gè)無(wú)線電調(diào)用方法,或是在轎車(chē)?yán)锛恿艘粋€(gè)衛(wèi)星導(dǎo)航方法。都是按子類特殊的需要新加的。因此,我們可以發(fā)現(xiàn)越下層的類,其行為越特別。316、對(duì)象之間的關(guān)系包含繼承關(guān)聯(lián)32包含關(guān)系汽車(chē)對(duì)象輪子對(duì)象發(fā)動(dòng)機(jī)對(duì)象變速箱對(duì)象座位對(duì)象……33繼承關(guān)系交通工具對(duì)象車(chē)對(duì)象汽車(chē)對(duì)象公交汽車(chē)對(duì)象34關(guān)聯(lián)關(guān)系老師對(duì)象vs學(xué)生對(duì)象汽車(chē)對(duì)象vs加油站對(duì)象茶杯對(duì)象vs茶壺對(duì)象354.2類
類是現(xiàn)實(shí)世界某些對(duì)象的共同特征(屬性和操作)的表示,對(duì)象是類的實(shí)例。類的屬性:類中所包含的各項(xiàng)數(shù)據(jù),如變量或其他類的對(duì)象,一般稱為類的成員變量。類的服務(wù):類中所包含的成員方法。36回顧4.1面向?qū)ο蟮幕靖拍?74.2類
Java語(yǔ)言中,類的來(lái)源主要有兩種途徑:Java類庫(kù)用戶自定義的類所有的類都是Object類的子類。如果在自定義類時(shí),沒(méi)有寫(xiě)明父類,則默認(rèn)的父類為Object。從嚴(yán)格意義上講,Java程序中定義的所有的類都是子類。384.2.1
類的定義
{類成員變量聲明類方法聲明 }類修飾符用來(lái)說(shuō)明類的特殊性質(zhì),分為三種:訪問(wèn)控制符:public抽象類說(shuō)明符:abstract最終類說(shuō)明符:final接口名跟在implements關(guān)鍵字后面,用來(lái)說(shuō)明類中實(shí)現(xiàn)了哪個(gè)接口定義的功能和方法。接口是Java用來(lái)實(shí)現(xiàn)多重繼承的一種特殊機(jī)制,我們將在后面詳細(xì)介紹。[修飾符]class類名[extends父類][implements接口名]391.關(guān)于類頭[修飾符]class
類名[extends父類][implements
接口名]
class關(guān)鍵字的后面,應(yīng)跟隨我們所定義的類的名稱。(注意不要把class寫(xiě)成Class)。父類名跟在extends
關(guān)鍵字后面,用來(lái)說(shuō)明當(dāng)前類是哪個(gè)已經(jīng)存在類的子類。繼承是類與類之間的一種非常重要的關(guān)系。publicclassTaxiextendsCar40
2.關(guān)于類體
類體主要包括類的具體內(nèi)容,包括類的屬性(成員變量)與方法(成員方法)。class<類名>{
<成員變量聲明><成員方法聲明>}publicclassTaxiextendsCar{
public
int
color_number=2;
intdoor_number;
intspeed;
publicvoidbrake(inti,j){…}voidspeedUp(){…}voidslowDown(){…}}
41類的屬性定義語(yǔ)法如下:[修飾符]變量類型變量名[=變量初值];
變量類型和變量名是聲明一個(gè)變量必不可少的部分;這里的變量的類型是基本數(shù)據(jù)類型。類的屬性變量修飾符用來(lái)說(shuō)明變量的性質(zhì),主要有:訪問(wèn)控制符:public靜態(tài)修飾符:static最終修飾符:final[修飾符]
class類名[extends父類][implements接口名]public
int
color_number=2;
42類的方法方法的聲明如下:[修飾符]返回值類型方法名(參數(shù)列表)[
throws異常名1,異常名2,…]{ //方法體:局部變量聲明;語(yǔ)句序列;}類的方法有兩種作用:一是對(duì)類的屬性進(jìn)行各種操作;二是與其他類或?qū)ο筮M(jìn)行交互,作為一個(gè)接口。方法修飾符有四種:訪問(wèn)控制符:public抽象修飾符:abstract靜態(tài)修飾符:static最終修飾符:finalpublicvoidbrake(inti,j)
{
intx,y;x=i;y=j;…}43修飾符的比較訪問(wèn)控制符:public,private抽象修飾符:
abstract最終修飾符:final靜態(tài)修飾符:static類
√√√×變量
√
×√√方法
√
√
√√444.2.2用戶自定義類Java程序設(shè)計(jì)中,程序員的大部分精力都要放在創(chuàng)建用戶自定義類型(user-definedtype)上。用戶自定義類型也稱為自定義類。每個(gè)用戶自定義類型(即類)都包含有數(shù)據(jù)和一組操作數(shù)據(jù)的方法。類的實(shí)例稱為對(duì)象。下面,介紹一個(gè)簡(jiǎn)單的Employee類。今后,我們?cè)诰帉?xiě)職工工資系統(tǒng)時(shí),有可能會(huì)用到它。45classEmployee{ Stringname;//成員變量 doublesalary; DatehireDay;
publicEmployee(Stringn,doubles,intyear,intmonth,intday) { name=n;//職工姓名 salary=s;//職工工資
hireDay=newGregorianCalendar(year,month-1,day);
//出勤數(shù) } publicStringgetName()//方法1 { returnname; }
…… //更多的方法}構(gòu)造方法464.2.3
構(gòu)造方法定義好一個(gè)類以后,我們需要?jiǎng)?chuàng)建該類的實(shí)例。在Java中,構(gòu)造一個(gè)類的實(shí)例(即對(duì)象),需要做以下三件事情:
(1)為對(duì)象分配內(nèi)存空間;
(2)初始化對(duì)象中的成員變量;
(3)調(diào)用類的構(gòu)造方法來(lái)創(chuàng)建該對(duì)象。在Java中,每個(gè)類中都至少有一個(gè)構(gòu)造方法。如果沒(méi)有,則系統(tǒng)會(huì)自動(dòng)提供一個(gè)缺省的構(gòu)造方法。類的構(gòu)造方法的作用:
(1)可以保證用戶能正確地創(chuàng)建出該類的對(duì)象;(2)可以初始化對(duì)象。47構(gòu)造方法的格式
[修飾符]方法名([形式參數(shù)列表])[throws異常列表]{方法體}其中,構(gòu)造方法的修飾符與普通方法的修飾符相同。一個(gè)類可以有多個(gè)構(gòu)造方法,它們都具有相同的方法名,即類名,但是形式參數(shù)的個(gè)數(shù)和類型不同。在創(chuàng)建對(duì)象時(shí),編譯器會(huì)根據(jù)參數(shù)的個(gè)數(shù)和類型來(lái)決定調(diào)用哪個(gè)構(gòu)造方法。這就是構(gòu)造方法的多態(tài)。沒(méi)有返回值,也沒(méi)有void方法名與類名相同48缺省的構(gòu)造方法構(gòu)造方法分為缺省的構(gòu)造方法(不帶參數(shù))和帶參數(shù)的構(gòu)造方法。如果在類中沒(méi)有定義構(gòu)造方法,Java會(huì)自動(dòng)為用戶提供一個(gè)缺省的構(gòu)造方法。缺省的構(gòu)造方法確保每個(gè)類都至少有一個(gè)構(gòu)造方法。例如,在類Employee中,如果我們沒(méi)有定義構(gòu)造方法,則Java自動(dòng)提供一個(gè)缺省的構(gòu)造方法,如下:
publicEmployee()//缺省的構(gòu)造方法{}49構(gòu)造方法的例子【例】下面的例子將建立雇員信息類EmpInfoA,其中定義了一個(gè)構(gòu)造方法。利用這個(gè)構(gòu)造方法創(chuàng)建一個(gè)雇員對(duì)象,并初始化該對(duì)象,然后輸出該對(duì)象的若干信息。
50構(gòu)造方法舉例publicclassEmpInfoA{Stringname;//雇員的姓名
Stringdesignation;//雇員的職務(wù)
Stringdepartment;//雇員的部門(mén)
publicEmpInfoA(Stringn,Stringdes,Stringdep){name=n;designation=des;department=dep;}voidprint(){//成員方法
System.out.println(name+"是"+department+"的"+designation);}
publicstaticvoidmain
(Stringargs[
]
){
//主方法,程序的入口
EmpInfoA
emp=new
EmpInfoA("張三","經(jīng)理","銷(xiāo)售部");
emp.print();//調(diào)用對(duì)象emp的方法print()}}
例子:EmpInfoB51類成員變量的初始化對(duì)類的成員變量進(jìn)行初始化,主要有5種途徑:每種數(shù)據(jù)類型都有默認(rèn)的初始值;可以在聲明成員變量的同時(shí)進(jìn)行初始值,inti=10;在類的成員方法中,對(duì)成員變量賦值。例如:在main()方法中;在類的構(gòu)造方法中,對(duì)成員變量賦值。例如:在前面的構(gòu)造方法的例子中;利用初始化塊對(duì)成員變量進(jìn)行初始化。初始化塊是由一對(duì)花括號(hào){}括起的語(yǔ)句塊。52初始化塊、構(gòu)造方法中初始化成員變量classPoint{
intx,y; //成員變量{ //在初始化塊中初始化
x=10;y=20;
System.out.println("在初始化塊中進(jìn)行初始化:x="+x+",y="+y);}
Point(int
dx,int
dy)//在構(gòu)造方法中初始化
{x=dx;y=dy;
System.out.println("在構(gòu)造方法中進(jìn)行初始化:x="+x+",y="+y);}
publicstaticvoidmain
(Stringargs[
]
){
Pointp=new
Point(40,40);
}}注意:初始化塊和構(gòu)造方法都是在創(chuàng)建對(duì)象時(shí)被調(diào)用。通常,初始化塊先執(zhí)行。534.3對(duì)象類是對(duì)象的產(chǎn)品模板。在現(xiàn)實(shí)世界里,我們使用的是產(chǎn)品而不是產(chǎn)品的圖紙。同樣的道理,Java中運(yùn)行的應(yīng)該是由類所創(chuàng)建的對(duì)象。一個(gè)典型的Java程序會(huì)創(chuàng)建很多對(duì)象,它們通過(guò)消息傳遞進(jìn)行相互交流,共同完成程序的功能。一旦任務(wù)完成,對(duì)象就會(huì)被垃圾收集器收回,完成它從創(chuàng)建、使用到清除的生命三步曲。54對(duì)象的創(chuàng)建
首先,必須擁有一個(gè)合適的類才能創(chuàng)建一個(gè)合適的對(duì)象,有了合適的對(duì)象才能完成合適的工作。
對(duì)象創(chuàng)建的語(yǔ)法格式為:類名對(duì)象名=new
類名([參數(shù)列表]);調(diào)用類的構(gòu)造方法對(duì)象聲明EmpInfoA
emp=new
EmpInfoA("張三","經(jīng)理","銷(xiāo)售部");55創(chuàng)建一個(gè)對(duì)象的三個(gè)步驟1、對(duì)象的聲明格式為:類名對(duì)象名;
例如:PeoplezhangPing;2、為聲明的對(duì)象分配內(nèi)存new運(yùn)算符為聲明的對(duì)象分配內(nèi)存,然后調(diào)用類的構(gòu)造方法來(lái)初始化對(duì)象。用new可以為同一個(gè)類創(chuàng)建多個(gè)對(duì)象,這些對(duì)象分別占用不同的內(nèi)存空間,因此改變其中一個(gè)對(duì)象的狀態(tài)不會(huì)影響到其他對(duì)象的狀態(tài)。3、執(zhí)行構(gòu)造方法,進(jìn)行初始化zhangPing=newPeople(“20040101”);zhangYong=newPeople(“20040102”);//創(chuàng)建另一個(gè)對(duì)象上面三個(gè)步驟,通??梢詫?xiě)成如下簡(jiǎn)潔的形式:PeoplezhangPing=newPeople(“20040101”);類名對(duì)象名=new類名([參數(shù)列表]);56創(chuàng)建對(duì)象相當(dāng)于定義一個(gè)變量,既可采用上述方法。PeoplezhangPing=newPeople(“20040101”);PeoplezhangPing;zhangPing=newPeople(“20040101”);也可以把上述步驟分開(kāi)進(jìn)行,先聲明對(duì)象,再實(shí)例化對(duì)象,最后進(jìn)行初始化。57對(duì)象創(chuàng)建的例子【例】下面的例子將建立雇員信息類EmpInfoB。利用缺省的構(gòu)造方法創(chuàng)建一個(gè)雇員對(duì)象。并且在主方法中初始化該對(duì)象,然后打印出該對(duì)象的若干信息。
58
publicclassEmpInfoB{Stringname;//雇員的姓名
Stringdesignation;//雇員的職務(wù)
Stringdepartment;//雇員的部門(mén)
voidprint(){//成員方法
System.out.println(name+"是"+department+"的"+designation);}publicstaticvoidmain(Stringargs[]){//主方法
EmpInfoB
emp=newEmpInfoB();//調(diào)用缺省構(gòu)造方法創(chuàng)建對(duì)象
=
"張三";//初始化對(duì)象emp的成員變量
emp.designation="經(jīng)理";
emp.department=
"銷(xiāo)售部";
emp.print();//調(diào)用對(duì)象emp的方法print()}}例子:EmpInfoA對(duì)象創(chuàng)建舉例59對(duì)象的使用
創(chuàng)建好一個(gè)對(duì)象之后,就可以使用這個(gè)對(duì)象。(1)訪問(wèn)對(duì)象的成員變量:通過(guò)運(yùn)算符“.”格式為:對(duì)象名.成員變量名例如,在前面例子中:=
"張三";成員變量的訪問(wèn)也可以用new創(chuàng)建對(duì)象,然后直接訪問(wèn),不用先聲明對(duì)象。例如:newEmpInfoB().name="張三"。(2)調(diào)用對(duì)象的方法:也是通過(guò)運(yùn)算符“.”格式為:對(duì)象名.方法名([參數(shù)列表])
例如,在前面例子中:emp.print();
同樣,我們也可以用new創(chuàng)建對(duì)象,然后直接調(diào)用它的方法,不用先聲明對(duì)象。例如:newEmpInfoB().print()。
60對(duì)象的清除與垃圾回收
Java運(yùn)行時(shí),系統(tǒng)通過(guò)垃圾收集器周期性地收集無(wú)用對(duì)象所占用的內(nèi)存,并釋放該內(nèi)存空間,完成對(duì)象的清除工作。Java的垃圾收集器自動(dòng)掃描內(nèi)存,對(duì)正在使用的對(duì)象做標(biāo)記,然后把無(wú)用對(duì)象作為垃圾收集起來(lái),并釋放掉。垃圾收集器作為一個(gè)線程單獨(dú)運(yùn)行,當(dāng)系統(tǒng)的內(nèi)存用盡或者程序中調(diào)用System.gc()方法要求進(jìn)行垃圾收集時(shí),垃圾收集線程與系統(tǒng)同步運(yùn)行,否則垃圾收集器在系統(tǒng)空閑時(shí)異步地執(zhí)行。在對(duì)象作為垃圾被收集器釋放之前,系統(tǒng)會(huì)自動(dòng)調(diào)用對(duì)象的方法finalize(),清除對(duì)象所占用的資源。
61對(duì)象的清除與垃圾回收
雖然Java提供自動(dòng)的內(nèi)存垃圾收集和處理機(jī)制。但是,在某些情況下,例如當(dāng)一個(gè)類被破壞后,需要程序員自己執(zhí)行一些垃圾收集器不能處理的工作。這時(shí)可以在類中定義方法finalize(),用來(lái)清除對(duì)象所占用的資源,它的格式如下:
protectedvoidfinalize()[throwsThrowable]{//撤銷(xiāo)對(duì)象}
624.4.1方法概述4.4方法Java程序是由一個(gè)個(gè)類所組成的,類又有兩個(gè)部分:屬性和方法。屬性描述類是什么,方法描述類能做什么。方法是類的主要組成部分。在一個(gè)類中,程序的作用主要體現(xiàn)在方法中。方法是一個(gè)有名字的子程序。通常分為一個(gè)主方法和若干個(gè)子方法。主方法調(diào)用其他方法,其他方法之間也可以互相調(diào)用,同一個(gè)方法可以被一個(gè)或多個(gè)方法調(diào)用任意次。
63Java程序的基本結(jié)構(gòu)導(dǎo)入Java類庫(kù);//Import…定義用戶類1{
定義類1的若干變量;定義類1的方法1; ……定義類1的方法M;}定義用戶類2{定義類2的若干變量;定義類2的方法1; ……定義類2的方法N;}……64方法的類型方法的類型可分成兩種:(1)標(biāo)準(zhǔn)方法,Java語(yǔ)言提供了豐富的標(biāo)準(zhǔn)類和標(biāo)準(zhǔn)方法,這些方法提供了程序員所需的許多功能。例如,System.out.println();(2)用戶自定義的方法,以解決用戶專門(mén)的需要。Java程序的執(zhí)行是從main方法開(kāi)始的,調(diào)用其他方法后又回到main方法,在main方法中結(jié)束整個(gè)程序的運(yùn)行。654.4.2定義方法1.聲明方法頭2.聲明方法體Java中聲明方法的語(yǔ)法如下:[修飾符]返回值類型方法名(參數(shù)列表)[
throws例外名1,例外名2,…]{ //方法體:局部變量聲明;語(yǔ)句序列;}publicvoidbrake(inti,j)
{
intx,y;x=i;y=j;…}66
1、聲明方法頭
方法頭一般由方法名、參數(shù)列表、返回類型、方法修飾符和方法拋出的異常五部分組成。注意事項(xiàng):(1)方法名可以是任何有效的標(biāo)識(shí)符,命名規(guī)則與標(biāo)識(shí)符命名規(guī)則相同。(2)返回類型用來(lái)指定方法返回值的類型,方法最多只能返回一個(gè)值。(3)參數(shù)列表是方法的輸入接口,它列出了一系列形式參數(shù)的類型和名稱。對(duì)于每個(gè)行參,調(diào)用方法時(shí)必須有一個(gè)實(shí)參與之對(duì)應(yīng),而且該實(shí)參的類型必須與行參的類型一致。672、聲明方法體方法頭定義了方法的性質(zhì),方法體則定義了方法的內(nèi)容。注意事項(xiàng):(1)在一個(gè)方法中嵌套定義另一個(gè)方法將產(chǎn)生語(yǔ)法錯(cuò)誤;(2)方法體包含在一對(duì)大括號(hào)中,即使方法體中沒(méi)有語(yǔ)句,一對(duì)大括號(hào)也是必不可少的。(3)方法頭中如果指定了非void的返回值類型,方法體中就必須包含一條return語(yǔ)句,以保證任何情況下都有返回值。68
聲明方法體的例子classDepartment{
int
m_DeptNo; //部門(mén)編號(hào)
Stringm_DeptName;//部門(mén)名稱
int
m_DeptTotalEmp;//部門(mén)雇員數(shù)
int
getDeptNo()//獲取當(dāng)前對(duì)象的部門(mén)號(hào){returnm_DeptNo;//返回這個(gè)對(duì)象的部門(mén)號(hào)}} 69回顧4.2類
4.3對(duì)象4.4方法704.4.3方法的調(diào)用方法按其被調(diào)用的方式可分為兩類:(1)需要程序員書(shū)寫(xiě)專門(mén)的調(diào)用命令來(lái)調(diào)用的方法,稱為程序調(diào)用方法,例如getDeptNo();(2)系統(tǒng)自動(dòng)調(diào)用的方法,稱為系統(tǒng)方法。例如main()、action()、paint()、init()等。這兩類方法的定義和使用原則有很大差異。在某個(gè)類中調(diào)用該類自身的方法,可以直接使用這個(gè)方法的名稱;調(diào)用其他對(duì)象或類的方法,則需要使用該對(duì)象或類名作為前綴。
71
方法的調(diào)用(實(shí)例)classDepartment{
int
m_DeptNo; //部門(mén)編號(hào)
Stringm_DeptName; //部門(mén)名稱
int
m_DeptTotalEmp;//部門(mén)雇員數(shù)
int
getDeptNo()//獲取當(dāng)前對(duì)象的部門(mén)號(hào)
{returnm_DeptNo;//返回這個(gè)對(duì)象的部門(mén)號(hào)
}publicstaticvoidmain(String[]args){Departmentdep=newDepartment();
dep.m_DeptNo=100;//訪問(wèn)對(duì)象dep的成員變量
System.out.println("部門(mén)號(hào)為:"+dep.getDeptNo());
//調(diào)用對(duì)象dep的方法}}72
方法的重載(Overloading)同一個(gè)類中的多個(gè)方法具有相同的名字,但這些方法具有不同的參數(shù)列表,即形式參數(shù)的個(gè)數(shù)或類型不能完全相同。例如:幾何圖形類中有多個(gè)方法用來(lái)繪制不同的圖形,這些方法有相同的名字draw,但形參不一樣,
draw(Pointa,Pointb);
draw(Pointa,Pointb,Pointc);
draw(Pointa,Pointb,Pointc,Pointd);
draw(Pointa,floatradius);ababcabcdaradius重載73
方法的重載(Overloading)幾何圖形類中有四種不同的繪圖方法,我們?cè)谡{(diào)用draw方法進(jìn)行繪圖時(shí),是調(diào)用其中哪一個(gè)方法呢?其實(shí),這時(shí)Java編譯器會(huì)根據(jù)您提供的實(shí)參的類型和個(gè)數(shù)來(lái)決定具體調(diào)用其中哪個(gè)方法。例如:draw((0,1),(4,12));draw((3,4),2.5);方法重載可以簡(jiǎn)化程序的編寫(xiě),您只要記住一個(gè)方法名,不需要記那么多復(fù)雜的方法名稱。通過(guò)提供不同的實(shí)參就可以調(diào)用不同的方法來(lái)完成不同的功能。構(gòu)造方法也可以重載,其目的是使得用戶可以為同一個(gè)類創(chuàng)建初始值不同的對(duì)象。74classOverloading{ voidget
(inti){
System.out.println("getoneintdata:i="+i); } voidget(intx,inty){
System.out.println("gettwoint
datas:x="+x+"y="+y); } voidget(doubled){
System.out.println("getonedoubledata:d="+d); } voidget(Strings){
System.out.println("getastring:s="+s); }publicstaticvoidmain(Stringargs[]){Overloadingmo=newOverloading();mo.get(1);mo.get(2,3);mo.get(4.5);mo.get
("astring"); }}754.4.4JavaAPI中的方法
JavaAPI(ApplicationProgramInterface)也稱為Java類庫(kù)。JavaAPI提供了豐富的標(biāo)準(zhǔn)類和方法,可以執(zhí)行常見(jiàn)的算術(shù)運(yùn)算、字符、字符串、輸入輸出、錯(cuò)誤檢查等操作。
1、Math類以及其中的方法2、Math類方法的調(diào)用System.out.println()761、Math類的方法
方法說(shuō)明方法說(shuō)明abs(x)x的絕對(duì)值max(x,y)取x和y中較大者ceil(x)不小于x的最小整數(shù)min(x,y)取x和y中較小者cos(x)x的余弦函數(shù)值pow(x,y)x的y次冪exp(x)指數(shù)方法e的x次冪sin(x)x的正弦函數(shù)值floor(x)不大于x的最大整數(shù)sqrt(x)x的平方根log(x)x的自然對(duì)數(shù)(以e為底)
772、Math類方法的調(diào)用
例如,要計(jì)算并且打印出900的平方根,我們需要調(diào)用Math類的方法如下:
System.out.println(Math.sqrt(900));注意:Math類方法的調(diào)用必須在方法名前加上類名Math和點(diǎn)“.”運(yùn)算符。784.5訪問(wèn)控制修飾符Java語(yǔ)言新推出“訪問(wèn)控制修飾符”的概念,允許類創(chuàng)建者聲明哪些東西是類使用者可以使用的,哪些是不可使用的。每個(gè)訪問(wèn)控制修飾符都代表一種訪問(wèn)控制權(quán)限。這些訪問(wèn)控制權(quán)限按照權(quán)限的大小可進(jìn)行如下排序:
public
>
protected
>default(無(wú)修飾符)>
private79為類指定訪問(wèn)權(quán)限的格式: class類名;如果一個(gè)類沒(méi)有指定為public,則該類的訪問(wèn)權(quán)限就是缺省的。一、類的訪問(wèn)控制權(quán)限(2種)public:公共訪問(wèn)權(quán)限default:缺省訪問(wèn)權(quán)限[public]80為類中的變量和方法指定訪問(wèn)權(quán)限的格式: [public|private|protected]數(shù)據(jù)類型變量名; [public|private|protected]返回類型方法名(參數(shù)列表);如果一個(gè)變量或方法沒(méi)有指定訪問(wèn)控制修飾符,則該變量或方法的訪問(wèn)權(quán)限就是缺省的。二、變量和方法的訪問(wèn)控制權(quán)限(4種)public:公共訪問(wèn)權(quán)限default:缺省訪問(wèn)權(quán)限protected:保護(hù)訪問(wèn)權(quán)限private:私有訪問(wèn)權(quán)限814.5.1公共訪問(wèn)控制符public類的訪問(wèn)控制修飾符只有一個(gè):public。一個(gè)類被聲明為公共類,表明它可以被所有的其他類所訪問(wèn)。
注意:公共類可以被所有其他類訪問(wèn)不代表公共類中的成員也可以被訪問(wèn)。只有當(dāng)這些成員也是公共的,才可以訪問(wèn)。例如:要進(jìn)入二樓的一個(gè)房間,必須首先保證這棟樓的大門(mén)是開(kāi)著的,而且這個(gè)房間的門(mén)也開(kāi)著,才可以進(jìn)入其中。824.5.2缺省訪問(wèn)控制權(quán)限如果一個(gè)類前面沒(méi)有訪問(wèn)控制修飾符,則說(shuō)明它具有缺省的訪問(wèn)控制權(quán)限。缺省的訪問(wèn)控制權(quán)限規(guī)定類只能被同一個(gè)包中的類訪問(wèn),而不能被其他包中的類訪問(wèn)。418包1包2包3包n……類defaultclass類名;834.5.3私有訪問(wèn)控制符private
用private修飾的變量或方法只能被該類本身所訪問(wèn),而不能被任何其他的類,包括該類的子類,來(lái)訪問(wèn)。
變量1…n方法1…mprivate父類變量1…n方法1…m子類變量1…n方法1…m其他類84classEmployee{
privateStringname;//成員變量,私有訪問(wèn)權(quán)限
private
doublesalary;
publicEmployee(Stringn,doubles) {//構(gòu)造方法
name=n;//職工姓名
salary=s;//職工工資
}
publicStringgetName()//方法1 {
return
name;
} publicstaticvoidmain(Stringargs[]){
Employee
e=newEmployee
("Jack",2600d);
System.out.println("姓名為:"+e.getName()); }}√√√852.私有方法雖然大多數(shù)方法是公開(kāi)的,但是私有方法也經(jīng)常使用。例如那些與類的訪問(wèn)者無(wú)關(guān)的方法就可以設(shè)置為私有的。private方法1(與訪問(wèn)者無(wú)關(guān))public方法2(與訪問(wèn)者有關(guān))被訪問(wèn)類變量1…n方法1…m訪問(wèn)類86publicclassDemo{ publicint
a;//公共的成員變量
privateint
b;//私有的成員變量
publicint
getA(){//公共的成員方法
returna; } privateint
getB(){//私有的成員方法
returnb; } publicDemo(intx,inty){
a=x; //訪問(wèn)公共成員變量,對(duì)其初始化
b=y; //訪問(wèn)私有成員變量,對(duì)其初始化 } publicstaticvoidmain(Stringargs[]){ Demodp=newDemo(1,2);
intw=dp.getA();//訪問(wèn)公共的成員方法
System.out.println("變量a的值:"+w);
intv=dp.getB();//訪問(wèn)私有的成員方法
System.out.println("變量b的值:"+v); }}874.5.4保護(hù)訪問(wèn)控制符protected用protected修飾的類成員可以被三種類所訪問(wèn):該類本身、與它在同一個(gè)包中的其他類、在其他包中的該類的子類。protected的主要作用:允許位于其他包中的子類來(lái)訪問(wèn)父類的成員。4188包1包2protected假設(shè)包1
中的類4
不是包2
中的類1
的子類假設(shè)包1
中的類8
是包2
中的類1
的子類88packagep1;publicclassDemopro{
public
inta;//公共的成員變量
protected
voidmethod()//保護(hù)的成員方法 {
System.out.println("Demopro中的公共成員變量a的值:"+a); }}
packagep2;importp1.*;publicclasstest{ publicstaticvoidmain(Stringargs[]){
Demopro
dp=newDemopro();
dp.method();
/*不能訪問(wèn)Demopro
中的方法method,因?yàn)樗鞘鼙Wo(hù)的,并且位于不同的包中*/
dp.a=10;//可以訪問(wèn)Demopro
中的公共成員變量a
System.out.println("Demopro中的公共成員變量a的值:"+dp.a); }}89如果上面的兩個(gè)類Demopro
和test位于同一個(gè)包中,則上面的語(yǔ)句dp.method()就不會(huì)有錯(cuò)。如果兩個(gè)類位于不同的包中且沒(méi)有繼承關(guān)系,則對(duì)保護(hù)類型的變量和方法的訪問(wèn)將受到限制。因此,上面的dp.method()不能正確執(zhí)行。90歸納上述4種不同的訪問(wèn)控制修飾符:同一個(gè)類同一個(gè)包不同包中的子類不同包中的非子類private
√×××默認(rèn)
√
√××protected
√
√
√×public
√
√
√
√
權(quán)限遞增914.6靜態(tài)修飾符、初始化塊和方法4.6.1靜態(tài)修飾符static是靜態(tài)修飾符,用來(lái)修飾類中的變量和方法。被static修飾的變量稱為靜態(tài)變量,靜態(tài)變量的特點(diǎn)是:它屬于類本身,不屬于類的任何一個(gè)具體對(duì)象。靜態(tài)變量是一個(gè)公共的內(nèi)存單元。92static
intx;類student張三李四實(shí)例化xinty;類student張三李四實(shí)例化yy屬于屬于屬于共享93靜態(tài)變量靜態(tài)變量是類固有的,可以在創(chuàng)建類以后直接訪問(wèn),而非靜態(tài)的成員變量只有在生成對(duì)象后才存在,才可以訪問(wèn)。把靜態(tài)變量稱為類變量,非靜態(tài)變量稱為對(duì)象變量。相應(yīng)地,靜態(tài)方法稱為類方法,非靜態(tài)方法稱為對(duì)象方法。94classStaticDemo{
static
intx;//靜態(tài)變量
inty;//非靜態(tài)變量
staticpublicint
getX(){returnx;}//靜態(tài)方法publicint
getY(){returny;}//非靜態(tài)方法}publicclassShowDemo{publicstaticvoidmain(String[]args){
System.out.println("靜態(tài)變量x="+StaticDemo.getX());
System.out.println("非靜態(tài)變量y="+StaticDemo.getY());//非法訪問(wèn)
StaticDemoa=newStaticDemo();
StaticDemob=newStaticDemo();
a.x=2;a.y=2;
b.x=3;b.y=3;
System.out.println("靜態(tài)變量a.x="+a.getX());
System.out.println("非靜態(tài)變量a.y="+a.getY());
System.out.println("靜態(tài)變量b.x="+b.getX());
System.out.println("非靜態(tài)變量b.y="+b.getY());}}95類的靜態(tài)成員可以通過(guò)“類名.成員名”或者“對(duì)象名.成員名”來(lái)訪問(wèn),例如在前面的程序中我們就使用了StaticDemo.getX()和a.getX
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年承德客運(yùn)從業(yè)資格證考試模擬考試
- 吉首大學(xué)《婦幼保健學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉首大學(xué)《企業(yè)預(yù)算管理》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《數(shù)字?jǐn)z影》2021-2022學(xué)年第一學(xué)期期末試卷
- 店鋪砸墻協(xié)議書(shū)范文范本
- 吉林師范大學(xué)《中國(guó)思想史》2021-2022學(xué)年第一學(xué)期期末試卷
- 潮汕生意合作協(xié)議書(shū)范文范本
- 2022年國(guó)家公務(wù)員考試《申論》試題真題(行政執(zhí)法)及答案解析
- 2022年公務(wù)員多省聯(lián)考《申論》真題(廣西A卷)及答案解析
- 個(gè)人合伙人合同協(xié)議書(shū)范文模板
- 須彌(短篇小說(shuō))
- 旋風(fēng)除塵器設(shè)計(jì)與計(jì)算
- 《裝配基礎(chǔ)知識(shí)培訓(xùn)》
- 出口退稅的具體計(jì)算方法及出口報(bào)價(jià)技巧
- PCB鍍層與SMT焊接
- Unit 1 This is my new friend. Lesson 5 課件
- 2019年青年英才培養(yǎng)計(jì)劃項(xiàng)目申報(bào)表
- 剪紙教學(xué)課件53489.ppt
- 芳香油的提取
- 勞動(dòng)法講解PPT-定稿..完整版
- 企業(yè)人才測(cè)評(píng)發(fā)展中心建設(shè)方案
評(píng)論
0/150
提交評(píng)論