版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章Java與面向?qū)ο蠹夹g(shù)1、面向?qū)ο蟮母拍?、Java中的類(lèi)、方法和變量3、Java名字空間及訪問(wèn)規(guī)則4、Java中的抽象類(lèi)、接口和程序包5、對(duì)象的構(gòu)造方法6.初始化塊
所謂面向?qū)ο蟮姆椒▽W(xué),就是使我們分析、設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng)的方法盡可能地接近我們認(rèn)識(shí)一個(gè)系統(tǒng)的方法。包括:1、面向?qū)ο蟮母拍?/p>
面向?qū)ο蟮姆治觯∣OA,Object-OrientedAnalysis)面向?qū)ο蟮脑O(shè)計(jì)(OOD,Object-OrientedDesign)面向?qū)ο蟮某绦蛟O(shè)計(jì)(OOPL,Object-OrientedProgram)面向?qū)ο蠹夹g(shù)主要圍繞以下幾個(gè)概念:
對(duì)象、抽象數(shù)據(jù)類(lèi)型、類(lèi)、類(lèi)型層次(子類(lèi))、繼承性、多態(tài)性。
對(duì)象有兩個(gè)層次的概念:變量方法1、面向?qū)ο蟮母拍?/p>
——對(duì)象
現(xiàn)實(shí)生活中對(duì)象指的是客觀世界的實(shí)體;
程序中對(duì)象就是一組變量和相關(guān)方法的集合,其中變量表明對(duì)象的狀態(tài),方法表明對(duì)象所具有的行為?,F(xiàn)實(shí)生活中的對(duì)象可以將現(xiàn)實(shí)生活中的對(duì)象經(jīng)過(guò)抽象,映射為程序中的對(duì)象。ClassCar{intcolor_number;intdoor_number;
intspeed;
voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}
抽象數(shù)據(jù)類(lèi)型1、面向?qū)ο蟮母拍?/p>
——對(duì)象
對(duì)象在程序中是通過(guò)一種抽象數(shù)據(jù)類(lèi)型來(lái)描述的,這種抽象數(shù)據(jù)類(lèi)型稱(chēng)為類(lèi)(Class)。程序中的對(duì)象是類(lèi)的一個(gè)實(shí)例,是一個(gè)軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。1、面向?qū)ο蟮母拍?/p>
——類(lèi)相似的對(duì)象可以歸并到同一個(gè)類(lèi)中去,就像傳統(tǒng)語(yǔ)言中的變量與類(lèi)型關(guān)系一樣。
類(lèi)是描述對(duì)象的“基本原型”,它定義一類(lèi)對(duì)象所能擁有的數(shù)據(jù)和能完成的操作。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類(lèi)是程序的基本單元。……Carcar1;Carcar2;…
…CarcarN;1、面向?qū)ο蟮母拍?/p>
——類(lèi)消息軟件對(duì)象通過(guò)相互間傳遞消息來(lái)相互作用和通信,一個(gè)消息由三部分組成:1.接受消息的對(duì)象
2.接收對(duì)象要采取的方法
3.方法需要的參數(shù)對(duì)象B對(duì)象A消息1、面向?qū)ο蟮母拍?/p>
——類(lèi)變量:指對(duì)象的所知道的狀態(tài)。方法:指對(duì)象的功能單元。一個(gè)例子classHello{
}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}變量方法showString()方法changeString()1、面向?qū)ο蟮母拍睢?lèi)調(diào)用對(duì)象的方法相當(dāng)于給對(duì)象發(fā)送消息,收到消息的對(duì)象通過(guò)改變自身的狀態(tài)或者向其它對(duì)象發(fā)送消息來(lái)響應(yīng)消息。在程序中所操作的對(duì)象是類(lèi)的一個(gè)實(shí)例。創(chuàng)建一個(gè)對(duì)象:Helloobj=newHello();調(diào)用方法:obj.changeString(“dance”);
為什么要使用類(lèi)?1、面向?qū)ο蟮母拍?/p>
——類(lèi)采用簡(jiǎn)單數(shù)據(jù)類(lèi)型表示現(xiàn)實(shí)世界中概念的存在很大的局限性。例如:采用int型數(shù)據(jù)表示一個(gè)日期概念,需要使用3個(gè)變量:
intday,month,year;
使用類(lèi)可以把現(xiàn)實(shí)問(wèn)題中的對(duì)象映射為程序中的一個(gè)整體——類(lèi)。如果要表示2個(gè)人的生日,就要使用6個(gè)變量并且在使用中必須時(shí)刻注意三者的聯(lián)系和約束關(guān)系intday1,month1,year1;intday2,month2,year2;類(lèi)中不但有變量,還有與之相關(guān)的操作所定義的方法。將變量和方法封裝在一個(gè)類(lèi)中,可以對(duì)成員變量進(jìn)行隱藏,外部對(duì)類(lèi)成員的訪問(wèn)都通過(guò)方法進(jìn)行,能夠保護(hù)類(lèi)成員不被非法修改。classBirthDate{publicintday,month,year;publicinttomorrow(){}}BirthDatemybirth,yourbirth;1、面向?qū)ο蟮母拍?/p>
——類(lèi)BirthDatelily;lily.day=31;lily.month=5;lily.year=1992;已知當(dāng)前日期對(duì)象,求第2天的日期對(duì)象:lily.day=lily.day+1;如果lily.day已經(jīng)為31,操作結(jié)果是非法狀態(tài)。使用類(lèi)的另一個(gè)方便之處,就是操作上的方便為什么要使用類(lèi)?可以定義一個(gè)成員方法tomorrow(),求第2天的日期對(duì)象。外部要獲得當(dāng)前日期的后一天時(shí),只要調(diào)用: lily.tomorrow();封裝把對(duì)象的所有組成部分組合在一起私有數(shù)據(jù)
方法
方法數(shù)據(jù)對(duì)象A對(duì)象B公有數(shù)據(jù)封裝定義程序如何引用對(duì)象的數(shù)據(jù),封裝實(shí)際上使用方法將類(lèi)的數(shù)據(jù)隱藏起來(lái),控制用戶(hù)對(duì)類(lèi)的修改和訪問(wèn)數(shù)據(jù)的程度。1、面向?qū)ο蟮母拍?/p>
——封裝子類(lèi)是作為另一個(gè)類(lèi)的擴(kuò)充或修正而定義的一個(gè)類(lèi)。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass1、面向?qū)ο蟮母拍?/p>
——子類(lèi)繼承是子類(lèi)利用父類(lèi)中定義的方法和變量,就像它們屬于子類(lèi)本身一樣。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){…}publicvoidadd_oil(){…}}
classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}}1、面向?qū)ο蟮母拍?/p>
——繼承extendsCar的作用就是copy了父類(lèi)定義的變量和方法方法的重寫(xiě)重寫(xiě)使得在子類(lèi)中可以重新定義父類(lèi)中已有的方法,從而體現(xiàn)出子類(lèi)自己的行為。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){speed=0;}publicvoidadd_oil(){…}}
classTrash_CarextendsCar{doublecapacity;publicvoidfill_trash(){…}
publicvoidpush_break(){speed=speed–10;}}1、面向?qū)ο蟮母拍?/p>
——方法的重寫(xiě)重載指得是在同一個(gè)類(lèi)中至少有多個(gè)方法名字、類(lèi)型相同,但是參數(shù)不同。類(lèi)voidshow(intint_num)voidshow(doubledouble_num)voidshow(intint_num,floatfloat_num)1231.23123,1.231、面向?qū)ο蟮母拍?/p>
——方法的重載(多態(tài)性)類(lèi)、方法、變量定義的語(yǔ)法規(guī)范對(duì)象的創(chuàng)建和使用繼承、重寫(xiě)、重載、多態(tài)等概念內(nèi)嵌類(lèi)(innerclass)2、Java中的類(lèi)、方法和變量2、面向?qū)ο蟮膶?shí)現(xiàn)
Java中的類(lèi)、方法和變量
類(lèi)的嚴(yán)格定義及修飾字類(lèi)的修飾字:[public][abstract|final]
缺省方式為friendly[類(lèi)的修飾字]class類(lèi)名稱(chēng)[extends父類(lèi)名稱(chēng)][implements接口名稱(chēng)列表]{
變量定義及初始化;方法定義及方法體;}類(lèi)體,其中定義了該類(lèi)中所有的變量和該類(lèi)所支持的方法,稱(chēng)為成員變量和成員方法。[變量修飾字]
變量數(shù)據(jù)類(lèi)型變量名1,變量名2[=變量初值]…;
變量的定義及修飾字[public|protected|private][static][final][transient][volatile]成員變量的類(lèi)型可以是Java中任意的數(shù)據(jù)類(lèi)型,包括簡(jiǎn)單類(lèi)型,類(lèi),接口,數(shù)組。2、Java中的類(lèi)、方法和變量
——變量定義的語(yǔ)法規(guī)范成員變量的作用范圍是定義它的類(lèi)。[方法修飾字]
返回類(lèi)型方法名稱(chēng)(參數(shù)1,參數(shù)2,…)[throwsexceptionList]{…(statements;)//方法體:方法的內(nèi)容}方法的定義及修飾字[public|protected|private][static][final|abstract][native][synchronized]
返回類(lèi)型可以是任意的Java數(shù)據(jù)類(lèi)型,當(dāng)一個(gè)方法不需要返回值時(shí),返回類(lèi)型為void。2、Java中的類(lèi)、方法和變量
——方法定義的語(yǔ)法規(guī)范
參數(shù)的類(lèi)型可以是簡(jiǎn)單數(shù)據(jù)類(lèi)型,也可以是引用數(shù)據(jù)類(lèi)型(數(shù)組、類(lèi)或接口),參數(shù)傳遞方式是值傳遞。
方法體是對(duì)方法的實(shí)現(xiàn)。它包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域只在該方法內(nèi)部。一個(gè)簡(jiǎn)單的類(lèi)classCar{intcar_number;voidset_number(intcar_num){car_number=car_num;}voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}}classCarDemo{publicstaticvoidmain(Stringargs[]){CarDemocar=newCar();DemoCar.set_number(3838);DemoCar.show_number();}}MycarNo.is:38382、Java中的類(lèi)、方法和變量
——一個(gè)簡(jiǎn)單的類(lèi)(1)對(duì)象的生成通過(guò)new操作符生成一個(gè)對(duì)象;例如:
CarBenz,; Benz=newCar();CarBWM=newCar();2、Java中的類(lèi)、方法和變量
——對(duì)象(2)對(duì)象的構(gòu)造過(guò)程為對(duì)象開(kāi)辟空間,并對(duì)對(duì)象的成員變量進(jìn)行缺省的初始化;對(duì)成員變量進(jìn)行指定的初始化;調(diào)用構(gòu)造方法。(3)對(duì)象的使用利用對(duì)象,通過(guò)運(yùn)算符
·可以實(shí)現(xiàn)對(duì)變量的訪問(wèn)和方法的調(diào)用。例如:
BirthDatelily=newBirthDate(); intday; day=lily.day; //引用lily的成員變量day lily.tomorrow(); //調(diào)用lily的方法tomorrow()2、Java中的類(lèi)、方法和變量
——對(duì)象
類(lèi)的繼承classCar{intcar_number;voidset_number(intcar_num){car_number=car_num;}voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}}2、Java中的類(lèi)、方法和變量
——繼承classTrashCarextendsCar{intcapacity;voidset_capacity(inttrash_car_capacity){capacity=trash_car_capacity;}voidshow_capacity(){System.out.println(“Mycapacityis:”+capacity);}}2、Java中的類(lèi)、方法和變量
——繼承Car是父類(lèi),TrashCar是子類(lèi)。TrashCar中繼承了Car中的兩個(gè)方法,同時(shí)又增加了兩個(gè)新方法。classCarDemo{publicstaticvoidmain(Stringargs[]){TrashCardemoTrashCar=newTrashCar();
demoTrashCar.set_number(4949);demoTrashCar.show_number();demoTrashCar.set_capacity(20);demoTrashCar.show_capacity();}}繼承的方法新增加的方法2、Java中的類(lèi)、方法和變量
——繼承
繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的另一基本特征,通過(guò)繼承可以實(shí)現(xiàn)代碼的復(fù)用。2、Java中的類(lèi)、方法和變量
——繼承如果缺省extends子句,則該類(lèi)為java.lang.Object的子類(lèi)。通過(guò)在類(lèi)的聲明中加入extends子句來(lái)創(chuàng)建一個(gè)類(lèi)的子類(lèi):classSubClassextendsSuperClass{……}Java中不支持多重繼承。繼承而得到的類(lèi)為子類(lèi),被繼承的類(lèi)為父類(lèi),父類(lèi)包括所有直接或間接被繼承的類(lèi)。何時(shí)選擇繼承?一個(gè)很好的經(jīng)驗(yàn):“B是一個(gè)A嗎?”如果是則讓B做A的子類(lèi).例:研究生是學(xué)生嗎?那么研究生就是學(xué)生的子類(lèi)2、Java中的類(lèi)、方法和變量
——繼承常犯的錯(cuò)誤A有一個(gè)B嗎?例如讓汽車(chē)輪子成為汽車(chē)的子類(lèi)是錯(cuò)誤的例:研究生是people嗎?那么研究生就是people的子類(lèi)繼承后得到的類(lèi)應(yīng)該是同一類(lèi)
類(lèi)方法的重寫(xiě)方法重寫(xiě)即指在子類(lèi)中重新定義父類(lèi)中已有的方法。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){speed=0;}publicvoidadd_oil(){…}}
classTrash_CarextendsCar{doublecapacity;publicvoidfill_trash(){…}
publicvoidpush_break(){speed=speed–10;}}2、Java中的類(lèi)、方法和變量
——重寫(xiě)
重寫(xiě)方法的調(diào)用對(duì)于重寫(xiě)的方法,Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類(lèi)型來(lái)決定選擇哪個(gè)方法調(diào)用。publicclassDemoCar{publicstaticvoidmain(Stringargs[]){ CaraCar=newTrash_Car(); aCar.push_break();}}在這里,類(lèi)Trash_Car中的push_break()方法將被調(diào)用。2、Java中的類(lèi)、方法和變量
——重寫(xiě)方法重寫(xiě)時(shí)應(yīng)遵循的原則(1)重寫(xiě)后的方法不能比被重寫(xiě)的方法有更嚴(yán)格的訪問(wèn)權(quán)限。(2)重寫(xiě)后的方法不能比被重寫(xiě)的方法產(chǎn)生更多的例外。2、Java中的類(lèi)、方法和變量
——重寫(xiě)例:washtheshirt
washthecar
washthedog
我們通過(guò)判斷被wash的物體知道該用哪種方法來(lái)wash早期語(yǔ)言,比如C語(yǔ)言,不同的函數(shù)不能通用,導(dǎo)致
shirtWash(shirt)
carWash(car)
dogWash(dog)2、Java中的類(lèi)、方法和變量
——重載
類(lèi)方法的重載方法重載即指多個(gè)方法可以享有相同的名字。但是這些方法的參數(shù)必須不同,或者是參數(shù)個(gè)數(shù)不同,或者是參數(shù)類(lèi)型不同。2、Java中的類(lèi)、方法和變量
——重載
例如,要打印不同類(lèi)型的數(shù)據(jù),int,float,String,不需要定義不同名的方法:
printInt(int);printFloat(float);printString(String)。
利用方法重載,只需要定義一個(gè)方法名:println(),接收不同的參數(shù):
println(int);println(float);println(String);例:classWash{voidwash(Cloth
shirt){……}
voidwash(Auto
car){……}voidwash(Animal
dog,intn){……}
}2、Java中的類(lèi)、方法和變量
——重載動(dòng)態(tài)綁定:例:調(diào)用wash方法,所有名字為wash的方法都會(huì)被找出來(lái)。
wash(Clothshirt)wash(Autocar)wash(Animaldog,intn)2、編譯器根據(jù)調(diào)用時(shí)的實(shí)參值,選擇所調(diào)用的方法,例:wash(benz)2、Java中的類(lèi)、方法和變量
——?jiǎng)討B(tài)綁定
多態(tài)性類(lèi)方法的重載是一種多態(tài)性。除此之外,多態(tài)性還可以是指在程序中需要使用父類(lèi)對(duì)象的地方,都可以用子類(lèi)對(duì)象來(lái)代替。 2、Java中的類(lèi)、方法和變量
——多態(tài)性例如:publicclassEmployeeextendsObject{……}publicclassManagerextendsEmployee{……}則:Employeee=newManager();//合通過(guò)instanceof可以判斷所引用的對(duì)象實(shí)例的實(shí)際類(lèi)型??梢杂梅椒▉?lái)實(shí)現(xiàn)對(duì)成員變量的隱藏:
設(shè)置變量方法:setVariable()
獲取變量方法:getVariable()classSample{ protectedintx; ……
voidsetX(intvar) { x=var; } intgetX() { returnx; } ……}2、Java中的類(lèi)、方法和變量
——成員變量的隱藏在Java語(yǔ)言中,提供了操作符instanceof用來(lái)判斷對(duì)象是否屬于某個(gè)類(lèi)的實(shí)例。publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){ …//dosomethingasaContractor}else{ …//dosomethingelse}}2、Java中的類(lèi)、方法和變量
——對(duì)象狀態(tài)的確定EmployeeManagerContractor2、Java中的類(lèi)、方法和變量
——內(nèi)嵌類(lèi)(innerclass)在一個(gè)類(lèi)的內(nèi)部聲明的類(lèi),稱(chēng)為內(nèi)嵌類(lèi)。publicclassS{
inta=10;
...//codeforS'smethodspublicvoidp(){returnnewT();}classT{intc=a+10;publicbooleanh(){return(c>=0);}}}
內(nèi)嵌類(lèi)只能在包含它的類(lèi)中使用,同時(shí)它可以看作是該包含類(lèi)的一段特殊代碼,可以直接使用該包含類(lèi)的變量和方法。內(nèi)嵌類(lèi)編譯后也會(huì)形成一個(gè)單獨(dú)的class,但它附屬于其包含類(lèi)。3、Java名字空間及訪問(wèn)規(guī)則--Java的修飾符每個(gè)類(lèi)都擁有自己的名字空間,即指類(lèi)及其方法和變量可以使用的范圍即作用域,通過(guò)修飾符完成這種限定。對(duì)類(lèi)而言:abstract類(lèi):不能直接產(chǎn)生屬于這個(gè)類(lèi)的對(duì)象;public類(lèi):不但可以被同一程序包(package)中的其它類(lèi)使用,別的程序包中的類(lèi)也可以使用;friendly類(lèi)(缺省,包訪問(wèn)類(lèi)):只能被本程序包中的其它類(lèi)使用,不能被別的程序包中的類(lèi)使用。final類(lèi):不能被其他任何類(lèi)所繼承(安全的考慮);當(dāng)一個(gè)類(lèi)可以被訪問(wèn)時(shí),對(duì)類(lèi)內(nèi)的成員變量和成員方法而言,其作用域可以通過(guò)不同的修飾詞施以限定。
3、Java名字空間及訪問(wèn)規(guī)則private:public:
protected:
friendly(default,前邊沒(méi)有修飾字的情況):a.private我是自私的,別碰我!!!私有變量或私有方法只能在定義它的類(lèi)中使用classSundae{
privateSundae(){}staticSundaemakeASundae(){returnnewSundae();}}
publicclassIceCream{publicstaticvoidmain(String[]args){Sundaex=newSundae();//errorSundaex=Sundae.makeASundae();}}a.privateclassSundae{privateSundae(){}staticSundaemakeASundae(){returnnewSundae();}publicstaticvoidmain(String[]args){
Sundaex=newSundae();//okSundaex=Sundae.makeASundae();}}a.private
b.public公有變量或公有方法在任何其它類(lèi)中都可以訪問(wèn)我有,你有,全都有!!!packagec05.dessert;
publicclassCookie{
publicCookie(){System.out.println("Cookieconstructor");}
void
bite(){System.out.println("bite");}}同一個(gè)包、不同的包中的類(lèi)importc05.dessert.*;
publicclassDinner{publicDinner(){System.out.println("Dinnerconstructor");}publicstaticvoidmain(String[]args){Cookiex=newCookie();x.bite();//Can'taccess}}b.public不用修飾符修飾的變量和方法稱(chēng)為友好變量和友好方法,可以在同一包中的不同類(lèi)之間訪問(wèn)c.friendlypackagec05.dessert;
publicclassCookie{
publicCookie(){System.out.println("Cookieconstructor");}
voidbite(){System.out.println("bite");}}有事您call我,誰(shuí)讓咱們是朋友呢!!!packagec05.dessert;publicclassDinner{publicDinner(){System.out.println("Dinnerconstructor");}publicstaticvoidmain(String[]args){Cookiex=newCookie();x.bite();//Canaccess}}tected當(dāng)子類(lèi)和父類(lèi)不在同一個(gè)包時(shí),子類(lèi)可以訪問(wèn)父類(lèi)中的protected成員packagec05.dessert;
publicclassCookie{
publicCookie(){System.out.println("Cookieconstructor");}
voidbite(){System.out.println("bite");}}
我真想獨(dú)立,摸摸兜里沒(méi)有多少錢(qián)!!!如果兩個(gè)類(lèi)是繼承關(guān)系,protected就相當(dāng)于public,否則相當(dāng)于friendlyimportc05.dessert.*;
publicclassChocolateChipextendsCookie{publicChocolateChip(){System.out.println("ChocolateChipconstructor");}publicstaticvoidmain(String[]args){ChocolateChipx=newChocolateChip();
x.bite();//Can'taccessbite}}tectedpackagec05.dessert;
publicclassCookie{publicCookie(){System.out.println("Cookieconstructor");}
Protectedvoidbite(){System.out.println("bite");}}
tectedimportc05.dessert.*;
publicclassChocolateChipextendsCookie{publicChocolateChip(){System.out.println("ChocolateChipconstructor");}publicstaticvoidmain(String[]args){ChocolateChipx=newChocolateChip();
x.bite();//Canaccessbite}}
tected例:classTom{publicStringname;privatefloatwage;intage;…………}
classJerry{
voidg()
{Tomcat=newTom();
=“jitty”;//合法//
cat.wage=4300.00f;//不合法//cat.age=34;//若Tom和Jerry的在同一包中是合法的//方法和變量是一樣的3、Java名字空間及訪問(wèn)規(guī)則
同一個(gè)類(lèi)中同一個(gè)包中不同包中的子類(lèi)不同包中的非子類(lèi)(任意類(lèi))
private ★ default ★ ★ protected ★ ★ ★ public ★ ★ ★ ★ 當(dāng)子類(lèi)中的變量名與父類(lèi)的相同,父類(lèi)的變量被遮蓋。classA { intdata_a=3; } 3、Java名字空間及訪問(wèn)規(guī)則classBextendsA{intdata_a=5; }classCextendsB{voidprint_out(){System.out.println(“data_a=”+data_a);}}classdemo{publicstaticvoidmain(Stringargs[]){Cc=newC();c.print_out();}}data_a=53、Java名字空間及訪問(wèn)規(guī)則
——final:到此為止final在類(lèi)之前表示該類(lèi)是最終類(lèi),不能再被繼承。final在方法之前表示該方法是最終方法,該方法不能被任何派生的子類(lèi)重寫(xiě)。final在變量之前表示變量的值在初始化之后就不能再改變;相當(dāng)于定義了一個(gè)常量。static在變量或方法之前,稱(chēng)為類(lèi)方法(靜態(tài)方法)或類(lèi)變量(靜態(tài)變量)。若無(wú)static修飾,則是實(shí)例方法和實(shí)例變量。對(duì)象共享靜態(tài)變量的存貯空間classEx{chardata;staticints_data;}classDemo{Exa,b,c,d;}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法a=newEx();b=newEx();c=newEx();d=newEx();adataas_databdatacdataddata,d,c,b類(lèi)變量的生存期不依賴(lài)于對(duì)象,相當(dāng)于C語(yǔ)言中全局變量的作用。通過(guò)類(lèi)名訪問(wèn)它們。publicclassStaticVar{ publicstaticintnumber=5;}publicclassOtherClass{ publicvoidmethod() { intx=StaticVar.number; }}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法類(lèi)方法則相當(dāng)于C語(yǔ)言中的全局函數(shù),其他的類(lèi)也可以直接通過(guò)類(lèi)名來(lái)訪問(wèn)類(lèi)方法。(Java程序的入口方法main()就是一個(gè)類(lèi)方法)publicclassGeneralFunction{ publicstaticintaddUp(intx,inty) { returnx+y; }}publicclassUseGeneral{ publicvoidmethod() { inta=9; intb=10; intc=GeneralFunction.addUp(a,b); }}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法注意:1.同一個(gè)類(lèi)的實(shí)例方法可以訪問(wèn)該類(lèi)的類(lèi)變量和類(lèi)方法;3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法
討論:鑒于類(lèi)變量和類(lèi)方法的這種存貯特性和訪問(wèn)特性,什么樣的方法和變量設(shè)計(jì)成靜態(tài)更合適呢?2.而類(lèi)方法只能訪問(wèn)該類(lèi)的類(lèi)變量和類(lèi)方法,不能直接訪問(wèn)實(shí)例的變量和方法。
不正確的引用classStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法編譯時(shí)錯(cuò)誤信息:nonstaticvariablemystringcannotbereferencedfromastaticcontext“System.out.println(mystring);”。為什么不正確:靜態(tài)方法訪問(wèn)了非靜態(tài)變量。解決的辦法1.將變量改成類(lèi)變量classNoStaticError{
staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法解決的辦法2.先創(chuàng)建一個(gè)類(lèi)的實(shí)例classNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){
NoStaticErrornoError;noError=newNoStaticError();System.out.println(noError.mystring);}}3、Java名字空間及訪問(wèn)規(guī)則
——static:類(lèi)變量和類(lèi)方法4、Java中的抽象類(lèi)、接口和程序包
——抽象類(lèi)與抽象方法抽象類(lèi):用abstract關(guān)鍵字來(lái)修飾一個(gè)類(lèi)時(shí),該類(lèi)叫做抽象類(lèi);抽象類(lèi)必須被繼承。抽象類(lèi)不能被直接實(shí)例化。它只能作為其它類(lèi)的超類(lèi),這一點(diǎn)與最終類(lèi)(final類(lèi))正好相反。抽象方法:用abstract來(lái)修飾一個(gè)方法時(shí),該方法叫做抽象方法。抽象方法必須被重寫(xiě)抽象方法只有聲明,不能有實(shí)現(xiàn)。定義了抽象方法的類(lèi)必須是抽象類(lèi)。abstractreturnType
abstractMethod([paramlist]);兩個(gè)類(lèi)Circle和Rectangle,完成相關(guān)參數(shù)的計(jì)算classRectangle{publicfloatwidth,height;Rectangle(floatw,floath){width=w;//這里不需"this"height=h;}publicfloatarea(){returnwidth*height;}}classCircle{publicfloatr;Circle(floatr){this.r=r;//this指"這個(gè)對(duì)象的"}publicfloatarea(){return3.14*r*r;}}4、Java中的抽象類(lèi)、接口和程序包
——抽象類(lèi)與抽象方法假設(shè)有若干個(gè)Circle,以及若干個(gè)Rectangle,希望計(jì)算它們的總面積,直截了當(dāng)?shù)淖龇ㄊ菍⑺鼈兎謩e放到兩個(gè)數(shù)組中,用兩個(gè)循環(huán),用加法,這種做法是不漂亮的。4、Java中的抽象類(lèi)、接口和程序包
——抽象類(lèi)與抽象方法如果還有其它形狀:Triangle,Ellipses等,上述方法更顯得“累贅”。我們希望有一種統(tǒng)一的表示,例如用一個(gè)數(shù)組shape[],接受所有的形狀,然后用:for(i=0;i<shape.length;i++){area_total+=shape[i].area();}abstractclassShape{abstractfloatarea();}classRectangleextendsShape{publicfloatwidth,height;Rectangle(floatw,floath){width=w;//這里不需"this"height=h;}publicfloatarea(){returnwidth*height;}}classCircleextendsShape{publicfloatr;Circle(floatr){this.r=r;//this指"這個(gè)對(duì)象的"}publicfloatarea(){return3.14*r*r;}}4、Java中的抽象類(lèi)、接口和程序包
——抽象類(lèi)與抽象方法
接口(interface)就是方法定義和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有方法的實(shí)現(xiàn)。4、Java中的抽象類(lèi)、接口和程序包
——接口接口的定義:[public]interfaceinterfaceName[extendsSuperInterfaceList]{ …… //常量定義和方法定義}interfaceCollection{ intMAX_NUM=100; voidadd(Objectobj); voiddelete(Objectobj); Objectfind(Objectobj); intcurrentCount();}4、Java中的抽象類(lèi)、接口和程序包
——接口例:接口的定義1.用implements子句來(lái)表示一個(gè)類(lèi)使用某個(gè)接口。4、Java中的抽象類(lèi)、接口和程序包
——接口的使用3.在類(lèi)體中可以使用接口中定義的常量,而且必須實(shí)現(xiàn)接口中定義的所有方法。
2.利用接口可實(shí)現(xiàn)多重繼承,即一個(gè)類(lèi)可以使用多個(gè)接口,在implements子句中用逗號(hào)分隔。
4.接口的作用和抽象類(lèi)相似,只定義原型,不直接定義方法的內(nèi)容。5.接口中的方法和變量必須是public的。interfaceCollection{ intMAX_NUM=100; voidadd(Objectobj); voiddelete(Objectobj); Objectfind(Objectobj); intcurrentCount();}classFIFOQueueimplementsCollection{ voidadd(Objectobj) {
…… }
voiddelete(Objectobj) { …… }
Objectfind(Objectobj) { …… }
intcurrentCount() { …… }}4、Java中的抽象類(lèi)、接口和程序包
——接口主要用法:在后面介紹的事件驅(qū)動(dòng)編程中,對(duì)發(fā)生事件的響應(yīng)就是通過(guò)使用接口來(lái)實(shí)現(xiàn)的4、Java中的抽象類(lèi)、接口和程序包
——接口例:publicclassInterfaceTestimplementsActionListener{Buttonbutton=newButton();
…….button.addActionListener(this)
……publicvoidactionPerformed(ActionEvente){………..}}4、Java中的抽象類(lèi)、接口和程序包
——接口
由于Java編譯器為每個(gè)類(lèi)生成一個(gè)字節(jié)碼文件,且文件名與類(lèi)名相同,因此同名的類(lèi)有可能發(fā)生沖突。4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)為了解決這一問(wèn)題,Java采用包機(jī)制來(lái)管理類(lèi)名空間。
Java的程序包和C語(yǔ)言中的庫(kù)函數(shù)有些相似。一、
打包4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)1.Java中用package語(yǔ)句來(lái)將一個(gè)Java源文件中的類(lèi)打成一個(gè)包。它的格式為:packagepkg1[.pkg2[.pkg3…]];3.package語(yǔ)句作為Java源文件的第一條語(yǔ)句,指明該文件中定義的類(lèi)所在的包。(若缺省該語(yǔ)句,則指定為無(wú)名包,也叫默認(rèn)包)。4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)Square.javapackagemyclass.graphics;classSquare{…;}classCircle{…;}classTriangle{…;}思考:Square.class、Circle.class和Triangle.class會(huì)存放在硬盤(pán)上的什么位置?
4.Java編譯器把包對(duì)應(yīng)于文件系統(tǒng)的目錄管理,package語(yǔ)句中,用.來(lái)指明目錄的層次。packagemyclass.graphics;
這條語(yǔ)句指定這個(gè)包中的文件存儲(chǔ)在目錄path/myclass/graphics下。4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)包層次的根目錄path是由環(huán)境變量CLASSPATH來(lái)確定的。classpath=.;d:\jdk1.7\lib;當(dāng)前文件夾
編譯和生成包在前面Square.java中已定義了
myclass.graphics,編譯時(shí)可以采用如下方式:javac[-ddestpath]Square.java4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)則編譯器會(huì)自動(dòng)在destpath目錄下建立子目錄myclass/graphics
,并將生成的.class文件都放到destpath/myclass/graphics下。。destpath應(yīng)該是環(huán)境變量CLASSPATH中的一個(gè)。
為了能使用Java中已提供的類(lèi),我們需要用import語(yǔ)句來(lái)引入所需要的類(lèi)。importpackage1[.package2…].(classname|*);例如:importmyclass.graphics.*;importjava.io.*;由環(huán)境變量CLASSPATH確定4、Java中的抽象類(lèi)、接口和程序包
——程序包(類(lèi)包)myclasspathSquaregraphics二、類(lèi)的導(dǎo)入5、對(duì)象的構(gòu)造方法
構(gòu)造方法具有和類(lèi)名相同的名稱(chēng),而且沒(méi)有返回值。系統(tǒng)在產(chǎn)生對(duì)象時(shí)會(huì)自動(dòng)執(zhí)行。
構(gòu)造方法應(yīng)包含的內(nèi)容:1.
定義一些初值或內(nèi)存配置工作;
構(gòu)造方法(Constructor)是一種特殊的方法。Java中的每個(gè)類(lèi)都有構(gòu)造方法,用來(lái)初始化該類(lèi)的一個(gè)新的對(duì)象。
2.一個(gè)類(lèi)可以有多個(gè)構(gòu)造方法(重載),根據(jù)參數(shù)的不同決定執(zhí)行哪一個(gè);3.如果程序中沒(méi)有定義構(gòu)造方法,則創(chuàng)建實(shí)例時(shí)使用的是缺省構(gòu)造方法,它是一個(gè)無(wú)內(nèi)容的空方法。5、對(duì)象的構(gòu)造方法publicclassEmployee{privateStringname;privateintsalary;publicEmployee(Stringn,ints){ name=n;//為成員變量置初值 salary=s;}publicEmployee(Stringn){
this(n,0);//對(duì)重載的構(gòu)造方法的調(diào)用
}publicEmployee(){
this(“Unknown”);}}thisclassThisClass{publicstaticvoidmain(){Bankbank=newBank();bank.someMethod(this);}}classCircle{intr;Circle(intr){
this.r=r;}publicarea(){returnr*r*3.14;}}5、對(duì)象的構(gòu)造方法this指向自己的引用,它的一個(gè)主要作用是要將自己這個(gè)對(duì)象當(dāng)作參數(shù),傳送給別的對(duì)象中的方法。supersuper指這個(gè)對(duì)象的父類(lèi)。super可以用來(lái)引用父類(lèi)中的(被重寫(xiě)的)方法、(被隱藏的)變量及構(gòu)造方法。publicclassappleextendsfruits{publicapple(intprice){super(price);//調(diào)用父類(lèi)r構(gòu)造方法
super.var=value;//調(diào)用父類(lèi)的變量super.method(paraList);//調(diào)用父類(lèi)中定義的普通方法}}以上程序表示使用父類(lèi)的構(gòu)造方法生成實(shí)例,super必須是子類(lèi)構(gòu)造方法的第一條語(yǔ)句。5、對(duì)象的構(gòu)造方法構(gòu)造方法的執(zhí)行classGame{Game(inti){System.out.println("Gameconstructor"+i);}Game(){System.out.println("noparameterGameconstructor");}}classBoardGameextendsGame{BoardGame(inti){System.out.println("BoardGameconstructor"+i);}BoardGame(){System.out.println("noparameterBoardGameconstructor");}
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全教育:為家庭假期平安護(hù)航
- 和機(jī)關(guān)單位合作合同范例
- 失竊護(hù)士應(yīng)急演練
- 裝修項(xiàng)目捆綁合同范例
- 合股購(gòu)車(chē)合同范例
- 中暑應(yīng)急處置方法
- 更換化糞池合同范例
- 2024年鈹銅帶、線、管、棒材項(xiàng)目合作計(jì)劃書(shū)
- 茶葉基地流轉(zhuǎn)合同范例
- 美容儀采購(gòu)合同范例
- 鑄牢中華民族共同體意識(shí)-形考任務(wù)2-國(guó)開(kāi)(NMG)-參考資料
- 2024年國(guó)家開(kāi)放大學(xué)期末考試《律師實(shí)務(wù)》機(jī)考題庫(kù)(課程代碼:55742)
- 機(jī)械工程技術(shù)訓(xùn)練智慧樹(shù)知到期末考試答案章節(jié)答案2024年北京航空航天大學(xué)
- 鄭百文案例簡(jiǎn)要探析
- 功能高分子材料和智能高分子材料.PPT
- 莫爾條紋干涉光學(xué)系統(tǒng)仿真設(shè)計(jì)
- 紅外熱像儀的應(yīng)用PPT課件
- 未婚承諾書(shū)模板
- [推薦]:校園歌手大賽show安全應(yīng)急預(yù)案(正式)
- 部編版六年級(jí)上語(yǔ)文成績(jī)登記表
- 相親相愛(ài)一家人簡(jiǎn)譜歌詞
評(píng)論
0/150
提交評(píng)論