ch4-類和對象課件_第1頁
ch4-類和對象課件_第2頁
ch4-類和對象課件_第3頁
ch4-類和對象課件_第4頁
ch4-類和對象課件_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

類和對象主要內(nèi)容面向?qū)ο缶幊蹋∣OP)的概念及特點(diǎn)Java中面向?qū)ο缶幊虅?chuàng)建自定義類、接口和包類的繼承構(gòu)造函數(shù)類的多態(tài)性面向?qū)ο缶幊痰母拍罟矓?shù)據(jù)函數(shù)函數(shù)函數(shù)函數(shù)算法+數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)方法方法數(shù)據(jù)方法方法過程式程序設(shè)計OOP程序設(shè)計對象+消息消息面向?qū)ο缶幊痰奶攸c(diǎn)封裝(encapsulation)實(shí)現(xiàn)了信息的隱藏及安全性提高了程序的模塊化,且易于維護(hù)繼承(inheritance)交通工具車船飛機(jī)汽車火車父類/超類(superclass)子類(subclass)Java僅支持單重繼承,但可通過接口實(shí)現(xiàn)多重繼承面向?qū)ο缶幊痰奶攸c(diǎn)繼承(續(xù))體現(xiàn)了對現(xiàn)實(shí)世界的抽象模擬提高了代碼的復(fù)用性多態(tài)(polymorphism)用同一個名字調(diào)用實(shí)現(xiàn)不同操作的方法方式1:不同的類之間的同名方法 如:中國人/日本人/美國人說話方式2:參數(shù)不同的同名方法(如加法)使用方便,且降低了維護(hù)和編程量JAVA中的面向?qū)ο缶幊處讉€概念類:抽象的集合概念系統(tǒng)類庫中已定義好的類用戶自定義的類對象(實(shí)例instance):實(shí)際個體創(chuàng)建某個類的具體對象(類似變量聲明)類名 欲創(chuàng)建的對象名=new類名(參數(shù)表);例如: Strings=newString(“Hello!”);繼承、子類、父類JAVA中的面向?qū)ο缶幊蘆ava中的類結(jié)構(gòu)基類:所有JAVA的類都派生自O(shè)bjectJava的類可組織在包(package)中Java提供的標(biāo)準(zhǔn)類庫分布在一系列的包中,如java.lang,java.util,等編程的過程就是繼承基類或標(biāo)準(zhǔn)類而創(chuàng)建、定義特殊子類的過程類和對象對象

對象就是一組變量和相關(guān)方法的集合,其中變量表明對象的狀態(tài),方法表明對象所具有的行為。類 類是Java中的一種重要的復(fù)合數(shù)據(jù)類型,是組成Java程序的基本要素。它封裝了一類對象的狀態(tài)和方法,是這一類對象的原型。為什么使用類采用簡單數(shù)據(jù)類型表示現(xiàn)實(shí)世界中概念的局限性; 例如:采用int型數(shù)據(jù)表示一個日期概念,需要使用3個變量:

int day,month,year;為什么使用類如果要表示2個人的生日,就要使用6個變量:

int

mybirthday,mybirthmonth,mybirthyear;

int

yourbirthday,yourbirthmonth,yourbirthyear;使用復(fù)合數(shù)據(jù)結(jié)構(gòu)將具有相互關(guān)系的變量組合起來組成一個新的類型,用來表示一個完整的概念,這種新類型叫復(fù)合數(shù)據(jù)類型。classMyDate{ publicintday,month,year; }MyDate

mybirth,yourbirth;集成變量和方法類中不但有變量,還有與之相關(guān)的操作所定義的方法。將變量和方法封裝在一個類中,可以對成員變量進(jìn)行隱藏,外部對類成員的訪問都通過方法進(jìn)行,能夠保護(hù)類成員不被非法修改。設(shè)計準(zhǔn)則:將類中的成員變量設(shè)為private,而為每一個成員變量提供兩個public方法:setMethod(args):void;getMethod():Classtype。其他類在設(shè)置或讀取成員變量值要通過以上兩個方法,而不能直接訪問成員變量。集成變量和方法MyDatedate;已知當(dāng)前日期對象,求第2天的日期對象date.day=date.day+1;//如果date.day已經(jīng)為31,操作 //結(jié)果是非法狀態(tài)定義一個成員方法tomorrow(),求第2天的日期對象外部要獲得當(dāng)前日期的后一天時,只要調(diào)用:

