第4章面向?qū)ο蠡A(chǔ)_第1頁
第4章面向?qū)ο蠡A(chǔ)_第2頁
第4章面向?qū)ο蠡A(chǔ)_第3頁
第4章面向?qū)ο蠡A(chǔ)_第4頁
第4章面向?qū)ο蠡A(chǔ)_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章

面向?qū)ο蠡A(chǔ)朱海波副教授1主要內(nèi)容:

1.面向?qū)ο蠡靖拍?.Java的類與對象3.成員變量與封裝4.成員方法2

理解面向?qū)ο缶幊痰幕靖拍盍私忸惖姆庋b方法如何創(chuàng)建類和對象了解成員變量和成員方法的特性學(xué)習(xí)使用OOP方式進行程序設(shè)計

教學(xué)目的和要求:3重點與難點重點:類和對象的概念,及實際應(yīng)用難點: 類的設(shè)計4

4.1面向?qū)ο蟮幕靖拍?.2類4.3對象4.4方法4.5訪問控制修飾符4.6靜態(tài)修飾符、靜態(tài)字段和方法4.7抽象類與抽象方法4.8最終類、最終屬性、最終方法與終結(jié)器本章小結(jié)目錄54.1面向?qū)ο蟾拍?、對象2、對象的封裝3、類和實例4、消息5、繼承6、對象之間的關(guān)系61、對象對象

(object):面向?qū)ο蠹夹g(shù)的核心。我們可以把我們所生活的真實世界(RealWorld)看成是由許多大小不同的對象所組成的。對象可以是有生命的個體,比如一個人或一只鳥。7對象對象也可以是無生命的個體,比如一輛汽車或一臺計算機。8對象對象還可以是一件抽象的概念,如天氣的變化或者鼠標所產(chǎn)生的事件,或者是一個自然數(shù)。1239對象的屬性和行為環(huán)顧周圍的世界,任何地方都可以看到對象,例如:人、狗、汽車、計算機、桌子、椅子等等。不管是有生命的對象還是無生命的對象,它們都有一些共同的特征:屬性和行為。10對象的屬性和行為例如,人有姓名、年齡、身高、職業(yè)等屬性,有工作、吃飯、運動等行為。而汽車有形狀、顏色、品牌等屬性,有啟動、加速、剎車、轉(zhuǎn)彎等行為。11軟件對象軟件對象:現(xiàn)實世界中的對象在計算機中的抽象表示,即仿照現(xiàn)實對象而建立的。軟件對象也有狀態(tài)和行為,軟件對象用變量表示對象的狀態(tài)、用方法來實現(xiàn)對象的行為。一個軟件對象就是變量和相關(guān)方法的集合。軟件對象=變量+方法12軟件對象的特性對象名:唯一標識,區(qū)別于其它對象的標志,例如car;變量:對象所處的狀態(tài),例如汽車行駛的速度;方法:通過改變對象的狀態(tài),來實現(xiàn)對象的行為,例如通過加速這個方法來改變汽車的速度;接口:與外界通信的通道。注意:今后,在不引起歧義的情況下,我們把軟件對象簡稱為對象。13對象和實體的關(guān)系對象是對現(xiàn)實世界中實體的抽象Why?實體太復(fù)雜啦!How?取其關(guān)心的部分!What?對象是抽象的,對象是部分的!人抽象

142、對象的封裝一個對象的變量(狀態(tài))構(gòu)成這個對象的核心,一般不將其對外公布,而是將對變量進行操作的方法對外公開,這樣變量就被隱藏起來。這種將對象的變量置于方法的保護之下的方式稱為封裝。變量方法外部訪問152、對象的封裝例如:可以把汽車抽象成一個對象,用變量表示它當前的狀態(tài),如速度、油量、所處的位置等,它的行為則可以有加速、剎車、換檔等。我們在駕駛汽車時,只需要知道如何操作相應(yīng)的方法就可以了,不用考慮汽車內(nèi)部是如何實現(xiàn)諸如提速、剎車等行為。16封裝將對象的私有數(shù)據(jù)隱藏起來,其他對象不能直接訪問這些私有數(shù)據(jù),必須通過調(diào)用該對象的相關(guān)方法來間接訪問。私有數(shù)據(jù)

