版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章
面向?qū)ο蠡A(chǔ)朱海波副教授1主要內(nèi)容:
1.面向?qū)ο蠡靖拍?.Java的類與對象3.成員變量與封裝4.成員方法2
理解面向?qū)ο缶幊痰幕靖拍盍私忸惖姆庋b方法如何創(chuàng)建類和對象了解成員變量和成員方法的特性學(xué)習(xí)使用OOP方式進(jìn)行程序設(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對象對象也可以是無生命的個體,比如一輛汽車或一臺計算機(jī)。8對象對象還可以是一件抽象的概念,如天氣的變化或者鼠標(biāo)所產(chǎn)生的事件,或者是一個自然數(shù)。1239對象的屬性和行為環(huán)顧周圍的世界,任何地方都可以看到對象,例如:人、狗、汽車、計算機(jī)、桌子、椅子等等。不管是有生命的對象還是無生命的對象,它們都有一些共同的特征:屬性和行為。10對象的屬性和行為例如,人有姓名、年齡、身高、職業(yè)等屬性,有工作、吃飯、運動等行為。而汽車有形狀、顏色、品牌等屬性,有啟動、加速、剎車、轉(zhuǎn)彎等行為。11軟件對象軟件對象:現(xiàn)實世界中的對象在計算機(jī)中的抽象表示,即仿照現(xiàn)實對象而建立的。軟件對象也有狀態(tài)和行為,軟件對象用變量表示對象的狀態(tài)、用方法來實現(xiàn)對象的行為。一個軟件對象就是變量和相關(guān)方法的集合。軟件對象=變量+方法12軟件對象的特性對象名:唯一標(biāo)識,區(qū)別于其它對象的標(biāo)志,例如car;變量:對象所處的狀態(tài),例如汽車行駛的速度;方法:通過改變對象的狀態(tài),來實現(xiàn)對象的行為,例如通過加速這個方法來改變汽車的速度;接口:與外界通信的通道。注意:今后,在不引起歧義的情況下,我們把軟件對象簡稱為對象。13對象和實體的關(guān)系對象是對現(xiàn)實世界中實體的抽象Why?實體太復(fù)雜啦!How?取其關(guān)心的部分!What?對象是抽象的,對象是部分的!人抽象
142、對象的封裝一個對象的變量(狀態(tài))構(gòu)成這個對象的核心,一般不將其對外公布,而是將對變量進(jìn)行操作的方法對外公開,這樣變量就被隱藏起來。這種將對象的變量置于方法的保護(hù)之下的方式稱為封裝。變量方法外部訪問152、對象的封裝例如:可以把汽車抽象成一個對象,用變量表示它當(dāng)前的狀態(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對象封裝的好處通過將對象進(jìn)行封裝,能把對別的對象來說并不重要的對象的實現(xiàn)細(xì)節(jié)隱蔽起來,從而在使用一個對象時,只需知道調(diào)用它的方法而無需知道該方法是如何實現(xiàn)的。(1)模塊化:一個對象的源代碼的編寫和維護(hù)獨立于其他對象的源代碼,而且,對象的使用也很方便;(2)信息隱蔽:每個對象都有一個公共接口使得其他對象可以與其通信,但對象的私有信息和方法則由它自己維護(hù),并且改變這些私有信息和方法不會影響到使用它的其他對象。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é)生對象、計算機(jī)對象、投影儀對象、擴(kuò)音器對象以及桌子等對象,通過這些對象之間的交互才能順利完成我們的教學(xué)活動。24通過各個對象之間的交互,程序就可以實現(xiàn)更高級的功能以及更復(fù)雜的行為。軟件對象是通過相互間傳遞消息來實現(xiàn)交互的。對象B對象Amessage25當(dāng)對象A想讓對象B執(zhí)行某項任務(wù)時,對象A就向?qū)ο驜傳遞消息。有時,接受消息的對象需要了解更多的信息,以明確它該做什么,這時就需要傳遞一些參數(shù)。例如,要使汽車加速,必須發(fā)給它一個消息,告訴它做何種動作(即加速),以及實現(xiàn)這個動作所需的參數(shù)(即需要達(dá)到的速度等)。發(fā)送消息的實質(zhì)就是要調(diào)用接受消息的對象的方法,所以發(fā)送消息可分為三個步驟:(1)確定接受消息的對象;(2)確定調(diào)用對象的哪個方法;(3)傳遞此方法所需要的參數(shù)。26
一個消息由3個元素所組成:1.消息目標(biāo)對象(你的汽車)。2.執(zhí)行方法的名字(換檔)。3.執(zhí)行方法所需用的參數(shù)(parameters)(低、高速檔)。消息的好處
1.一個對象的行為是通過它的方法來表達(dá),所以消息傳遞支持所有對象之間可能的交互。2.發(fā)送消息的對象與接受消息的對象不需要在相同的程序中,或者相同的機(jī)器上。275、子類和繼承什么是子類?子類是作為另一個類的擴(kuò)充或修正所定義的一個類。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)用方法,或是在轎車?yán)锛恿艘粋€衛(wèi)星導(dǎo)航方法。都是按子類特殊的需要新加的。因此,我們可以發(fā)現(xiàn)越下層的類,其行為越特別。316、對象之間的關(guān)系包含繼承關(guān)聯(lián)32包含關(guān)系汽車對象輪子對象發(fā)動機(jī)對象變速箱對象座位對象……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類的子類。如果在自定義類時,沒有寫明父類,則默認(rèn)的父類為Object。從嚴(yán)格意義上講,Java程序中定義的所有的類都是子類。384.2.1
類的定義
{類成員變量聲明類方法聲明 }類修飾符用來說明類的特殊性質(zhì),分為三種:訪問控制符:public抽象類說明符:abstract最終類說明符:final接口名跟在implements關(guān)鍵字后面,用來說明類中實現(xiàn)了哪個接口定義的功能和方法。接口是Java用來實現(xiàn)多重繼承的一種特殊機(jī)制,我們將在后面詳細(xì)介紹。[修飾符]class類名[extends父類][implements接口名]391.關(guān)于類頭[修飾符]class
類名[extends父類][implements
接口名]
class關(guān)鍵字的后面,應(yīng)跟隨我們所定義的類的名稱。(注意不要把class寫成Class)。父類名跟在extends
關(guān)鍵字后面,用來說明當(dāng)前類是哪個已經(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,…]{ //方法體:局部變量聲明;語句序列;}類的方法有兩種作用:一是對類的屬性進(jìn)行各種操作;二是與其他類或?qū)ο筮M(jìn)行交互,作為一個接口。方法修飾符有四種:訪問控制符: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類成員變量的初始化對類的成員變量進(jìn)行初始化,主要有5種途徑:每種數(shù)據(jù)類型都有默認(rèn)的初始值;可以在聲明成員變量的同時進(jìn)行初始值,inti=10;在類的成員方法中,對成員變量賦值。例如:在main()方法中;在類的構(gòu)造方法中,對成員變量賦值。例如:在前面的構(gòu)造方法的例子中;利用初始化塊對成員變量進(jìn)行初始化。初始化塊是由一對花括號{}括起的語句塊。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)建對象時被調(diào)用。通常,初始化塊先執(zhí)行。534.3對象類是對象的產(chǎn)品模板。在現(xiàn)實世界里,我們使用的是產(chǎn)品而不是產(chǎn)品的圖紙。同樣的道理,Java中運行的應(yīng)該是由類所創(chuàng)建的對象。一個典型的Java程序會創(chuàng)建很多對象,它們通過消息傳遞進(jìn)行相互交流,共同完成程序的功能。一旦任務(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)造方法,進(jìn)行初始化zhangPing=newPeople(“20040101”);zhangYong=newPeople(“20040102”);//創(chuàng)建另一個對象上面三個步驟,通常可以寫成如下簡潔的形式:PeoplezhangPing=newPeople(“20040101”);類名對象名=new類名([參數(shù)列表]);56創(chuàng)建對象相當(dāng)于定義一個變量,既可采用上述方法。PeoplezhangPing=newPeople(“20040101”);PeoplezhangPing;zhangPing=newPeople(“20040101”);也可以把上述步驟分開進(jìn)行,先聲明對象,再實例化對象,最后進(jìn)行初始化。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)存,對正在使用的對象做標(biāo)記,然后把無用對象作為垃圾收集起來,并釋放掉。垃圾收集器作為一個線程單獨運行,當(dāng)系統(tǒng)的內(nèi)存用盡或者程序中調(diào)用System.gc()方法要求進(jìn)行垃圾收集時,垃圾收集線程與系統(tǒng)同步運行,否則垃圾收集器在系統(tǒng)空閑時異步地執(zhí)行。在對象作為垃圾被收集器釋放之前,系統(tǒng)會自動調(diào)用對象的方法finalize(),清除對象所占用的資源。
61對象的清除與垃圾回收
雖然Java提供自動的內(nèi)存垃圾收集和處理機(jī)制。但是,在某些情況下,例如當(dāng)一個類被破壞后,需要程序員自己執(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)標(biāo)準(zhǔn)方法,Java語言提供了豐富的標(biāo)準(zhǔn)類和標(biāo)準(zhǔn)方法,這些方法提供了程序員所需的許多功能。例如,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)方法名可以是任何有效的標(biāo)識符,命名規(guī)則與標(biāo)識符命名規(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()//獲取當(dāng)前對象的部門號{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()//獲取當(dāng)前對象的部門號
{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方法進(jìn)行繪圖時,是調(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提供了豐富的標(biāo)準(zhǔn)類和方法,可以執(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)限的大小可進(jì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:保護(hù)訪問權(quán)限private:私有訪問權(quán)限814.5.1公共訪問控制符public類的訪問控制修飾符只有一個:public。一個類被聲明為公共類,表明它可以被所有的其他類所訪問。
注意:公共類可以被所有其他類訪問不代表公共類中的成員也可以被訪問。只有當(dāng)這些成員也是公共的,才可以訪問。例如:要進(jìn)入二樓的一個房間,必須首先保證這棟樓的大門是開著的,而且這個房間的門也開著,才可以進(jìn)入其中。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保護(hù)訪問控制符protected用protected修飾的類成員可以被三種類所訪問:該類本身、與它在同一個包中的其他類、在其他包中的該類的子類。protected的主要作用:允許位于其他包中的子類來訪問父類的成員。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();
/*不能訪問Demopro
中的方法method,因為它是受保護(hù)的,并且位于不同的包中*/
dp.a=10;//可以訪問Demopro
中的公共成員變量a
System.out.println("Demopro中的公共成員變量a的值:"+dp.a); }}89如果上面的兩個類Demopro
和test位于同一個包中,則上面的語句dp.method()就不會有錯。如果兩個類位于不同的包中且沒有繼承關(guān)系,則對保護(hù)類型的變量和方法的訪問將受到限制。因此,上面的dp.method()不能正確執(zhí)行。90歸納上述4種不同的訪問控制修飾符:同一個類同一個包不同包中的子類不同包中的非子類private
√×××默認(rèn)
√
√××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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鋼材運輸合同模板
- 三方供貨協(xié)議范本2024年
- 個人購房擔(dān)保借款合同一式幾份2024年
- 2024年銀行證券指定交易協(xié)議書范本
- 2024年贊助的合同范本
- 2024年屋面防水合同協(xié)議
- 2024年房地產(chǎn)營銷承包合同
- 2024年一般貨物出口合同范本格式(附英文)
- 2024年馬鈴薯生產(chǎn)購銷合同范本
- 2024年廈門市城市房屋拆遷補(bǔ)償安置協(xié)議書私(僑)房(含非住宅)
- GA 139-2009滅火器箱
- 九年制學(xué)校管理制度匯編
- 人教版小學(xué)數(shù)學(xué)一年級《數(shù)的順序比較大小》PPT教學(xué)課件
- 第六章-復(fù)合材料課件
- 工程圖學(xué)習(xí)題集答案合工大課件
- 環(huán)境規(guī)劃課件
- 七大洲與四大洋課件
- 醫(yī)院關(guān)于成立創(chuàng)傷中心救治團(tuán)隊的通知
- 深度訪談技巧課件
- 北師大八年級上冊數(shù)學(xué)期中知識點梳理
- 惠普的管理流程-詳細(xì)解讀
評論
0/150
提交評論