date.tomorrow()類聲明格式:[public][abstract|final]classclassName[extendssuperclassName][implementsinterfaceNameList]{……..}類聲明類修飾符:public:允許其他類(沒有限制)訪問本類,一個源文件僅可以有一個public類缺?。嚎杀划?dāng)前包中的其他類訪問abstract:沒有實(shí)例的抽象概念類final:不能再被擴(kuò)展,不包含子類的類;易于安全性的實(shí)現(xiàn),或用于創(chuàng)建固定功能的類父類繼承聲明:extends父類名實(shí)現(xiàn)接口(interface):implements接口名類體定義類體中定義了該類中所有的變量和該類所支持的方法classclassName{[public|protected|private][static][final][transient][volatile]typevariableName; //成員變量

[public|protected|private][static][final|abstract][native][synchronized]

returnType

methodName([paramList])[throws

exceptionList]{statements} //成員方法}成員變量成員變量的聲明方式

[public|protected|private][static][final][transient][volatile] typevariableName; //成員變量成員變量的類型可以是Java中任意的數(shù)據(jù)類型,包括簡單類型,類,接口,數(shù)組。在一個類中的成員變量應(yīng)該是唯一的。成員變量聲明成員變量〔member〕的語法

[修飾符]數(shù)據(jù)類型變量名;引用:對象名.變量,如修飾符訪問控制符public:可被所有其他類引用private:僅可被該類自身引用和修改,不能被其他任何類(包括子類)引用成員變量protected:該類自身、子類、同一包中的其他類privateprotected:該類自身、子類缺?。罕景械念恠tatic:類成員變量,對所有的實(shí)例一致,引用時前綴可使用類名或?qū)ο竺鹒inal:數(shù)值不變常量,定義同時應(yīng)對其進(jìn)行初始化final變量在Java語言中,可以利用關(guān)鍵字final將一個變量定義為常量標(biāo)識符。finaldoublepi=3.1415926;變量pi的值在作用域范圍內(nèi),只能被使用,不能被修改。final變量publicclassFinalVariable{privatestaticfinaldoublepi=3.1415926;publicstaticvoidmain(Stringarge[]){

System.out.println("pi="+pi);

System.out.println("area="+3*3*pi);}}變量的作用域在類體中聲明的類成員變量,可在該類的各個成員方法中使用;在某個方法體中或參數(shù)表中聲明的變量,只能在該方法體中使用;在某個語句塊中聲明的變量,只能在該語句塊中使用。變量的作用域變量的作用域在Java語言中,嵌套的程序塊的內(nèi)層與外層,不允許定義相同的變量名,否則將導(dǎo)致編譯錯誤。變量的作用域

publicclassScopeError{publicstaticvoidmain(Stringarge[]){int

E

=999;{int

E=999;

System.out.println("E="+E);}}}成員方法方法的實(shí)現(xiàn)包括兩部分內(nèi)容:方法聲明和方法體

[public|protected|private][static][final|abstract][native][synchronized]

returnType

methodName([paramList])[throws

exceptionList] {statements} 成員方法定義對類內(nèi)成員變量(數(shù)據(jù))的操作方法的聲明語法:

[修飾符]返回類型方法名(參數(shù)列表)

[throws例外名]{

方法體;

}方法的性質(zhì)、接受哪些參數(shù)、如何返回信息成員方法修飾符(Modifier):訪問控制符:public、private、protected、privateprotectedstatic:靜態(tài)方法,又稱類方法使用類名或?qū)ο竺鳛榍熬Y,建議使用類名在方法體中只能使用static變量和static方法abstract:只有接口沒有語句,要在子類中通過重新定義(override)來實(shí)現(xiàn)final:不能被重新定義(override)方法聲明返回類型可以是任意的Java數(shù)據(jù)類型,當(dāng)一個方法不需要返回值時,返回類型為void參數(shù)的類型可以是簡單數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型(數(shù)組類型、類或接口),參數(shù)傳遞方式是值傳遞。方法聲明throws:通告本方法中會產(chǎn)生的例外(異常)類型,提醒調(diào)用者要對相應(yīng)的可能例外進(jìn)行處理。當(dāng)執(zhí)行此方法并發(fā)生了例外時,程序會轉(zhuǎn)入調(diào)用者編制的例外處理程序段。方法體方法體是對方法的實(shí)現(xiàn)。它包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域只在該方法內(nèi)部設(shè)計原則類中的數(shù)據(jù)使用private定義使用public方法來操作數(shù)據(jù)把邏輯上相關(guān)聯(lián)的數(shù)據(jù)封裝成新的類來使用,類似結(jié)構(gòu)體不要定義太龐大的類,要把無關(guān)的功能適當(dāng)分離培養(yǎng)良好的編程風(fēng)格類定義舉例publicclassMyDate{ privateintday,month,year; publicvoidtomorrow(){ if(day<daysInMonth()){ day=day+1; } else…… } publicint

daysInMonth(){……} }方法重載(MethodOverloading)方法重載即指多個方法可以享有相同的名字。但是這些方法的參數(shù)必須不同,或者是參數(shù)個數(shù)不同,或者是參數(shù)類型不同方法重載(MethodOverloading)舉例:

