




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/2/6第1頁(yè)注意:開(kāi)始用功了!2023/2/6第2頁(yè)《Java2實(shí)用教程(第4版)》第4章配合例子源代碼一起使用Powerpoint制作:耿祥義張躍平類(lèi)與對(duì)象2023/2/6第3頁(yè)主要內(nèi)容類(lèi)構(gòu)造方法與對(duì)象的創(chuàng)建類(lèi)與程序的基本結(jié)構(gòu)參數(shù)傳值對(duì)象的組合實(shí)例成員與類(lèi)成員方法重載this關(guān)鍵字包import語(yǔ)句對(duì)象數(shù)組導(dǎo)讀2023/2/6第4頁(yè)§4.1編程語(yǔ)言的幾個(gè)發(fā)展階段
4.1.1面向機(jī)器語(yǔ)言
計(jì)算機(jī)處理信息的早期語(yǔ)言是所謂的機(jī)器語(yǔ)言,使用機(jī)器語(yǔ)言進(jìn)行程序設(shè)計(jì)需要面向機(jī)器來(lái)編寫(xiě)代碼,即需要針對(duì)不同的機(jī)器編寫(xiě)諸如01011100這樣的指令序列。4.1.2面向過(guò)程語(yǔ)言
隨著計(jì)算機(jī)硬件功能的提高,在20世紀(jì)60年代出現(xiàn)了面向過(guò)程設(shè)計(jì)語(yǔ)言,如C語(yǔ)言等。用這些語(yǔ)言編程也稱(chēng)為面向過(guò)程編程。語(yǔ)言把代碼組成叫做過(guò)程或言函數(shù)的塊。每個(gè)塊的目標(biāo)是完成某個(gè)任務(wù)。使用這些語(yǔ)言編寫(xiě)代碼指令時(shí),不必再去考慮機(jī)器指令的細(xì)節(jié),只要按著具體語(yǔ)言的語(yǔ)法要求去編寫(xiě)“源文件”。4.1.3面向?qū)ο笳Z(yǔ)言
基于對(duì)象的編程更加符合人的思維模式,使得編程人員更容易編寫(xiě)出易維護(hù)、易擴(kuò)展和易復(fù)用的程序代碼,更重要的是,面向?qū)ο缶幊坦膭?lì)創(chuàng)造性的程序設(shè)計(jì)。
面向?qū)ο缶幊讨饕w現(xiàn)下列三個(gè)特性
封裝性
繼承
多態(tài)2023/2/6第5頁(yè)§4.2類(lèi)類(lèi)是Java語(yǔ)言中最重要的“數(shù)據(jù)類(lèi)型”,類(lèi)聲明的變量被稱(chēng)作對(duì)象(見(jiàn)后面的4.3節(jié)),即類(lèi)是用來(lái)創(chuàng)建對(duì)象的模板。
類(lèi)的實(shí)現(xiàn)包括兩部分:類(lèi)聲明和類(lèi)體?;靖袷綖椋篶lass類(lèi)名{
類(lèi)體的內(nèi)容}class是關(guān)鍵字,用來(lái)定義類(lèi)?!癱lass類(lèi)名”是類(lèi)的聲明部分,類(lèi)名必須是合法的Java標(biāo)識(shí)符。兩個(gè)大括號(hào)以及之間的內(nèi)容是類(lèi)體。
2023/2/6第6頁(yè)§4.2.1類(lèi)聲明◆類(lèi)聲明:class類(lèi)名以下是兩個(gè)類(lèi)聲明的例子。classPeople{
…}class植物{
…}如:classPeople”和“class植物”稱(chēng)作類(lèi)聲明;“People”和“動(dòng)物”分別是類(lèi)名。◆給類(lèi)命名時(shí),遵守下列編程風(fēng)格(這不是語(yǔ)法要求的,但應(yīng)當(dāng)遵守):1.如果類(lèi)名使用拉丁字母,那么名字的首字母使用大寫(xiě)字母,如。2.類(lèi)名最好容易識(shí)別、見(jiàn)名知意。當(dāng)類(lèi)名由幾個(gè)“單詞”復(fù)合而成時(shí),每個(gè)單詞的首字母使用大寫(xiě)。
2023/2/6第7頁(yè)§4.2.2類(lèi)體
◆類(lèi)聲明之后的一對(duì)大括號(hào)“{”,“}”以及它們之間的內(nèi)容稱(chēng)作類(lèi)體,大括號(hào)之間的內(nèi)容稱(chēng)作類(lèi)體的內(nèi)容。
◆類(lèi)體的內(nèi)容由兩部分構(gòu):一部分是變量的聲明,用來(lái)刻畫(huà)屬性;另一部分是方法的定義,用來(lái)刻畫(huà)行為功能。
classLader{
floatabove;//梯形的上底(變量聲明)
floatbottom;//梯形的下底(變量聲明)floatheight;//梯形的高(變量聲明)
floatarea;//梯形的面積(變量聲明)
floatcomputerArea(){//計(jì)算面積(方法)
area=(above+bottom)*height/2.0f;returnarea;}voidsetHeight(floath){//修改高(方法)
height=h;}}2023/2/6第8頁(yè)§4.2.3成員變量
類(lèi)體中變量聲明部分所聲明的變量被稱(chēng)作成員變量。
1.變量的類(lèi)型:成員變量的類(lèi)型可以是Java中的任何一種數(shù)據(jù)類(lèi)型,包括基本類(lèi)型:整型、浮點(diǎn)型、字符型;引用類(lèi)型:數(shù)組、對(duì)象和接口(對(duì)象和接口見(jiàn)后續(xù)內(nèi)容)。2.變量的有效范圍:成員變量在整個(gè)類(lèi)內(nèi)都有效,其有效性與它在類(lèi)體中書(shū)寫(xiě)的先后位置無(wú)關(guān)3.編程風(fēng)格(1)一行只聲明一個(gè)變量。(2)變量的名字符合標(biāo)識(shí)符規(guī)定。(3)變量名字見(jiàn)名知意,避免容易混淆的變量名字。2023/2/6第9頁(yè)§4.2.4方法
方法的定義包括兩部分:方法聲明和方法體。一般格式為:方法聲明部分{
方法體的內(nèi)容}
1.方法頭
方法頭由方法的類(lèi)型、名稱(chēng)和名稱(chēng)之后的一對(duì)小括號(hào)以及其中的參數(shù)列表所構(gòu)成。無(wú)參數(shù)方法定義的方法頭中沒(méi)有參數(shù)列表,即方法名稱(chēng)之后一對(duì)小括號(hào)中無(wú)任何內(nèi)容,例如:intspeak(){//無(wú)參數(shù)的方法頭return23;}intadd(intx,inty,intz)//有參數(shù)的方法頭{returnx+y+z;}
根據(jù)程序的需要,方法返回的數(shù)據(jù)的類(lèi)型可以是Java中的任何數(shù)據(jù)類(lèi)型之一,當(dāng)一個(gè)方法不需要返回?cái)?shù)據(jù)時(shí),返回類(lèi)型必須是void。參數(shù)是用逗號(hào)隔開(kāi)的一些變量聲明。方法的參數(shù)可以是任意的Java數(shù)據(jù)類(lèi)型。方法的名字必須符合標(biāo)識(shí)符規(guī)定,在給方法命名的習(xí)慣和給變量命名的習(xí)慣相同。2023/2/6第10頁(yè)
2.方法體
方法聲明之后的一對(duì)大括號(hào)“{”
,“}”以及之間的內(nèi)容稱(chēng)為方法的方法體。方法體的內(nèi)容包括局部變量的聲明和Java語(yǔ)句。在方法體內(nèi)可以對(duì)成員變量和方法體中聲明的局部變量進(jìn)行操作。在方法體中聲明的變量和方法的參數(shù)被稱(chēng)作局部變量,如:
intgetSum(intn){//參數(shù)變量n是局部變量
intsum=0;//聲明局部變量sumfor(inti=1;i<=n;i++){//for循環(huán)語(yǔ)句
sum=sum+i;}returnsum;//return語(yǔ)句}和類(lèi)的成員變量不同的是,局部變量只在方法內(nèi)有效,而且與其聲明的位置有關(guān)。方法的參數(shù)在整個(gè)方法內(nèi)有效,方法內(nèi)的局部變量從聲明它的位置之后開(kāi)始有效。如果局部變量的聲明是在一個(gè)復(fù)合語(yǔ)句中,那么該局部變量的有效范圍是該復(fù)合語(yǔ)句,如果局部變量的聲明是在一個(gè)循環(huán)語(yǔ)句中,那么該局部變量的有效范圍是該循環(huán)語(yǔ)句。例如:
publicclassA{voidf(){intm=10,sum=0;//成員變量,在整個(gè)類(lèi)中有效
if(m>9){intz=10;//z僅僅在該復(fù)合語(yǔ)句中有效
z=2*m+z;}for(inti=0;i<m;i++){sum=sum+i;//i僅僅在該循環(huán)語(yǔ)句中有效
}m=sum;//合法,因?yàn)閙和sum有效
z=i+sum;//非法,因?yàn)閕和z已無(wú)效
}}2023/2/6第11頁(yè)3.區(qū)分成員變量和局部變量
如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即該成員變量在這個(gè)方法內(nèi)暫時(shí)失效。例如:
classTom{
intx=10,y;voidf(){
intx=5;y=x+x;//y得到的值是10,不是20。如果方法f中沒(méi)有“intx=5;”,y的值將是20}}如果想在該方法中使用被隱藏的成員變量,必須使用關(guān)鍵字this(在4.9節(jié)this關(guān)鍵字)
classTom{intx=10,y;voidf(){intx=5;y=x+this.x;//y得到的值是15}}2023/2/6第12頁(yè)4.局部變量沒(méi)有默認(rèn)值成員變量有默認(rèn)值(見(jiàn)后面的4.3節(jié)),但局部變量沒(méi)有默認(rèn)值,因此在使用局部變量之前,必須保證局部變量有具體的值。例如:下列InitError類(lèi)無(wú)法通過(guò)編譯
classInitError{intx=10,y;//y的默認(rèn)值是0
voidf(){
intm;//m沒(méi)有默認(rèn)值,但編譯無(wú)錯(cuò)誤
x=y+m;//無(wú)法通過(guò)編譯,因?yàn)樵谑褂胢之前未指定m的值}}
2023/2/6第13頁(yè)§4.2.5需要注意的問(wèn)題
類(lèi)體的內(nèi)容由兩部分構(gòu)成:一部分是變量的聲明,另一部分是方法的定義。
對(duì)成員變量的操作只能放在方法中,方法可以對(duì)成員變量和該方法體中聲明的局部變量進(jìn)行操作。在聲明成員變量時(shí)可以同時(shí)賦予初值,但是不可以在類(lèi)體中有單獨(dú)的賦值語(yǔ)句(不可以有變量的聲明和方法的定義以外的其它語(yǔ)句)。
2023/2/6第14頁(yè)§4.2.6類(lèi)的UML圖
UML(UnifiedModelingLanguageDiagram)圖屬于結(jié)構(gòu)圖,常被用于描述一個(gè)系統(tǒng)的靜態(tài)結(jié)構(gòu)。一個(gè)UML中通常包含有類(lèi)(Class)的UML圖,接口(Interface)的UML圖以及泛化關(guān)系(Generalization)的UML圖、關(guān)聯(lián)關(guān)系(Association)的UML圖、依賴(lài)關(guān)系(Dependency)的UML圖和實(shí)現(xiàn)關(guān)系(Realization)的UML圖。在類(lèi)的UML圖中,使用一個(gè)長(zhǎng)方形描述一個(gè)類(lèi)的主要構(gòu)成,將長(zhǎng)方形垂直地分為三層。第1層是名字層;第2層是變量層,也稱(chēng)屬性層;第3層是方法層,也稱(chēng)操作層。2023/2/6第15頁(yè)§4.3構(gòu)造方法與對(duì)象的創(chuàng)建
類(lèi)是面向?qū)ο笳Z(yǔ)言中最重要的一種數(shù)據(jù)類(lèi)型,那么就可以用它來(lái)聲明變量。在面向?qū)ο笳Z(yǔ)言中,用類(lèi)聲明的變量被稱(chēng)作對(duì)象。和基本數(shù)據(jù)類(lèi)型不同,在用類(lèi)聲明對(duì)象后,還必須要?jiǎng)?chuàng)建對(duì)象,即為聲明的對(duì)象分配變量(確定對(duì)象所具有的屬性),當(dāng)使用一個(gè)類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí),也稱(chēng)給出了這個(gè)類(lèi)的一個(gè)實(shí)例。通俗的講,類(lèi)是創(chuàng)建對(duì)象的“模板”,沒(méi)有類(lèi)就沒(méi)有對(duì)象。構(gòu)造方法和對(duì)象的創(chuàng)建密切相關(guān)。2023/2/6第16頁(yè)§4.3.1構(gòu)造方法
構(gòu)造方法是一種特殊方法,它的名字必須與它所在的類(lèi)的名字完全相同,而且沒(méi)有類(lèi)型。允許一個(gè)類(lèi)中編寫(xiě)若干個(gè)構(gòu)造方法,但必須保證他們的參數(shù)不同,即參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類(lèi)型不同。
需要注意的是如果類(lèi)中沒(méi)有編寫(xiě)構(gòu)造方法,系統(tǒng)會(huì)默認(rèn)該類(lèi)只有一個(gè)構(gòu)造方法,該默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的,且方法體中沒(méi)有語(yǔ)句。
1如果類(lèi)里定義一個(gè)或多個(gè)構(gòu)造方法,那么Java不再提供默認(rèn)的構(gòu)造方法。
2需要特別注意的是,構(gòu)造方法沒(méi)有類(lèi)型。2023/2/6第17頁(yè)§4.3.2創(chuàng)建對(duì)象創(chuàng)建一個(gè)對(duì)象包括對(duì)象的聲明和為對(duì)象分配變量?jī)蓚€(gè)步驟。1.對(duì)象的聲明
一般格式為:類(lèi)的名字對(duì)象名字;如:Laderlader;XiyoujiRenwuzhubajie;2.為聲明的對(duì)象分配變量
使用new運(yùn)算符和類(lèi)的構(gòu)造方法為聲明的對(duì)象分配變量,即創(chuàng)建對(duì)象。如果類(lèi)中沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法,默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的,且方法體中沒(méi)有語(yǔ)句。
例如:zhubajie=newXiyoujiRenwu();
以下是兩個(gè)詳細(xì)的例子。例子1
例子2classXiyoujiRenwu{floatheight,weight;Stringhead,ear;voidspeak(Strings){System.out.println(s);}}publicclassExample4_1{publicstaticvoidmain(Stringargs[]){
XiyoujiRenwuzhubajie;
//聲明對(duì)象
zhubajie=newXiyoujiRenwu();
//為對(duì)象分配變量(使用new和默認(rèn)的構(gòu)造方法)}}2023/2/6第18頁(yè)3.對(duì)象的內(nèi)存模型(1)聲明對(duì)象時(shí)的內(nèi)存模型
(2)對(duì)象分配變量后的內(nèi)存模型(3)創(chuàng)建多個(gè)不同的對(duì)象
一個(gè)類(lèi)通過(guò)使用new運(yùn)算符可以創(chuàng)建多個(gè)不同的對(duì)象創(chuàng)建兩個(gè)對(duì)象:zhubajie、sunwukongzhubajie=newXiyoujiRenwu();sunwukong=newXiyoujiRenwu();創(chuàng)建對(duì)象zhubajie時(shí),XiyoujiRenwu類(lèi)中的成員變量height,weight,head,ear被分配內(nèi)存空間,并返回一個(gè)引用給zhubajie;當(dāng)再創(chuàng)建一個(gè)對(duì)象sunwukong時(shí),XiyoujiRenwu類(lèi)中的成員變量height,weight,head,ear再一次被分配內(nèi)存空間,并返回一個(gè)引用給sunwukong。sunwukong的變量所占據(jù)的內(nèi)存空間和zhubajie的變量所占據(jù)的內(nèi)存空間是互不相同的位置。內(nèi)存模型如下圖4.5所示:
2023/2/6第19頁(yè)§4.3.3使用對(duì)象
1.對(duì)象操作自己的變量(體現(xiàn)對(duì)象的屬性)通過(guò)使用運(yùn)算符“.”對(duì)象操作自己的變量(對(duì)象的屬性)2.對(duì)象調(diào)用類(lèi)中的方法(體現(xiàn)對(duì)象的行為)對(duì)象創(chuàng)建之后,可以使用點(diǎn)運(yùn)算符“.”調(diào)用創(chuàng)建它的類(lèi)中的方法,從而產(chǎn)生一定的行為(功能).3.體現(xiàn)封裝
當(dāng)對(duì)象調(diào)用方法時(shí),方法中出現(xiàn)的成員變量就是指分配給該對(duì)象的變量。在講述類(lèi)的時(shí)候講過(guò):類(lèi)中的方法可以操作成員變量。當(dāng)對(duì)象調(diào)用方法時(shí),方法中出現(xiàn)的成員變量就是指分配給該對(duì)象的變量。例子3中,主類(lèi)的main方法中使用XiyoujiRenwu創(chuàng)建兩個(gè)對(duì)象:zhubajie、sunwukong,運(yùn)行效果如圖4.6。
例子32023/2/6第20頁(yè)§4.3.4對(duì)象的引用和實(shí)體
當(dāng)用類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí),類(lèi)中的成員變量在分配內(nèi)存空間,這些內(nèi)存空間稱(chēng)作該對(duì)象的實(shí)體或?qū)ο蟮淖兞?,而?duì)象中存放著引用。
一個(gè)類(lèi)創(chuàng)建的兩個(gè)對(duì)象,如果具有相同的引用,那么就具有完全相同的實(shí)體。
使用Point類(lèi)分別創(chuàng)建了兩個(gè)對(duì)象p1,p2:Pointp1=newPoint(5,15);Pointp2=newPoint(8,18);
內(nèi)存模型如圖4.9所示
2023/2/6第21頁(yè)假如在程序中使用了如下的賦值語(yǔ)句:p1=p2;即把p2中的引用賦給了p1,因此p1和p2本質(zhì)上是一樣的了.
一個(gè)類(lèi)創(chuàng)建的兩個(gè)對(duì)象,如果具有相同的引用,那么就具有完全相同的實(shí)體(變量)。
內(nèi)存模型由圖4.9變成圖4.10所示。
2023/2/6第22頁(yè)例子4將對(duì)象p2的引用賦給了p1對(duì)象,運(yùn)行效果如圖4.11。
例子42023/2/6第23頁(yè)§4.4類(lèi)與程序的基本結(jié)構(gòu)
一個(gè)Java應(yīng)用程序(也稱(chēng)為一個(gè)工程)是由若干個(gè)類(lèi)所構(gòu)成,這些類(lèi)可以在一個(gè)源文件中,也可以分布在若干個(gè)源文件中,如圖4.12所示。2023/2/6第24頁(yè)例子5
中一共有三個(gè)Java源文件(Example4_5.java
Rect.java
Lader.java
,需要打開(kāi)記事本三次,分別編輯、保存這三個(gè)Java源文件),其中Example4_5.java是含有主類(lèi)的Java源文件。
Java應(yīng)用程序從主類(lèi)的main方法開(kāi)始執(zhí)行。在編寫(xiě)一個(gè)Java應(yīng)用程序時(shí),可以編寫(xiě)若干個(gè)Java源文件,每個(gè)源文件編譯后產(chǎn)生一個(gè)類(lèi)的字節(jié)碼文件。
Example4_5.java
Rect.java
Lader.java
運(yùn)行主類(lèi),程序的輸出結(jié)果是:矩形的面積:2766.5266梯形的面積:1517.07888。2023/2/6第25頁(yè)§4.5參數(shù)傳值
方法中最重要的部分之一就是方法的參數(shù),參數(shù)屬于局部變量,當(dāng)對(duì)象調(diào)用方法時(shí),參數(shù)被分配內(nèi)存空間,并要求調(diào)用者向參數(shù)傳遞值,即方法被調(diào)用時(shí),參數(shù)變量必須有具體的值。2023/2/6第26頁(yè)§4.5.1傳值機(jī)制
在Java中,方法的所有參數(shù)都是“傳值”的,也就是說(shuō),方法中參數(shù)變量的值是調(diào)用者指定的值的拷貝。例如,如果向方法的int型參數(shù)x傳遞一個(gè)int值,那么參數(shù)x得到的值是傳遞的值的拷貝。2023/2/6第27頁(yè)§4.5.2基本數(shù)據(jù)類(lèi)型參數(shù)的傳值
對(duì)于基本數(shù)據(jù)類(lèi)型的參數(shù),向該參數(shù)傳遞的值的級(jí)別不可以高于該參數(shù)的級(jí)別。
例子6
中有一個(gè)源文件Example4_6.java
Example4_6.java在主類(lèi)的main方法中使用Computer類(lèi)來(lái)創(chuàng)建對(duì)象,該對(duì)象可以調(diào)用add(intx,inty)計(jì)算兩個(gè)整數(shù)之和,因此,Computer類(lèi)的對(duì)象在調(diào)用add(intx,inty)方法時(shí),必須向方法的參數(shù)傳遞值Example4_6.java2023/2/6第28頁(yè)§4.5.3引用類(lèi)型參數(shù)的傳值
當(dāng)參數(shù)是引用類(lèi)型時(shí),“傳值”傳遞的是變量中存放的“引用”,而不是變量所引用的實(shí)體。如圖4.13所示
2023/2/6第29頁(yè)
例子7模擬收音機(jī)使用電池。例子7中使用的主要類(lèi)如下。Radio類(lèi)負(fù)責(zé)創(chuàng)建一個(gè)“收音機(jī)”對(duì)象(Radio類(lèi)在Radio.java中)。Battery類(lèi)負(fù)責(zé)創(chuàng)建“電池”對(duì)象(Battery類(lèi)在Battery.java中)。Radio類(lèi)創(chuàng)建的“收音機(jī)”對(duì)象調(diào)用openRadio(Batterybattery)方法時(shí),需要將一個(gè)Battery類(lèi)創(chuàng)建“電池”對(duì)象傳遞給該方法的參數(shù)battery,即模擬收音機(jī)使用電池。在主類(lèi)(Example4_7.java
)中將Battery類(lèi)創(chuàng)建“電池”對(duì)象:nanfu,傳遞給openRadio(Batterybattery)方法的參數(shù)battery,該方法消耗了battery的儲(chǔ)電量(打開(kāi)收音機(jī)會(huì)消耗電池的儲(chǔ)電量),那么nanfu的儲(chǔ)電量就發(fā)生了同樣的變化例子7(Battery.java
,Radio.java
,Example4_7.java
)收音機(jī)使用電池的示意圖以及程序的運(yùn)行效果如圖4.14(a)和4.14(b)。
2023/2/6第30頁(yè)
例子8中(運(yùn)行效果如圖4.15)模擬圓錐用圓作為底,涉及的類(lèi)如下。Circle類(lèi)負(fù)責(zé)創(chuàng)建圓對(duì)象。
Circular類(lèi)負(fù)責(zé)創(chuàng)建圓錐對(duì)象,Circular類(lèi)創(chuàng)建圓錐對(duì)象時(shí),需要將
Circle類(lèi)的實(shí)例:即“圓”對(duì)象的引用傳遞給圓錐對(duì)象的Circle類(lèi)型的成員變量
Circle.java
,Circular.java
,Example4_8.java
2023/2/6第31頁(yè)§4.6對(duì)象的組合
一個(gè)類(lèi)可以把對(duì)象作為自己的成員變量,如果用這樣的類(lèi)創(chuàng)建對(duì)象,那么該對(duì)象中就會(huì)有其它對(duì)象,也就是說(shuō)該對(duì)象將其他對(duì)象作為自己的組成部分,或者說(shuō)該對(duì)象是由幾個(gè)對(duì)象組合而成。2023/2/6第32頁(yè)§4.6.1組合與復(fù)用
如果一個(gè)對(duì)象a組合了對(duì)象b,那么對(duì)象a就可以委托對(duì)象b調(diào)用其方法,即對(duì)象a以組合的方式復(fù)用對(duì)象b的方法。例如,圓錐對(duì)象在計(jì)算體積時(shí),首先委托圓錐的底(一個(gè)Circle對(duì)象)bottom調(diào)用getArea()方法計(jì)算底的面積,然后圓錐對(duì)象再計(jì)算出自身的體積例子9模擬手機(jī)和SIM卡的組合關(guān)系。涉及的類(lèi)如下:l
SIM類(lèi)負(fù)責(zé)創(chuàng)建SIM卡SIM.java
。l
MobileTelephone類(lèi)負(fù)責(zé)創(chuàng)建手機(jī)MobileTelephone.java
,手機(jī)可以組合一個(gè)SIM卡,并可以調(diào)用setSIM(SIMcard)方法更改其中的SIM卡。程序運(yùn)行效果如圖4.20。SIM.java
,MobileTelephone.java
,Example4_9.java2023/2/6第33頁(yè)§4.6.2關(guān)聯(lián)關(guān)系和依賴(lài)關(guān)系的UML圖
1
關(guān)聯(lián)關(guān)系
2依賴(lài)關(guān)系
2023/2/6第34頁(yè)§4.7實(shí)例成員與類(lèi)成員
§4.7.1實(shí)例變量和類(lèi)變量的聲明
在聲明成員變量時(shí),用關(guān)鍵字static給予修飾的稱(chēng)作類(lèi)變量,否則稱(chēng)作實(shí)例變量(類(lèi)變量也稱(chēng)為static變量,靜態(tài)變量)。2023/2/6第35頁(yè)§4.7.2實(shí)例變量和類(lèi)變量的區(qū)別
1.不同對(duì)象的實(shí)例變量互不相同
2.所有對(duì)象共享類(lèi)變量
3.通過(guò)類(lèi)名直接訪(fǎng)問(wèn)類(lèi)變量
2023/2/6第36頁(yè)例子10中的Lader.java中的Lader類(lèi)創(chuàng)建的梯形對(duì)象共享一個(gè)下底。程序運(yùn)行效果如圖4.23。
Lader.java
,Example4_10.java
2023/2/6第37頁(yè)§4.7.3實(shí)例方法和類(lèi)方法的定義
類(lèi)中的方法也可分為實(shí)例方法和類(lèi)方法。方法聲明時(shí),方法類(lèi)型前面不加關(guān)鍵字static修飾的是實(shí)例方法、加static關(guān)鍵字修飾的是類(lèi)方法(靜態(tài)方法)。
2023/2/6第38頁(yè)§4.7.4實(shí)例方法和類(lèi)方法的區(qū)別
1.對(duì)象調(diào)用實(shí)例方法當(dāng)對(duì)象調(diào)用實(shí)例方法時(shí),該方法中出現(xiàn)的實(shí)例變量就是分配給該對(duì)象的實(shí)例變量;該方法中出現(xiàn)的類(lèi)變量也是分配給該對(duì)象的變量,只不過(guò)這個(gè)變量和所有的其他對(duì)象共享而已。
2.類(lèi)名調(diào)用類(lèi)方法從而類(lèi)方法不僅可以被類(lèi)創(chuàng)建的任何對(duì)象調(diào)用執(zhí)行,也可以直接通過(guò)類(lèi)名調(diào)用。和實(shí)例方法不同的是,類(lèi)方法不可以操作實(shí)例變量,這是因?yàn)樵陬?lèi)創(chuàng)建對(duì)象之前,實(shí)例成員變量還沒(méi)有分配內(nèi)存。2023/2/6第39頁(yè)在下面的例子11中,首先將一個(gè)數(shù)組排序,然后使用二分法判斷用戶(hù)從鍵盤(pán)輸入的整數(shù)是否和數(shù)組中某個(gè)元素的值相同,即是否在數(shù)組中。
例子11Java類(lèi)庫(kù)提供的Array類(lèi)提供的static方法:publicstaticvoidsort(doublea[]):排序數(shù)組a和publicstaticintbinarySearch(double[]a,doublenumber):判斷參數(shù)number指定的數(shù)值是否在參數(shù)a指定的數(shù)組中
2023/2/6第40頁(yè)§4.8方法重載與多態(tài)publicclassMethodOverload{publicstaticvoidmain(String[]args){System.out.println("Thesquareofinteger7is"+square(7));System.out.println("\nThesquareofdouble7.5is"+square(7.5));}publicstaticintsquare(intx){returnx*x;}publicstaticdoublesquare(doubley){returny*y;}}請(qǐng)看下段代碼有什么特殊之處2023/2/6第41頁(yè)§4.8方法重載與多態(tài)“方法的返回值不能作為方法重載的判斷條件“兩個(gè)或多個(gè)方法才能構(gòu)成“重載關(guān)系”方法名一致參數(shù)類(lèi)型不同,參數(shù)個(gè)數(shù)不同,或者是參數(shù)類(lèi)型的順序不同重載的條件需要注意2023/2/6第42頁(yè)§4.8方法重載與多態(tài)方法重載的意思是:一個(gè)類(lèi)中可以有多個(gè)方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類(lèi)型不同。4.8.1方法重載的語(yǔ)法規(guī)則例子12中的People類(lèi)中hello方法是重載方法,運(yùn)行效果如圖4.26。例12例子13中Student類(lèi)(Student.java,Circle.java,Tixing.java,Example4_13.java)中的computerArea方法是重載方法。程序運(yùn)行效果如圖4.27。例132023/2/6第43頁(yè)§4.9this關(guān)鍵字this是Java的一個(gè)關(guān)鍵字,表示當(dāng)前對(duì)象。this可以出現(xiàn)在實(shí)例方法和構(gòu)造方法中。this關(guān)鍵字出現(xiàn)在類(lèi)的構(gòu)造方法中時(shí),代表使用該構(gòu)造方法所創(chuàng)建的對(duì)象.當(dāng)this關(guān)鍵字出現(xiàn)實(shí)例方法中時(shí),this就代表正在調(diào)用該方法的當(dāng)前對(duì)象。
2023/2/6第44頁(yè)§4.9.1在構(gòu)造方法中使用this
this關(guān)鍵字出現(xiàn)在類(lèi)的構(gòu)造方法中時(shí),代表使用該構(gòu)造方法所創(chuàng)建的對(duì)象。例子14中,People類(lèi)的構(gòu)造方法中使用了this
2023/2/6第45頁(yè)§4.9.2在實(shí)例方法中使用this
實(shí)例方法必須只能通過(guò)對(duì)象來(lái)調(diào)用,不能用類(lèi)名來(lái)調(diào)用。當(dāng)this關(guān)鍵字出現(xiàn)在實(shí)例方法中時(shí),代表正在調(diào)用該方法的當(dāng)前對(duì)象。實(shí)例方法可以操作類(lèi)的成員變量,當(dāng)實(shí)例成員變量在實(shí)例方法中出現(xiàn)時(shí),默認(rèn)的格式是:this.成員變量;當(dāng)類(lèi)的其它方法被實(shí)例方法調(diào)用時(shí),默認(rèn)的格式是:this.方法;
當(dāng)static成員變量在實(shí)例方法中出現(xiàn)時(shí),默認(rèn)的格式是:
類(lèi)名.成員變量;
classA{intx;staticinty;voidf(){this.x=100;//可省略thisA.y=200;//可省略this}}classB{voidf(){this.g();//可省略B.h=200;//可省略}voidg(){System.ouy.println(“OK”);}staticvoidh(){System.out.println(“hello”);}舉例:2023/2/6第46頁(yè)publicclassThisTest{privateinti=0;
ThisTest(inti){this.i=i+1;}//this引用成員變量i
ThisTest(Strings){System.out.println("Stringconstructor:"+s);}ThisTest(inti,Strings){this(s);//this調(diào)用構(gòu)造函數(shù)2
this.i=i++;
}//this以引用該類(lèi)的成員變量publicThisTestf(){this.i++;returnthis;//返回當(dāng)前的對(duì)象,該對(duì)象屬于(ThisTest)}}this關(guān)鍵字
2023/2/6第47頁(yè)this表示類(lèi)中的屬性和構(gòu)造方法this可調(diào)用本類(lèi)中的構(gòu)造方法表示當(dāng)前對(duì)象this關(guān)鍵字
注:this不能出現(xiàn)在類(lèi)方法中當(dāng)成員變量名和局部變量名相同時(shí),this關(guān)鍵字不可以省略2023/2/6第48頁(yè)§4.10包
包是Java語(yǔ)言中有效地管理類(lèi)的一個(gè)機(jī)制。包名的目的是有效的區(qū)分名字相同的類(lèi)。不同Java源文件中兩個(gè)類(lèi)名字相同時(shí),它們可以通過(guò)隸屬不同的包來(lái)相互區(qū)分。2023/2/6第49頁(yè)§4.10.1包語(yǔ)句
通過(guò)關(guān)鍵字package聲明包語(yǔ)句。package語(yǔ)句作為Java源文件的第一條語(yǔ)句,指明該文件中定義的類(lèi)所在的包。(若缺省該語(yǔ)句,則指定為無(wú)名包)。package語(yǔ)句的一般格式為:
package包名;
包對(duì)應(yīng)于文件系統(tǒng)的目錄,package語(yǔ)句中,用‘.’來(lái)指明包(目錄)的層次;包通常用小寫(xiě)單詞,類(lèi)名首字母通常大寫(xiě)。2023/2/6第50頁(yè)§4.10.2有包名的類(lèi)的存儲(chǔ)目錄
程序如果使用了包語(yǔ)句,例如:
packagetom.jiafei;那么存儲(chǔ)文件的目錄結(jié)構(gòu)中必須包含有如下的結(jié)構(gòu)
…\tom\jiafei
如:c:\1000\tom\jiafei并且要將源文件編譯得到的類(lèi)的字節(jié)碼文件保存在目錄c:\1000\tom\jiafei中(源文件可以任意存放)。2023/2/6第51頁(yè)§4.10.3運(yùn)行有包名的主類(lèi)
如果主類(lèi)的包名是tom.jiafei,那么主類(lèi)的字節(jié)碼一定存放在…\tom\jiefei目錄中,運(yùn)行時(shí)必須到tom\jiefei的上一層(即tom的父目錄)目錄中去運(yùn)行主類(lèi)。假設(shè)tom\jiefei的上一層目錄是1000,那么,必須如下格式來(lái)運(yùn)行:C:\1000\javatom.jiafei.主類(lèi)名
例子15中的Student.java和Example4_15.java使用了包語(yǔ)句。例子15的編譯、運(yùn)行效果如圖4.28。
2023/2/6第52頁(yè)§4.11import語(yǔ)句一個(gè)類(lèi)可能需要另一個(gè)類(lèi)聲明的對(duì)象作為自己的成員或方法中的局部變量,如果這兩個(gè)類(lèi)在同一個(gè)包中,當(dāng)然沒(méi)有問(wèn)題。如果一個(gè)類(lèi)想要使用的那個(gè)類(lèi)和它不在一個(gè)包中,要使用import語(yǔ)句完成使命。import語(yǔ)句告訴編譯器到哪里去尋找類(lèi)2023/2/6第53頁(yè)§4.11.1引入類(lèi)庫(kù)中的類(lèi)
如果用戶(hù)需要類(lèi)庫(kù)中的類(lèi)就可以使用import語(yǔ)句,如:
importjava.until.Date;引入java.util包中的Date類(lèi).例子16中的Example4_16.java使用了import語(yǔ)句,運(yùn)行效果如圖4.29
圖4.29引入類(lèi)庫(kù)中的類(lèi)java.lang----包含一些Java語(yǔ)言的核心類(lèi),如String、Math、Integer、System和Thread,提供常用功能。----包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類(lèi)。java.io----包含能提供多種輸入/輸出功能的類(lèi)。java.util----包含一些實(shí)用工具類(lèi),如定義系統(tǒng)特性、使用與日期日歷相關(guān)的函數(shù)。2023/2/6第54頁(yè)§4.11.2引入自定義包中的類(lèi)
用戶(hù)程序也可以使用import語(yǔ)句引入非類(lèi)庫(kù)中有包名的類(lèi),如:importtom.jiafei.*;在用戶(hù)程序所在目錄下建立和包相對(duì)應(yīng)的子目錄結(jié)構(gòu),比如用戶(hù)程序所在目錄是C:\ch4,想使用import語(yǔ)句引入tom.jiafei包中的類(lèi),那么根據(jù)包名建立如下的目錄結(jié)構(gòu):C:\ch4\tom\jiafei2023/2/6第55頁(yè)將例子17中的Triangle.java源文件保存到C:\ch4\sohu\com中,并編譯通過(guò),以便使得ch4目錄下的類(lèi)能使用import語(yǔ)句引入Triangle類(lèi)。例子18中的Example4_18.java中的主類(lèi)(無(wú)包名)使用import語(yǔ)句引入包中的Triangle類(lèi),以便創(chuàng)建三角形,并計(jì)算三角形的面積。將Example4_18.java保存在C:\ch4目錄中(因?yàn)閏h4下有sohu\com子目錄)。程序運(yùn)行效果如圖4.30。
2023/2/6第56頁(yè)§4.12訪(fǎng)問(wèn)權(quán)限當(dāng)用一個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象之后,該對(duì)象可以通過(guò)“.”運(yùn)算符操作自己的變量、使用類(lèi)中的方法,但對(duì)象操作自己的變量和使用類(lèi)中的方法是有一定限制的。
2023/2/6第57頁(yè)§4.12.1何謂訪(fǎng)問(wèn)權(quán)限
所謂訪(fǎng)問(wèn)權(quán)限是指對(duì)象是否可以通過(guò)“.”運(yùn)算符操作自己的變量或通過(guò)“.”運(yùn)算符使用類(lèi)中的方法。
訪(fǎng)問(wèn)限制修飾符有private、protected和public,都是Java的關(guān)鍵字,用來(lái)修飾成員變量或方法。
在編寫(xiě)類(lèi)時(shí),類(lèi)中的實(shí)例方法總是可以操作該類(lèi)中的實(shí)例變量和類(lèi)變量;類(lèi)方法總是可以操作該類(lèi)中的類(lèi)變量,與訪(fǎng)問(wèn)限制符無(wú)關(guān)。2023/2/6第58頁(yè)§4.12.2私有變量和私有方法
用關(guān)鍵字private修飾的成員變量和方法稱(chēng)為私有變量和私有方法。對(duì)于私有成員變量或方法,只有在本類(lèi)中創(chuàng)建該類(lèi)的對(duì)象時(shí),這個(gè)對(duì)象才能訪(fǎng)問(wèn)自己的私有成員變量和類(lèi)中的私有方法。
某個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建對(duì)象后,如果不希該對(duì)象直接訪(fǎng)問(wèn)自己的變量,即通過(guò)“.”運(yùn)算符來(lái)操作自己的成員變量,就應(yīng)當(dāng)將該成員變量訪(fǎng)問(wèn)權(quán)限設(shè)置為private。面向?qū)ο缶幊烫岢珜?duì)象應(yīng)當(dāng)調(diào)用方法來(lái)改變自己的屬性,類(lèi)應(yīng)當(dāng)提供操作數(shù)據(jù)的方法,這些方法可以經(jīng)過(guò)精心的設(shè)計(jì),使得對(duì)數(shù)據(jù)的操作更加合理,如例子19(Example4_19.java,Student.java
)所示。
注:在除了本類(lèi)以外的類(lèi)中,私有類(lèi)變量或類(lèi)方法均不能通過(guò)類(lèi)名操作或調(diào)用2023/2/6第59頁(yè)§4.12.3共有變量和共有方法用public修飾的成員變量和方法被稱(chēng)為共有變量和共有方法
。
我們?cè)谌魏我粋€(gè)類(lèi)中用類(lèi)Tom創(chuàng)建了一個(gè)對(duì)象后,該對(duì)象能訪(fǎng)問(wèn)自己的public變量和類(lèi)中的public方法(也可以通過(guò)類(lèi)名來(lái)操作成員變量、方法)。2023/2/6第60頁(yè)§4.12.4友好變量和友好方法當(dāng)在另外一個(gè)類(lèi)中用類(lèi)Tom創(chuàng)建了一個(gè)對(duì)象后,如果這個(gè)類(lèi)與Tom類(lèi)在同一個(gè)包中,那么該對(duì)象能訪(fǎng)問(wèn)自己的友好變量和友好方法。在任何一個(gè)與Tom同一包中的類(lèi)中,也可以通過(guò)Tom類(lèi)的類(lèi)名訪(fǎng)問(wèn)Tom類(lèi)的類(lèi)友好成員變量和類(lèi)友好方法。classJerry{voidg(){Tomcat=newTom();cat.weight=23f;//合法floatsum=cat.f(3,4);//合法}}當(dāng)Jerry和Tom在同一包中時(shí):注:如果源文件使用import語(yǔ)句引入了另外一個(gè)包中的類(lèi),并用該類(lèi)創(chuàng)建了一個(gè)對(duì)象,該對(duì)象將不能訪(fǎng)問(wèn)自己的友好變量和友好方法。2023/2/6第61頁(yè)§4.12.5受保護(hù)的成員變量和方法用protected修飾的成員變量和方法被稱(chēng)為受保護(hù)的成員變量和受保護(hù)的方法,例如:classTom{protectedfloatweight;
//weight是protected的float型變量protectedfloatf(floata,floatb){
//方法f是protected方法returna+b;}}classJerry{voidg(){Tomcat=newTom();cat.weight=23f;//合法floatsum=cat.f(2,4);//合法}}Tom和Jerry在同一個(gè)包中時(shí)合法的2023/2/6第62頁(yè)§4.12.6public類(lèi)與友好類(lèi)
類(lèi)聲明時(shí),如果在關(guān)鍵字class前面加上public關(guān)鍵字,就稱(chēng)這樣的類(lèi)是一個(gè)public類(lèi)。可以在任何另外一個(gè)類(lèi)中,使用public類(lèi)創(chuàng)建對(duì)象。
如果一個(gè)類(lèi)不加public修飾,這樣的類(lèi)被稱(chēng)作友好類(lèi)。在另外一個(gè)類(lèi)中使用友好類(lèi)創(chuàng)建對(duì)象時(shí),要保證它們是在同一包中。注:不能用procted和private修飾類(lèi)訪(fǎng)問(wèn)限制符的訪(fǎng)問(wèn)權(quán)限2023/2/6第63頁(yè)§4.13基本類(lèi)型的類(lèi)封裝
Java的基本數(shù)據(jù)類(lèi)型包括:byte、int、short、long、float、double、char。Java提供了基本數(shù)據(jù)類(lèi)型相關(guān)的類(lèi),實(shí)現(xiàn)了對(duì)基本數(shù)據(jù)類(lèi)型的封裝。這些類(lèi)分別是:Byte、Integer、Short、Long、Float、Double和Character類(lèi)。這些類(lèi)在java.lang包中。2023/2/6第64頁(yè)§4.13.1Double和Float類(lèi)
Double類(lèi)和Float類(lèi)實(shí)現(xiàn)了對(duì)double和float基本型數(shù)據(jù)的類(lèi)包裝。Double類(lèi)的構(gòu)造方法:Double(doublenum)Float類(lèi)的構(gòu)造方法:Float(floatnum)Double對(duì)象調(diào)用doubleValue()方法可以返回該對(duì)象含有的double型數(shù)據(jù)。
Float對(duì)象調(diào)用floatValue()方法可以返回該對(duì)象含有的float型數(shù)據(jù)。例如:publicclassTest{publicstaticvoidmain(String[]args){Doubledouble1=newDouble(5);System.out.println(double1.doubleValue());Floatfloat1=newFloat(6);System.out.println(float1.floatValue());}}2023/2/6第65頁(yè)§4.13.2Byte、Short、Integer、Long類(lèi)上述類(lèi)的構(gòu)造方法分別:
Byte(bytenum)Short(shortnum)Integer(intnum)Long(longnum)Byte、Short、Integer和Long對(duì)象分別調(diào)用byteValue()、shortValue()、intValue()和longValue()方法返回該對(duì)象含有的基本型數(shù)據(jù)。
2023/2/6第66頁(yè)§4.13.3Character類(lèi)
Character類(lèi)實(shí)現(xiàn)了對(duì)char基本型數(shù)據(jù)的類(lèi)包裝。Character類(lèi)的構(gòu)造方法:Character(charc)Character類(lèi)中的一些常用類(lèi)方法:publicstaticbooleanisDigit(charch)ch是數(shù)字字符返回true。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)進(jìn)口大豆協(xié)議書(shū)
- 征收部門(mén)協(xié)議書(shū)公開(kāi)
- 土地占地糾紛協(xié)議書(shū)
- 中日大額轉(zhuǎn)賬協(xié)議書(shū)
- 農(nóng)村建房糾紛協(xié)議書(shū)
- 托運(yùn)配送協(xié)議書(shū)范本
- 線(xiàn)上營(yíng)銷(xiāo)服務(wù)協(xié)議書(shū)
- 法院庭前和解協(xié)議書(shū)
- 公房買(mǎi)賣(mài)協(xié)議書(shū)范本
- 合伙抵押協(xié)議書(shū)范本
- 幕墻UHPC施工專(zhuān)項(xiàng)方案 (評(píng)審版)
- 醫(yī)院安保服務(wù)投標(biāo)方案醫(yī)院保安服務(wù)投標(biāo)方案(技術(shù)方案)
- 2024年415全民國(guó)家安全教育日知識(shí)競(jìng)賽測(cè)試題庫(kù)
- DB33 1036-2021 公共建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)
- 2024光伏并網(wǎng)柜技術(shù)規(guī)范
- 尼康D3200中文說(shuō)明書(shū)(完整版)
- 過(guò)敏性休克搶救應(yīng)急演練
- 脫硫培訓(xùn)課件大綱
- 諾如病毒課件教學(xué)課件
- 鋼結(jié)構(gòu)廊架工程施工方案
評(píng)論
0/150
提交評(píng)論