方法

方法數(shù)據(jù)對象A對象B公有數(shù)據(jù)17對象封裝的好處通過將對象進行封裝,能把對別的對象來說并不重要的對象的實現(xiàn)細節(jié)隱蔽起來,從而在使用一個對象時,只需知道調(diào)用它的方法而無需知道該方法是如何實現(xiàn)的。(1)模塊化:一個對象的源代碼的編寫和維護獨立于其他對象的源代碼,而且,對象的使用也很方便;(2)信息隱蔽:每個對象都有一個公共接口使得其他對象可以與其通信,但對象的私有信息和方法則由它自己維護,并且改變這些私有信息和方法不會影響到使用它的其他對象。183、類在現(xiàn)實世界里,有許多同“種類”的對象。而這些同“種類”的對象可被歸類為一個“類”。例如,我們可將世界上所有的動物歸為動物類,所有的汽車歸類為汽車類。動物類汽車類19對象與類classTaxi{intcolor;intdoor_number;

intspeed;

voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}

類抽象軟件對象歸類現(xiàn)實生活中的對象20類的概念類是對多個具有相似行為的對象的一種抽象,描述了屬于該類型的所有對象的性質(zhì),即類定義了所有某種類型的對象的共有的變量和方法。在面向?qū)ο蟮某绦蛟O(shè)計中,類是程序的基本單元。Athlete21類與實例

(instance)汽車類有些共同的狀態(tài)(汽缸排氣量、排檔數(shù)、顏色、輪胎數(shù)……)和行為(換檔、開燈、剎車……),但每一臺汽車有個別的狀態(tài)和方法可以不同于其他汽車。你的汽車只是這世界中許多汽車中的一個。我們就稱你的汽車對象是汽車類中的一個實例(instance)。汽車類(class)實例(instance)new你的車22對象和類的關(guān)系類是同類對象的集合和抽象{學(xué)生A、學(xué)生B……}學(xué)生類對象是類的一個實例化學(xué)生類學(xué)生A234、消息(message)單獨一個對象一般沒有什么用處,在大的應(yīng)用程序中通常包括許多對象,并通過這些對象之間的交互來完成一個復(fù)雜的功能。例如在多媒體教室教學(xué)活動中,包括教師對象、學(xué)生對象、計算機對象、投影儀對象、擴音器對象以及桌子等對象,通過這些對象之間的交互才能順利完成我們的教學(xué)活動。24通過各個對象之間的交互,程序就可以實現(xiàn)更高級的功能以及更復(fù)雜的行為。軟件對象是通過相互間傳遞消息來實現(xiàn)交互的。對象B對象Amessage25當對象A想讓對象B執(zhí)行某項任務(wù)時,對象A就向?qū)ο驜傳遞消息。有時,接受消息的對象需要了解更多的信息,以明確它該做什么,這時就需要傳遞一些參數(shù)。例如,要使汽車加速,必須發(fā)給它一個消息,告訴它做何種動作(即加速),以及實現(xiàn)這個動作所需的參數(shù)(即需要達到的速度等)。發(fā)送消息的實質(zhì)就是要調(diào)用接受消息的對象的方法,所以發(fā)送消息可分為三個步驟:(1)確定接受消息的對象;(2)確定調(diào)用對象的哪個方法;(3)傳遞此方法所需要的參數(shù)。26

一個消息由3個元素所組成:1.消息目標對象(你的汽車)。2.執(zhí)行方法的名字(換檔)。3.執(zhí)行方法所需用的參數(shù)(parameters)(低、高速檔)。消息的好處

1.一個對象的行為是通過它的方法來表達,所以消息傳遞支持所有對象之間可能的交互。2.發(fā)送消息的對象與接受消息的對象不需要在相同的程序中,或者相同的機器上。275、子類和繼承什么是子類?子類是作為另一個類的擴充或修正所定義的一個類。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass28繼承的概念什么是繼承?繼承即子類可以利用父類中定義的方法和變量,就像它們屬于子類本身一樣。classCar{intcolor_number;intdoor_number;intspeed;

push_break(){…}add_oil(){…}}