要打印不同類型的數(shù)據(jù),int,float,String,不需要定義不同名的方法:printInt(int);printFloat(float);printString(String)

利用方法重載,只需要定義一個方法名:

println(),接收不同的參數(shù):

println(int);

println(float);

println(String);構(gòu)造函數(shù)Java試圖在每個對象一誕生時,就給它一確定的狀態(tài),但有時這種系統(tǒng)的缺省初值不合適;所以在創(chuàng)建一個新對象時,需用構(gòu)造函數(shù)完成合法的初始化,使類內(nèi)成員的初始化工作不依賴于外界完成。構(gòu)造函數(shù)構(gòu)造函數(shù)是一種特殊的方法。Java中的每個類都有構(gòu)造函數(shù),用來初始化該類的一個新的對象。構(gòu)造函數(shù)具有和類名相同的名稱,而且不返回任何數(shù)據(jù)類型,在構(gòu)造函數(shù)的實(shí)現(xiàn)中,也可以進(jìn)行方法重載。構(gòu)造函數(shù)構(gòu)造函數(shù)只能在創(chuàng)建類對象時由系統(tǒng)隱含調(diào)用,而不能直接引用;類對象創(chuàng)建時,利用運(yùn)算符new在內(nèi)存中開辟專用空間,存放指定的類的實(shí)例(即對象),這時會自動執(zhí)行類的構(gòu)造函數(shù),初始化新對象的成員變量。構(gòu)造函數(shù)的繼承子類沒有定義構(gòu)造函數(shù)時,自動繼承父類不含參數(shù)的構(gòu)造函數(shù),并在創(chuàng)建新子類對象時自動執(zhí)行子類有自己的構(gòu)造函數(shù)時,創(chuàng)建新子類對象時也要先執(zhí)行父類不含參數(shù)的構(gòu)造函數(shù),再執(zhí)行自己的構(gòu)造函數(shù)例:Sandwich.javaclassMeal{Meal(){……}}classBread{Bread(){……}}classCheese{Cheese(){……}}classLettuce{Lettuce(){……}}classLunchextendsMeal{Lunch(){……}}classPortableLunchextendsLunch{

PortableLunch(){……}}classSandwichextendsPortableLunch{Breadb=newBread();Cheesec=newCheese();Lettucel=newLettuce();Sandwich(){…...}publicstaticvoidmain(String[]args){newSandwich();}}///:~構(gòu)造函數(shù)的繼承注意構(gòu)造函數(shù)的調(diào)用順序:按繼承順序依次調(diào)用父類的不含參數(shù)的構(gòu)造函數(shù),直到到達(dá)本子類依次執(zhí)行本子類成員對象的構(gòu)造函數(shù)最后,執(zhí)行本子類的構(gòu)造函數(shù)例:在生成sandwich對象時構(gòu)造函數(shù)的調(diào)用順序?yàn)椋篗eal()->Lunch()->PortableLunch()->Bread()

->Cheese()->Lettuce()->Sandwich()構(gòu)造函數(shù)的繼承子類的構(gòu)造函數(shù)定義中,如要調(diào)用父類的含參數(shù)的構(gòu)造函數(shù),需用super關(guān)鍵字,且該調(diào)用語句必須是子類構(gòu)造函數(shù)的第一個可執(zhí)行語句。一構(gòu)造函數(shù)可利用this調(diào)用本類其他的構(gòu)造函數(shù),此時this應(yīng)是第一個可執(zhí)行語句構(gòu)造函數(shù)publicclassEmployee{ privateStringname; privateintsalary; publicEmployee(Stringn,ints){ name=n; salary=s; } publicEmployee(Stringn){

this(n,0); }構(gòu)造函數(shù) publicEmployee(){

this(“Unknown”); }}

對象對象的生成 通過new操作符生成一個對象; 例如:

