《Java SE程序設(shè)計及實踐》課件03-第3章 類與對象_第1頁
《Java SE程序設(shè)計及實踐》課件03-第3章 類與對象_第2頁
《Java SE程序設(shè)計及實踐》課件03-第3章 類與對象_第3頁
《Java SE程序設(shè)計及實踐》課件03-第3章 類與對象_第4頁
《Java SE程序設(shè)計及實踐》課件03-第3章 類與對象_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-1-理解OOP編程思想掌握Java中創(chuàng)建類和對象的方法掌握Java的方法重載掌握包的創(chuàng)建和使用方法掌握Java訪問修飾符的使用掌握靜態(tài)變量、靜態(tài)方法的使用目標(biāo)-2-面向?qū)ο笏枷?/p>

面向?qū)ο蟾攀觯好嫦驅(qū)ο笾饕嫦驅(qū)ο蟮姆治觯∣bjectOrientedAnalysis,OOA)、面向?qū)ο蟮脑O(shè)計(ObjectOrientedDesign,OOD)、面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP)。OOA就是以面向?qū)ο蟆邦悺钡母拍钊フJ識問題、分析問題。OOD是在OOA的基礎(chǔ)上設(shè)計數(shù)據(jù)模型,從而建立所要操作的對象以及它們之間的聯(lián)系。OOP則是在前兩者的基礎(chǔ)上,對數(shù)據(jù)模型進一步細化,定義它包含的數(shù)據(jù)的類型和任何能夠操作它的邏輯程序。每個不同的邏輯程序被認為是一個方法。-3-面向?qū)ο缶幊蘋OP面向?qū)ο缶幊蹋好嫦驅(qū)ο缶幊痰慕M織方式圍繞“對象”,而不是圍繞“行為”;圍繞數(shù)據(jù),而非邏輯。

一個類的實現(xiàn)實例被稱作一個“對象”,或者被稱作一個類的“實例”。一個類可以有多個實現(xiàn)對象,即類是一個范圍,而對象則是類的一個具體的實體。

類是具有相同狀態(tài)(屬性)和行為(方法)的一組對象的集合,它與對象之間的關(guān)系如圖:-4-面向?qū)ο髾C制-1

封裝

封裝就是把對象的屬性(狀態(tài))和方法(行為)結(jié)合在一起,并盡可能隱蔽對象的內(nèi)部細節(jié),成為一個不可分割的獨立單位(即對象),對外形成一個邊界,只保留有限的對外接口使之與外部發(fā)生聯(lián)系。

封裝的原則使對象以外的部分不能隨意存取對象的內(nèi)部數(shù)據(jù),從而有效的避免了外部錯誤對它的“交叉感染”。數(shù)據(jù)隱藏特性提升了系統(tǒng)安全性,使軟件錯誤能夠局部化,減少查錯和排錯的難度。

如:微波爐,將線路板(屬性)封裝在微波爐內(nèi)部,使用者無法接觸到,而通過面板按鈕(方法)簡單的操控線路板工作。-5-面向?qū)ο髾C制-2繼承

繼承是軟件重用的一種形式,它通過重用現(xiàn)有類的屬性和方法,并增加新功能或修改現(xiàn)有功能來構(gòu)建新的類。

多態(tài)

多態(tài)是指在父類中定義的屬性或方法被子類繼承之后,可以具有不同的表現(xiàn)行為。這使得同一個屬性或方法在父類及其各個子類中具有不同的語義。

如:“人”這個類抽象了這個群體的一般特性,“學(xué)生”和“老師”都具備“人”所定義的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情況下,作為一個新類而存在。如:動物會“叫”,“貓”和“鳥”都是動物的子類,但其“叫”聲是不同的-6-類與對象-1類類就是對象的模板,而對象就是類的一個實例。類由屬性和方法構(gòu)成:對象的特征在類中表示為成員變量,稱為類的屬性。類的方法是對象執(zhí)行操作的一種規(guī)范。方法指定以何種方式操作對象的數(shù)據(jù),是操作的實際實現(xiàn)。

Java中類聲明格式

類是Java的核心和本質(zhì),是Java語言的基礎(chǔ),類定義了一種新的數(shù)據(jù)類型。多個對象所共有的屬性和方法需要組合成一個單元,稱為“類”