classTrash_CarextendsCar{doubleamount;fill_trash(){…}}29類層級(classhierarchy)類的繼承關(guān)系不僅僅只是一層關(guān)系,它可以有好幾層。這種樹狀關(guān)系,我們稱作類層級(classhierarchy)。至于層級數(shù)可依照實際需要而定

。30類層級(classhierarchy)

子類繼承了父類的變量及方法。如此便可重復(fù)使用父類中的變量及方法。這就是繼承的好處。不僅如此,子類不受父類的限制,還可增加自己的變量及方法。例如在出租車中加了一個無線電調(diào)用方法,或是在轎車里加了一個衛(wèi)星導(dǎo)航方法。都是按子類特殊的需要新加的。因此,我們可以發(fā)現(xiàn)越下層的類,其行為越特別。316、對象之間的關(guān)系包含繼承關(guān)聯(lián)32包含關(guān)系汽車對象輪子對象發(fā)動機對象變速箱對象座位對象……33繼承關(guān)系交通工具對象車對象汽車對象公交汽車對象34關(guān)聯(lián)關(guān)系老師對象vs學(xué)生對象汽車對象vs加油站對象茶杯對象vs茶壺對象354.2類

類是現(xiàn)實世界某些對象的共同特征(屬性和操作)的表示,對象是類的實例。類的屬性:類中所包含的各項數(shù)據(jù),如變量或其他類的對象,一般稱為類的成員變量。類的服務(wù):類中所包含的成員方法。36回顧4.1面向?qū)ο蟮幕靖拍?74.2類

Java語言中,類的來源主要有兩種途徑:Java類庫用戶自定義的類所有的類都是Object類的子類。如果在自定義類時,沒有寫明父類,則默認的父類為Object。從嚴格意義上講,Java程序中定義的所有的類都是子類。384.2.1

類的定義

{類成員變量聲明類方法聲明 }類修飾符用來說明類的特殊性質(zhì),分為三種:訪問控制符:public抽象類說明符:abstract最終類說明符:final接口名跟在implements關(guān)鍵字后面,用來說明類中實現(xiàn)了哪個接口定義的功能和方法。接口是Java用來實現(xiàn)多重繼承的一種特殊機制,我們將在后面詳細介紹。[修飾符]class類名[extends父類][implements接口名]391.關(guān)于類頭[修飾符]class

類名[extends父類][implements

接口名]

class關(guān)鍵字的后面,應(yīng)跟隨我們所定義的類的名稱。(注意不要把class寫成Class)。父類名跟在extends