MyDatedate; date=newMyDate();對象的構(gòu)造過程為對象開辟空間,并對對象的成員變量進(jìn)行缺省的初始化;對成員變量進(jìn)行指定的初始化;靜態(tài)數(shù)據(jù)成員、復(fù)雜數(shù)據(jù)成員的初始化可在靜態(tài)初始化器中完成;靜態(tài)初始化器中的語句在類加載內(nèi)存時執(zhí)行,這種初始化操作要比構(gòu)造函數(shù)執(zhí)行得更早;調(diào)用構(gòu)造函數(shù)。對象的使用對象的使用通過一個引用類型的變量來實(shí)現(xiàn),包括引用對象的成員變量和方法,通過運(yùn)算符‘·’可以實(shí)現(xiàn)對變量的訪問和方法的調(diào)用。 例如:

MyDatedate=newMyDate(); date.day //引用date的成員變量day date.tomorrow() //調(diào)用date的方法tomorrow()對象的構(gòu)造過程舉例MyDatemy_birth=newMyDate(22,7,1964);MyDatemy_birth

=newMyDate(22,7,1964);為引用變量開辟空間對象的構(gòu)造過程舉例MyDatemy_birth=newMyDate(22,7,1964);使用‘new’操作符為MyDate類型的對象開辟空間對象的構(gòu)造過程舉例初始化類定義時指定的變量值對象的構(gòu)造過程舉例MyDatemy_birth=newMyDate(22,7,1964);執(zhí)行構(gòu)造函數(shù)對象的構(gòu)造過程舉例MyDate

my_birth=newMyDate(22,7,1964);用新生成的對象給引用變量賦值變量的賦值

intx=7;

inty=x;

MyDates=newMyDate(22,7,1964);

MyDatet=s;變量的賦值t=newMyDate(22,12,1964);一個小問題對于類Rock:

RockR1=newRock(1); RockR2=R1;這時,內(nèi)存中為Rock類創(chuàng)建了幾個實(shí)例呢?如果只有一個實(shí)例,那么這個實(shí)例有幾個引用(reference)呢?包(Package)由于Java編譯器為每個類生成一個字節(jié)碼文件,且文件名與類名相同,因此同名的類有可能發(fā)生沖突。為了解決這一問題,Java提供包來管理類名空間。包是若干CLASS的松散組合,這些CLASS之間不需要有明確、密切的關(guān)系,如繼承等,但一般它們共同工作,可互相訪問彼此的成員。Java用包來組織CLASS,從而提高了類的可重用性。package語句package語句作為Java源文件的第一條語句,指明該文件中定義的類所在的包。(若缺省該語句,則指定為無名包)。它的格式為:

packagepkg1[.pkg2[.pkg3…]];Java編譯器把包對應(yīng)于文件系統(tǒng)的目錄管理,package語句中,用‘

.’

來指明目錄的層次;

編譯和生成包如果在程序Test.java中已定義了包p1,編譯時采用如下方式:javac-ddestpathTest.java

則編譯器會自動在destpath目錄下建立一個子目錄p1,并將生成的.class文件都放到destpath/p1下。import語句為了能使用Java中已提供的類,我們需要用import語句來引入所需要的類。

importpackage1[.package2…].(classname|*);例如:

importjava.awt.*; importjava.io.*;

javac編譯器編譯源程序時,如果遇到當(dāng)前包中沒有定義的類,就會以環(huán)境變量classpath為相對查找路徑,按照包名的結(jié)構(gòu)來查找引用的外部類。import語句對于importjava.io.*;

將按照路徑:classpath\java\io\來查找所需的外部類。環(huán)境變量classpath是用來指示Java程序所引用的外部類所在的一系列相對路徑的一個環(huán)境變量。信息隱藏對類的成員施以一定的訪問權(quán)限限定,實(shí)現(xiàn)類中成員在一定范圍內(nèi)的信息隱藏 同一個類中同一個包中

不同包中的子類不同包中的非子類

private ★ default ★ ★ protected ★ ★

★ public ★★ ★ ★ 繼承性繼承性是面向?qū)ο蟪绦蛟O(shè)計語言的另一基本特征,通過繼承可以實(shí)現(xiàn)代碼的復(fù)用。繼承而得到的類為子類,被繼承的類為父類,父類包括所有直接或間接被繼承的類。Java中不支持多重繼承。創(chuàng)建子類通過在類的聲明中加入extends子句來創(chuàng)建一個類的子類:

classSubClassextendsSuperClass