[訪問符][修飾符]class<類名>{[屬性][方法]}用于聲明類、屬性或方法的訪問權(quán)限,具體可取public、protected、private或缺省。修飾符,可用的有abstract,static或final等,這些修飾符用于說明所定義的類有關(guān)方面的特性類與對象-2聲明一個類定義一個長方形(Rectangle)類,有長、寬屬性,對每個屬性都提供相應(yīng)的get/set方法。publicclassRectangle{ /*長方形寬度*/ privatedoublewidth; /*長方形高度*/ privatedoublelength; /*成員變量對應(yīng)的方法*/ publicdoublegetWidth(){ returnwidth; } publicvoidsetWidth(doublewidth){ this.width=width; } publicdoublegetLength(){ returnlength; } publicvoidsetLength(doublelength){ this.length=length; }}-7-類與對象-3對象的創(chuàng)建

當(dāng)創(chuàng)建完一個類時,就創(chuàng)建了一種新的數(shù)據(jù)類型??梢允褂眠@種類型來聲明該種類型的對象。要獲得一個類的對象一般需要兩步:聲明該類類型的一個變量。創(chuàng)建該對象(即在內(nèi)存中為該對象分配地址空間),并把該對象的引用賦給聲明好的變量。這是通過使用new運算符實現(xiàn)的。創(chuàng)建Rectangle類的對象Rectanglerectangle=newRectangle();或Rectanglerectangle;rectangle=newRectangle();Rectanglerectangle=null;“null”關(guān)鍵字表示“空”,用于標(biāo)識一個不確定的對象,即沒有內(nèi)存地址的對象。因此可以將null賦給引用類型變量,但不可以賦給基本類型變量。-8-構(gòu)造方法-1類的構(gòu)造方法構(gòu)造方法是一種特殊的方法,在對象被創(chuàng)建時用來初始化對象;它具有和它所在的類完全一樣的名字;構(gòu)造方法和類的方法類似,只不過構(gòu)造方法沒有返回類型;構(gòu)造方法的任務(wù)是初始化一個對象的內(nèi)部狀態(tài)。

[<access>]<class_name>([<argu_list>]){

語句;}-9-構(gòu)造方法-2類的構(gòu)造方法實例在Rectangle類的基礎(chǔ)上,基于width和length兩屬性來創(chuàng)建構(gòu)造方法,代碼如下所示:publicclassRectangle{ privatedoublewidth; privatedoublelength; /*利用width和length創(chuàng)建構(gòu)造方法*/ publicRectangle(doublewidth,doublelength){ this.width=width; this.length=length; } //省略……}如果在Java程序中沒有定義任何的構(gòu)造方法,則編譯器將會自動加上一個不帶任何參數(shù)的構(gòu)造方法即缺省構(gòu)造方法,該方法不存在于源程序中,但可以使用。

-10-this對象this對象的使用this關(guān)鍵字代表當(dāng)前所在類的對象,即本類對象,用于解決變量的命名沖突和不確定性問題;在沒有同名的情況下,可以直接使用屬性的名字。圖3-4this關(guān)鍵字-11-對象的初始化過程對象的初始化過程

Rectanglerectangle=newRectangle(3,5);注意:如果在類中沒有定義任何的構(gòu)造方法,則編譯器將會自動加上一個無參構(gòu)造方法;一旦創(chuàng)建了自己的構(gòu)造方法,缺省的構(gòu)造方法將不復(fù)存在,如果需要則手動添加無參構(gòu)造方法。-12-類的方法-1類的方法 方法是類行為的體現(xiàn),其他對象可以根據(jù)類的方法對類進行訪問。類的方法包括方法的說明和方法的實現(xiàn)兩部分,格式如下所示:[access][modifiers]<return_type>methodName([<argu_list>]){}注意:方法的返回類型是該方法運行后返回值的數(shù)據(jù)類型;如果方法沒有返回值,則方法的返回類型為void。

使用對象

當(dāng)分配完一個對象后,可以使用點操作符“.”來實現(xiàn)對屬性和方法的訪問:對象名.屬性;

//訪問對象的屬性對象名.方法名();

//訪問對象的方法-13-類的方法-2類的方法實例 對Rectangle進行擴展,定義方法output()使用字符界面顯示長方形的信息,代碼如下所示:publicclassRectangle{//……省略變量定義及構(gòu)造方法定義//……省略get和set方法

/*輸出長方形的長寬信息*/ publicvoid

output(){ System.out.println("長方形的長為:"+length); System.out.println("長方形的寬為:"+width); } publicstaticvoidmain(String[]args){ Scannerscanner=newScanner(System.in); System.out.println("請輸入長方形的長:"); doublelength=scanner.nextDouble(); System.out.println("請輸入長方形的寬:"); doublewidth=scanner.nextDouble();

//利用構(gòu)造方法創(chuàng)建一個Rectangle類型的對象

Rectanglerectangle=newRectangle(width,length); //調(diào)用output方法

rectangle.output(); }}執(zhí)行結(jié)果如下:請輸入長方形的長:3請輸入長方形的寬:5長方形的長為:3.0長方形的寬為:5.0-14-參數(shù)傳遞-1在Java編程語言中,給方法傳遞參數(shù)的方式有兩種:按值傳遞(callbyvalue),將要傳遞的參數(shù)的值傳遞給被調(diào)方法,被調(diào)方法通過創(chuàng)建一份新的內(nèi)存拷貝來存儲傳遞的值,然后在內(nèi)存拷貝上進行數(shù)值操作,所以按值傳遞不會改變原始參數(shù)的值。通過具體實例來說明按值傳遞,代碼如下所示:publicstaticvoidmain(String[]args){ intnum=5; System.out.println("調(diào)用change方法前:"+num); //創(chuàng)建一個CallByValue類型的對象

CallByValuecallByValue=newCallByValue(); callByValue.change(num); System.out.println("調(diào)用change方法后:"+num);}/*定義change方法*/publicvoidchange(intnum){ num+=5; System.out.println("在change中num的值為:"+num);}在Java中,當(dāng)傳遞基本數(shù)據(jù)類型的參數(shù)給方法時,它是按值傳遞的執(zhí)行結(jié)果如下:調(diào)用change方法前:5在change中num的值為:10調(diào)用change方法后:5-15-參數(shù)傳遞-2引用傳遞(callbyvalue),將參數(shù)的引用(類似于C語言的內(nèi)存指針)傳遞給被調(diào)方法,被調(diào)方法通過傳遞的引用值獲取其指向的內(nèi)存空間,從而在原始內(nèi)存空間直接進行操作,這樣將導(dǎo)致原始內(nèi)存空間狀態(tài)的修改。代碼如下所示:classCallByRef{ inta,b; CallByRef(inti,intj){ a=i; b=j; } voidchange(CallByRefobj){ obj.a=50; obj.b=40; System.out.println("在change方法中obj.a="+obj.a+",obj.b="+obj.b); }}publicclassTest{ publicstaticvoidmain(String[]args){ CallByRefobj=newCallByRef(15,20); System.out.println("調(diào)用change方法前obj.a="+obj.a+",obj.b="+obj.b); obj.change(obj); System.out.println("調(diào)用change方法后obj.a="+obj.a+",obj.b="+obj.b); }}執(zhí)行結(jié)果如下:調(diào)用change方法前obj.a=15,obj.b=20在change方法中obj.a=50,obj.b=40調(diào)用change方法后obj.a=50,obj.b=40-16-方法重載重載(Overload)