關(guān)鍵字后面,用來說明當前類是哪個已經(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類的屬性定義語法如下:[修飾符]變量類型變量名[=變量初值];

變量類型和變量名是聲明一個變量必不可少的部分;這里的變量的類型是基本數(shù)據(jù)類型。類的屬性變量修飾符用來說明變量的性質(zhì),主要有:訪問控制符:public靜態(tài)修飾符:static最終修飾符:final[修飾符]

class類名[extends父類][implements接口名]public

int

color_number=2;

42類的方法方法的聲明如下:[修飾符]返回值類型方法名(參數(shù)列表)[

throws異常名1,異常名2,…]{ //方法體:局部變量聲明;語句序列;}類的方法有兩種作用:一是對類的屬性進行各種操作;二是與其他類或?qū)ο筮M行交互,作為一個接口。方法修飾符有四種:訪問控制符:public抽象修飾符:abstract靜態(tài)修飾符:static最終修飾符:finalpublicvoidbrake(inti,j)

{

intx,y;x=i;y=j;…}43修飾符的比較訪問控制符:public,private抽象修飾符:

abstract最終修飾符:final靜態(tài)修飾符:static類

√√√×變量

×√√方法

√√444.2.2用戶自定義類Java程序設(shè)計中,程序員的大部分精力都要放在創(chuàng)建用戶自定義類型(user-definedtype)上。用戶自定義類型也稱為自定義類。每個用戶自定義類型(即類)都包含有數(shù)據(jù)和一組操作數(shù)據(jù)的方法。類的實例稱為對象。下面,介紹一個簡單的Employee類。今后,我們在編寫職工工資系統(tǒng)時,有可能會用到它。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)造方法定義好一個類以后,我們需要創(chuàng)建該類的實例。在Java中,構(gòu)造一個類的實例(即對象),需要做以下三件事情:

(1)為對象分配內(nèi)存空間;

(2)初始化對象中的成員變量;

(3)調(diào)用類的構(gòu)造方法來創(chuàng)建該對象。在Java中,每個類中都至少有一個構(gòu)造方法。如果沒有,則系統(tǒng)會自動提供一個缺省的構(gòu)造方法。類的構(gòu)造方法的作用:

(1)可以保證用戶能正確地創(chuàng)建出該類的對象;(2)可以初始化對象。47構(gòu)造方法的格式

[修飾符]方法名([形式參數(shù)列表])[throws異常列表]{方法體}其中,構(gòu)造方法的修飾符與普通方法的修飾符相同。一個類可以有多個構(gòu)造方法,它們都具有相同的方法名,即類名,但是形式參數(shù)的個數(shù)和類型不同。在創(chuàng)建對象時,編譯器會根據(jù)參數(shù)的個數(shù)和類型來決定調(diào)用哪個構(gòu)造方法。這就是構(gòu)造方法的多態(tài)。沒有返回值,也沒有void方法名與類名相同48缺省的構(gòu)造方法構(gòu)造方法分為缺省的構(gòu)造方法(不帶參數(shù))和帶參數(shù)的構(gòu)造方法。如果在類中沒有定義構(gòu)造方法,Java會自動為用戶提供一個缺省的構(gòu)造方法。缺省的構(gòu)造方法確保每個類都至少有一個構(gòu)造方法。例如,在類Employee中,如果我們沒有定義構(gòu)造方法,則Java自動提供一個缺省的構(gòu)造方法,如下:

publicEmployee()//缺省的構(gòu)造方法{}49構(gòu)造方法的例子【例】下面的例子將建立雇員信息類EmpInfoA,其中定義了一個構(gòu)造方法。利用這個構(gòu)造方法創(chuàng)建一個雇員對象,并初始化該對象,然后輸出該對象的若干信息。

50構(gòu)造方法舉例publicclassEmpInfoA{Stringname;//雇員的姓名

Stringdesignation;//雇員的職務(wù)

Stringdepartment;//雇員的部門

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)理","銷售部");

emp.print();//調(diào)用對象emp的方法print()}}

例子:EmpInfoB51類成員變量的初始化對類的成員變量進行初始化,主要有5種途徑:每種數(shù)據(jù)類型都有默認的初始值;可以在聲明成員變量的同時進行初始值,inti=10;在類的成員方法中,對成員變量賦值。例如:在main()方法中;在類的構(gòu)造方法中,對成員變量賦值。例如:在前面的構(gòu)造方法的例子中;利用初始化塊對成員變量進行初始化。初始化塊是由一對花括號{}括起的語句塊。52初始化塊、構(gòu)造方法中初始化成員變量classPoint{

intx,y; //成員變量{ //在初始化塊中初始化

x=10;y=20;

System.out.println("在初始化塊中進行初始化:x="+x+",y="+y);}

Point(int

dx,int

dy)//在構(gòu)造方法中初始化

{x=dx;y=dy;

System.out.println("在構(gòu)造方法中進行初始化:x="+x+",y="+y);}

publicstaticvoidmain

(Stringargs[

]

){

Pointp=new

Point(40,40);

}}注意:初始化塊和構(gòu)造方法都是在創(chuàng)建對象時被調(diào)用。通常,初始化塊先執(zhí)行。534.3對象類是對象的產(chǎn)品模板。在現(xiàn)實世界里,我們使用的是產(chǎn)品而不是產(chǎn)品的圖紙。同樣的道理,Java中運行的應(yīng)該是由類所創(chuàng)建的對象。一個典型的Java程序會創(chuàng)建很多對象,它們通過消息傳遞進行相互交流,共同完成程序的功能。一旦任務(wù)完成,對象就會被垃圾收集器收回,完成它從創(chuàng)建、使用到清除的生命三步曲。54對象的創(chuàng)建