{ ……}如果缺省extends子句,則該類為java.lang.Object的子類。子類可以繼承父類中訪問權(quán)限設(shè)定為public、protected、default的成員變量和方法。但是不能繼承訪問權(quán)限為private的成員變量和方法。成員變量的隱藏和方法的重寫classSuperClass{

intx; ……

voidsetX(){ x=0; } ……}成員變量的隱藏和方法的重寫classSubClassextendsSuperClass{

intx; //hidexinSuperClass ……

voidsetX(){//overridemethodsetX()inSuperClass x=5; } …… }引用父類成員Java中通過super來實(shí)現(xiàn)對父類成員的訪問。

1.用來訪問父類被隱藏的成員變量,如:super.variable 2.用來調(diào)用父類中被重寫的方法,如:super.Method([paramlist]);

3.用來調(diào)用父類的構(gòu)造函數(shù),如:super([paramlist]);多態(tài)性多態(tài)性是指在程序中需要使用父類對象的地方,都可以用子類對象來代替。

例如:

publicclassEmployeeextendsObject{……} publicclassManagerextendsEmployee{……}

則:

Employeee=newManager();//合法語句

重寫方法的調(diào)用對于重寫的方法,Java運(yùn)行時系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來決定選擇哪個方法調(diào)用。

classA{voidcallme(){

System.out.println("InsideA'scallme()method"); } }重寫方法的調(diào)用classBextendsA{ voidcallme(){

System.out.println("InsideB'scallme()method"); }}publicclassDispatch{ publicstaticvoidmain(Stringargs[]){ Aa=newB();

a.callme(); }}重寫方法的調(diào)用運(yùn)行結(jié)果為:InsideB'scallme()method方法重寫時應(yīng)遵循的原則改寫后的方法不能比被重寫的方法有更嚴(yán)格的訪問權(quán)限改寫后的方法不能比被重寫的方法產(chǎn)生更多的例外多態(tài)與重載舉例例:Shapes.java三個類Circle、Square、Triangle均有draw()方法和erase()方法,但不同類的方法的具體操作其實(shí)并不相同,實(shí)現(xiàn)了多態(tài)。draw()erase()draw()erase()draw()erase()對象狀態(tài)的確定在Java語言中,提供了操作符instanceof用來判斷對象是否屬于某個類的實(shí)例。

publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){ …}//dosomethingasaContractorelse{ …//dosomethingelse} }final關(guān)鍵字final修飾變量,變量就變成了常量;final修飾方法,方法就不能再重寫;final修飾類,類就不能再繼承。實(shí)例成員和類成員用static關(guān)鍵詞修飾的成員,叫類成員(靜態(tài)成員)。實(shí)例變量和類變量

以static修飾的成員變量,叫類變量;否則,叫實(shí)例變量。實(shí)例方法和類方法

以static修飾的成員方法,叫類方法;否則,叫實(shí)例方法。類方法只允許調(diào)用類方法,而不可以調(diào)用實(shí)例方法;實(shí)例方法卻可以調(diào)用類方法或其他的實(shí)例方法。類變量類變量的生存期不依賴于對象,相當(dāng)于C語言中全局變量的作用。

publicclassCount{ privateint

serialNumber; privatestaticintcounter=0; publicCount(){ counter++;

serialNumber=conter; } }類變量的使用

publicclassStaticVar{ publicstaticintnumber; } publicclassOtherClass{ publicvoidmethod(){

intx=StaticVar.number; } }類方法的使用

publicclassGeneralFunction{ publicstaticint

addUp(int

x,inty){ returnx+y; } publicclassUseGeneral{ publicvoidmethod(){

inta=9;

intb=10;

intc=GeneralFunction.addUp(a,b); } }實(shí)例變量的使用

publicclassWrong{

intx; publicstaticvoidmain(Stringargs[]){ x=9; //compilererror } }抽象類(abstractclass)用abstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類;用abstract來修飾一個方法時,該方法叫做抽象方法。abstract類必須被繼承,abstract方法必須被重寫。抽象類不能被實(shí)例化。抽象方法只需聲明,而不需實(shí)現(xiàn)。

abstractreturnType

abstractMethod([paramlist]);abstractclassA{ abstractvoidcallme(); voidmetoo(){

System.out.println("InsideA'smetoo()method"); }}classBextendsA{ voidcallme(){

System.out.println("InsideB'scallme()method"); }}publicclassAbstract{ publicstaticvoidmain(Stringargs[]){ Ac=newB();

c.callme();

c.metoo(); }}

運(yùn)行結(jié)果為:InsideB'scallme()methodInsideA'smetoo()method接口(interface)接口就是方法定義和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)。接口的作用通過接口可以實(shí)現(xiàn)不相關(guān)類的相同行為,而不需要考慮這些類之間的層次關(guān)系。通過接口可以指明多個類需要實(shí)現(xiàn)的方法。通過接口可以了解對象的交互界面,而不需了解對象所對應(yīng)的類。接口的定義[public]

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論