在Java程序中,如果同一個類中存在兩個方法同名,方法的簽名(參數(shù)個數(shù)、參數(shù)類型、類型排列次序)上也一樣,將無法編譯通過。但在Java中多個方法重名是允許的,只要保證方法簽名不同即可,這種特性稱為方法重載(overload)。方法重載需遵循如下兩條規(guī)則:方法名相同;參數(shù)列表(個數(shù)、類型、順序)不同;注意:返回值不影響方法重載。構(gòu)造方法也可以重載。-17--18-包-1包(package)

Java允許使用包將多個類組織在一起。借助于包可以方便的組織管理類,并將自定義的類與其它的類庫分開管理。Java就是使用包來管理類庫的。使用包維護類庫比較簡單,只要保證在同一個包下不存在同名的類即創(chuàng)建一個包也比較簡單:只要將package命令作為一個Java源文件的第一句就可以,該文件中定義的任何類將屬于指定的包。示例代碼如下:packagemypackage;publicclassRectangle{......}-18-包-2包中類的訪問 一個類可以訪問其所在包的所有類。訪問其他包的類有如下兩種方式訪問:使用import語句導(dǎo)入要訪問的類,如:使用的類名前直接添加完整的包名,如:importjava.util.*;importmypackage.school.Student;java.util.Datenow=newjava.util.Date();mypackage.school.Studenttom=newmypackage.school.Student();注意:*指明導(dǎo)入當(dāng)前包的所有類,不能使用類似于java.*的語句來導(dǎo)入以java為前綴的所有包的所有類。

-19--20-封裝封裝Java中為了將數(shù)據(jù)有效的保護起來,提供了訪問修飾符用來聲明、控制屬性、方法乃至類本身的訪問,以實現(xiàn)隱藏一個類的實現(xiàn)細節(jié),防止對封裝數(shù)據(jù)未經(jīng)授權(quán)的訪問,此種形式稱為“封裝”。引入封裝,使用者只能通過事先定制好的方法來訪問數(shù)據(jù),可以方便的加入控制邏輯,限制對屬性的不合理操作,有利于保證數(shù)據(jù)的完整性。實現(xiàn)封裝的關(guān)鍵是不讓外界直接與對象屬性交互,而是要通過指定的方法操作對象的屬性,如下圖所示:-20--21-訪問修飾符-1訪問修飾符