首先,必須擁有一個合適的類才能創(chuàng)建一個合適的對象,有了合適的對象才能完成合適的工作。

對象創(chuàng)建的語法格式為:類名對象名=new

類名([參數(shù)列表]);調(diào)用類的構(gòu)造方法對象聲明EmpInfoA

emp=new

EmpInfoA("張三","經(jīng)理","銷售部");55創(chuàng)建一個對象的三個步驟1、對象的聲明格式為:類名對象名;

例如:PeoplezhangPing;2、為聲明的對象分配內(nèi)存new運算符為聲明的對象分配內(nèi)存,然后調(diào)用類的構(gòu)造方法來初始化對象。用new可以為同一個類創(chuàng)建多個對象,這些對象分別占用不同的內(nèi)存空間,因此改變其中一個對象的狀態(tài)不會影響到其他對象的狀態(tài)。3、執(zhí)行構(gòu)造方法,進行初始化zhangPing=newPeople(“20040101”);zhangYong=newPeople(“20040102”);//創(chuàng)建另一個對象上面三個步驟,通??梢詫懗扇缦潞啙嵉男问剑篜eoplezhangPing=newPeople(“20040101”);類名對象名=new類名([參數(shù)列表]);56創(chuàng)建對象相當于定義一個變量,既可采用上述方法。PeoplezhangPing=newPeople(“20040101”);PeoplezhangPing;zhangPing=newPeople(“20040101”);也可以把上述步驟分開進行,先聲明對象,再實例化對象,最后進行初始化。57對象創(chuàng)建的例子【例】下面的例子將建立雇員信息類EmpInfoB。利用缺省的構(gòu)造方法創(chuàng)建一個雇員對象。并且在主方法中初始化該對象,然后打印出該對象的若干信息。

58