Java中定義了private(私有的)、protected(受保護的)和public(公共的)的訪問修飾符,同時也定義了一個缺省的訪問級別,用于聲明類、屬性、方法的訪問權(quán)限。明確訪問修飾符的限制是用好“封裝”的關(guān)鍵:使用public訪問修飾符,類的成員可被同一包或不同包中的所有類訪問,也就是說,public訪問修飾符可以使類的特性公用于任何類;使用protected訪問修飾符允許類本身、同一包中的所有類和不同包中的子類訪問;如果一個類或類的成員前沒有任何訪問修飾符時,它們獲得缺省的訪問權(quán)限,缺省的可以被同一包中的其他類訪問;private訪問修飾符是限制性最大的一種訪問修飾符,被聲明為private的成員只能被此類中的其他成員訪問,不能在類外看到。-22-訪問修飾符-2Java中訪問控制表訪問控制private成員缺省成員protected成員public成員同一類中成員

同一包中其他類×

不同包中子類××

不同包中非子類×××

-23-訪問修飾符-3修飾符實例-1

首先,定義MyClass1類結(jié)構(gòu)packagep1;publicclassMyClass1{ publicinta=5; privateintb=10; protectedintc=20; intd=30; publicvoidfunc1(){ System.out.println("func1"); } privatevoidfunc2(){ System.out.println("func2"); System.out.println(b); } protectedvoidfunc3(){ System.out.println("func3"); } voidfunc4(){ System.out.println("func4"); }}-24-訪問修飾符-4修飾符實例-2

然后,定義MyClass2類結(jié)構(gòu)

packagep1;classMyClass2{ publicvoidfunc1(){ System.out.println("func1ofMyClass2"); }}-25-訪問修飾符-5修飾符實例-3

最后,定義Test類,假如將Test類放在與MyClass1和MyClass2同一個包p1下,在Test中訪問MyClass1、MyClass2及其成員的可行性如下:publicclassTest{publicvoidfunc(){ MyClass1obj1=newMyClass1(); System.out.println(obj1.a);//公共屬性,任何地方都可以訪問

System.out.println(obj1.b);//Error,私有屬性類外無法訪問

System.out.println(obj1.c);//受保護屬性同包的類或子類可以訪問

System.out.println(obj1.d);//缺省屬性同包的類可以訪問

obj1.func1();//公共方法,任何地方都可以訪問

obj1.func2();//Error,私有方法類外無法訪問

obj1.func3();//受保護方法同包的類或子類可以訪問

obj1.func4();//缺省方法同包的類可以訪問

MyClass2obj2=newMyClass2();//同一包中的缺省類可以訪問

}}-26-訪問修飾符-6修飾符實例-4

假如將Test類放在與MyClass1和MyClass2不同的包下,在Test中訪問MyClass1、MyClass2及其成員的可行性如下:publicclassTest{publicvoidfunc(){ MyClass1obj1=newMyClass1(); System.out.println(obj1.a);//公共屬性,任何地方都可以訪問

System.out.println(obj1.b);//Error,私有屬性類外無法訪問

System.out.println(obj1.c);//Error,受保護屬性同包的類或子類才可以訪問

System.out.println(obj1.d);//Error,缺省屬性同包的類才可以訪問

obj1.func1();//公共方法,任何地方都可以訪問

obj1.func2();//Error,私有方法類外無法訪問

obj1.func3();//Error,受保護方法同包的類或子類才可以訪問

obj1.func4();//Error,缺省方法同包的類才可以訪問

MyClass2obj2=newMyClass2();//缺省訪問級別同包才可以訪問

}}-27-訪問修飾符-7修飾符實例-5

假如Test類繼承了MyClass1,并且不在同一個包下,在Test中訪問MyClass1、MyClass2及其成員的可行性如下:publicclassTestextendsMyClass1{publicvoidfunc(){ System.out.println(a);//公共屬性,任何地方都可以訪問

System.out.println(b);//Error,私有屬性類外無法訪問

System.out.println(c);//受保護屬性同包的類或子類可以訪問

System.out.println(d);//Error,缺省屬性同包的類才可以訪問

func1();//公共方法,任何地方都可以訪問

func2();//Error,私有方法類外無法訪問

func3();//受保護方法同包的類或子類可以訪問

func4();//Error,缺省方法同包的類才可以訪問

MyClass2obj2=newMyClass2();/

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論