publicclassEmpInfoB{Stringname;//雇員的姓名

Stringdesignation;//雇員的職務(wù)

Stringdepartment;//雇員的部門

voidprint(){//成員方法

System.out.println(name+"是"+department+"的"+designation);}publicstaticvoidmain(Stringargs[]){//主方法

EmpInfoB

emp=newEmpInfoB();//調(diào)用缺省構(gòu)造方法創(chuàng)建對象

=

"張三";//初始化對象emp的成員變量

emp.designation="經(jīng)理";

emp.department=

"銷售部";

emp.print();//調(diào)用對象emp的方法print()}}例子:EmpInfoA對象創(chuàng)建舉例59對象的使用

創(chuàng)建好一個對象之后,就可以使用這個對象。(1)訪問對象的成員變量:通過運算符“.”格式為:對象名.成員變量名例如,在前面例子中:=

"張三";成員變量的訪問也可以用new創(chuàng)建對象,然后直接訪問,不用先聲明對象。例如:newEmpInfoB().name="張三"。(2)調(diào)用對象的方法:也是通過運算符“.”格式為:對象名.方法名([參數(shù)列表])

例如,在前面例子中:emp.print();

同樣,我們也可以用new創(chuàng)建對象,然后直接調(diào)用它的方法,不用先聲明對象。例如:newEmpInfoB().print()。

60對象的清除與垃圾回收

Java運行時,系統(tǒng)通過垃圾收集器周期性地收集無用對象所占用的內(nèi)存,并釋放該內(nèi)存空間,完成對象的清除工作。Java的垃圾收集器自動掃描內(nèi)存,對正在使用的對象做標記,然后把無用對象作為垃圾收集起來,并釋放掉。垃圾收集器作為一個線程單獨運行,當系統(tǒng)的內(nèi)存用盡或者程序中調(diào)用System.gc()方法要求進行垃圾收集時,垃圾收集線程與系統(tǒng)同步運行,否則垃圾收集器在系統(tǒng)空閑時異步地執(zhí)行。在對象作為垃圾被收集器釋放之前,系統(tǒng)會自動調(diào)用對象的方法finalize(),清除對象所占用的資源。

61對象的清除與垃圾回收

雖然Java提供自動的內(nèi)存垃圾收集和處理機制。但是,在某些情況下,例如當一個類被破壞后,需要程序員自己執(zhí)行一些垃圾收集器不能處理的工作。這時可以在類中定義方法finalize(),用來清除對象所占用的資源,它的格式如下:

protectedvoidfinalize()[throwsThrowable]{//撤銷對象}

624.4.1方法概述4.4方法Java程序是由一個個類所組成的,類又有兩個部分:屬性和方法。屬性描述類是什么,方法描述類能做什么。方法是類的主要組成部分。在一個類中,程序的作用主要體現(xiàn)在方法中。方法是一個有名字的子程序。通常分為一個主方法和若干個子方法。主方法調(diào)用其他方法,其他方法之間也可以互相調(diào)用,同一個方法可以被一個或多個方法調(diào)用任意次。

63Java程序的基本結(jié)構(gòu)導(dǎo)入Java類庫;//Import…定義用戶類1{

定義類1的若干變量;定義類1的方法1; ……定義類1的方法M;}定義用戶類2{定義類2的若干變量;定義類2的方法1; ……定義類2的方法N;}……64方法的類型方法的類型可分成兩種:(1)標準方法,Java語言提供了豐富的標準類和標準方法,這些方法提供了程序員所需的許多功能。例如,System.out.println();(2)用戶自定義的方法,以解決用戶專門的需要。Java程序的執(zhí)行是從main方法開始的,調(diào)用其他方法后又回到main方法,在main方法中結(jié)束整個程序的運行。654.4.2定義方法1.聲明方法頭2.聲明方法體Java中聲明方法的語法如下:[修飾符]返回值類型方法名(參數(shù)列表)[

throws例外名1,例外名2,…]{ //方法體:局部變量聲明;語句序列;}publicvoidbrake(inti,j)

{

intx,y;x=i;y=j;…}66

1、聲明方法頭

方法頭一般由方法名、參數(shù)列表、返回類型、方法修飾符和方法拋出的異常五部分組成。注意事項:(1)方法名可以是任何有效的標識符,命名規(guī)則與標識符命名規(guī)則相同。(2)返回類型用來指定方法返回值的類型,方法最多只能返回一個值。(3)參數(shù)列表是方法的輸入接口,它列出了一系列形式參數(shù)的類型和名稱。對于每個行參,調(diào)用方法時必須有一個實參與之對應(yīng),而且該實參的類型必須與行參的類型一致。672、聲明方法體方法頭定義了方法的性質(zhì),方法體則定義了方法的內(nèi)容。注意事項:(1)在一個方法中嵌套定義另一個方法將產(chǎn)生語法錯誤;(2)方法體包含在一對大括號中,即使方法體中沒有語句,一對大括號也是必不可少的。(3)方法頭中如果指定了非void的返回值類型,方法體中就必須包含一條return語句,以保證任何情況下都有返回值。68

聲明方法體的例子classDepartment{

int

m_DeptNo; //部門編號

Stringm_DeptName;//部門名稱

int

m_DeptTotalEmp;//部門雇員數(shù)

int

getDeptNo()//獲取當前對象的部門號{returnm_DeptNo;//返回這個對象的部門號}} 69回顧4.2類

4.3對象4.4方法704.4.3方法的調(diào)用方法按其被調(diào)用的方式可分為兩類:(1)需要程序員書寫專門的調(diào)用命令來調(diào)用的方法,稱為程序調(diào)用方法,例如getDeptNo();(2)系統(tǒng)自動調(diào)用的方法,稱為系統(tǒng)方法。例如main()、action()、paint()、init()等。這兩類方法的定義和使用原則有很大差異。在某個類中調(diào)用該類自身的方法,可以直接使用這個方法的名稱;調(diào)用其他對象或類的方法,則需要使用該對象或類名作為前綴。

71

方法的調(diào)用(實例)classDepartment{

int

m_DeptNo; //部門編號

Stringm_DeptName; //部門名稱

int

m_DeptTotalEmp;//部門雇員數(shù)

int

getDeptNo()//獲取當前對象的部門號

{returnm_DeptNo;//返回這個對象的部門號

}publicstaticvoidmain(String[]args){Departmentdep=newDepartment();

dep.m_DeptNo=100;//訪問對象dep的成員變量

System.out.println("部門號為:"+dep.getDeptNo());

//調(diào)用對象dep的方法}}72

方法的重載(Overloading)同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數(shù)列表,即形式參數(shù)的個數(shù)或類型不能完全相同。例如:幾何圖形類中有多個方法用來繪制不同的圖形,這些方法有相同的名字draw,但形參不一樣,

draw(Pointa,Pointb);

draw(Pointa,Pointb,Pointc);

draw(Pointa,Pointb,Pointc,Pointd);

draw(Pointa,floatradius);ababcabcdaradius重載73

方法的重載(Overloading)幾何圖形類中有四種不同的繪圖方法,我們在調(diào)用draw方法進行繪圖時,是調(diào)用其中哪一個方法呢?其實,這時Java編譯器會根據(jù)您提供的實參的類型和個數(shù)來決定具體調(diào)用其中哪個方法。例如:draw((0,1),(4,12));draw((3,4),2.5);方法重載可以簡化程序的編寫,您只要記住一個方法名,不需要記那么多復(fù)雜的方法名稱。通過提供不同的實參就可以調(diào)用不同的方法來完成不同的功能。構(gòu)造方法也可以重載,其目的是使得用戶可以為同一個類創(chuàng)建初始值不同的對象。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類庫。JavaAPI提供了豐富的標準類和方法,可以執(zhí)行常見的算術(shù)運算、字符、字符串、輸入輸出、錯誤檢查等操作。

1、Math類以及其中的方法2、Math類方法的調(diào)用System.out.println()761、Math類的方法

方法說明方法說明abs(x)x的絕對值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的自然對數(shù)(以e為底)

772、Math類方法的調(diào)用

例如,要計算并且打印出900的平方根,我們需要調(diào)用Math類的方法如下:

System.out.println(Math.sqrt(900));注意:Math類方法的調(diào)用必須在方法名前加上類名Math和點“.”運算符。784.5訪問控制修飾符Java語言新推出“訪問控制修飾符”的概念,允許類創(chuàng)建者聲明哪些東西是類使用者可以使用的,哪些是不可使用的。每個訪問控制修飾符都代表一種訪問控制權(quán)限。這些訪問控制權(quán)限按照權(quán)限的大小可進行如下排序:

public

>

protected

>default(無修飾符)>

private79為類指定訪問權(quán)限的格式: class類名;如果一個類沒有指定為public,則該類的訪問權(quán)限就是缺省的。一、類的訪問控制權(quán)限(2種)public:公共訪問權(quán)限default:缺省訪問權(quán)限[public]80為類中的變量和方法指定訪問權(quán)限的格式: [public|private|protected]數(shù)據(jù)類型變量名; [public|private|protected]返回類型方法名(參數(shù)列表);如果一個變量或方法沒有指定訪問控制修飾符,則該變量或方法的訪問權(quán)限就是缺省的。二、變量和方法的訪問控制權(quán)限(4種)public:公共訪問權(quán)限default:缺省訪問權(quán)限protected:保護訪問權(quán)限private:私有訪問權(quán)限814.5.1公共訪問控制符public類的訪問控制修飾符只有一個:public。一個類被聲明為公共類,表明它可以被所有的其他類所訪問。

注意:公共類可以被所有其他類訪問不代表公共類中的成員也可以被訪問。只有當這些成員也是公共的,才可以訪問。例如:要進入二樓的一個房間,必須首先保證這棟樓的大門是開著的,而且這個房間的門也開著,才可以進入其中。824.5.2缺省訪問控制權(quán)限如果一個類前面沒有訪問控制修飾符,則說明它具有缺省的訪問控制權(quán)限。缺省的訪問控制權(quán)限規(guī)定類只能被同一個包中的類訪問,而不能被其他包中的類訪問。418包1包2包3包n……類defaultclass類名;834.5.3私有訪問控制符private

用private修飾的變量或方法只能被該類本身所訪問,而不能被任何其他的類,包括該類的子類,來訪問。

變量1…n方法1…mprivate父類變量1…n方法1…m子類變量1…n方法1…m其他類84classEmployee{

privateStringname;//成員變量,私有訪問權(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ù)方法是公開的,但是私有方法也經(jīng)常使用。例如那些與類的訪問者無關(guān)的方法就可以設(shè)置為私有的。private方法1(與訪問者無關(guān))public方法2(與訪問者有關(guān))被訪問類變量1…n方法1…m訪問類86publicclassDemo{ publicint

a;//公共的成員變量

privateint

b;//私有的成員變量

publicint

getA(){//公共的成員方法

returna; } privateint

getB(){//私有的成員方法

returnb; } publicDemo(intx,inty){

a=x; //訪問公共成員變量,對其初始化

b=y; //訪問私有成員變量,對其初始化 } publicstaticvoidmain(Stringargs[]){ Demodp=newDemo(1,2);

intw=dp.getA();//訪問公共的成員方法

System.out.println("變量a的值:"+w);

intv=dp.getB();//訪問私有的成員方法

System.out.println("變量b的值:"+v); }}874.5.4保護訪問控制符protected用protected修飾的類成員可以被三種類所訪問:該類本身、與它在同一個包中的其他類、在其他包中的該類的子類。protected的主要作用:允許位于其他包中的子類來訪問父類的成員。4188包1包2protected假設(shè)包1

中的類4

不是包2

中的類1

的子類假設(shè)包1

中的類8

是包2

中的類1

的子類88packagep1;publicclassDemopro{

public

inta;//公共的成員變量

protected

voidmethod()//保護的成員方法 {

System.out.println("Demopro中的公共成員變量a的值:"+a); }}

packagep2;importp1.*;publicclasstest{ publicstaticvoidmain(Stringargs[]){

Demopro

dp=newDemopro();

dp.method();

/*不能訪問Demopro

中的方法method,因為它是受保護的,并且位于不同的包中*/

dp.a=10;//可以訪問Demopro

中的公共成員變量a

System.out.println("Demopro中的公共成員變量a的值:"+dp.a); }}89如果上面的兩個類Demopro

和test位于同一個包中,則上面的語句dp.method()就不會有錯。如果兩個類位于不同的包中且沒有繼承關(guān)系,則對保護類型的變量和方法的訪問將受到限制。因此,上面的dp.method()不能正確執(zhí)行。90歸納上述4種不同的訪問控制修飾符:同一個類同一個包不同包中的子類不同包中的非子類private

√×××默認

√××protected

√×public

權(quán)限遞增914.6靜態(tài)修飾符、初始化塊和方法4.6.1靜態(tài)修飾符static是靜態(tài)修飾符,用來修飾類中的變量和方法。被static修飾的變量稱為靜態(tài)變量,靜態(tài)變量的特點是:它屬于類本身,不屬于類的任何一個具體對象。靜態(tài)變量是一個公共的內(nèi)存單元。92static

intx;類student張三李四實例化xinty;類student張三李四實例化yy屬于屬于屬于共享93靜態(tài)變量靜態(tài)變量是類固有的,可以在創(chuàng)建類以后直接訪問,而非靜態(tài)的成員變量只有在生成對象后才存在,才可以訪問。把靜態(tài)變量稱為類變量,非靜態(tài)變量稱為對象變量。相應(yīng)地,靜態(tài)方法稱為類方法,非靜態(tài)方法稱為對象方法。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());//非法訪問

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)成員可以通過“類名.成員名”或者“對象名.成員名”來訪問,例如在前面的程序中我們就使用了StaticDemo.getX()和a.getX

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論