版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
4-5章Java的面向對象特性QQ:66459753Email:66459753@重慶師范大學計算機學院王艷霞1內(nèi)容Java的類Java的對象構造方法2面向過程的設計思想和面向對象的設計思想我要回家面向過程開車、掛檔、踩油門、…面向對象我命令車回家車怎么去的不關我的事信息封裝在車這個類的內(nèi)部不用去了解整個開車的過程3一個問題老李養(yǎng)了兩只狗,一只黑狗,叫小黑,顏色黑色,年齡4歲;一只黃狗,叫小黃,顏色黃色,年齡10歲。要求編寫程序,輸入狗的名字,如有這只狗,顯示其信息,沒有就提示錯誤。dogInfo.java4面向對象編程思想
從現(xiàn)實世界中客觀存在的事物出發(fā)來構造軟件系統(tǒng),并在系統(tǒng)的構造中盡可能運用人類的自然思維方式面向對象更加強調(diào)運用人類在日常的思維邏輯中經(jīng)常才贏的思想方法與原則,如類,對象、繼承,聚合,多態(tài)等5類與對象的概念類是同種對象的集合與抽象,類中定義了這一類對象所應具有的靜態(tài)和動態(tài)屬性。對象用計算機語言對問題域中事物的描述,對象通過“屬性(attribute)”和“方法(method)”來分別對應事物所具有的靜態(tài)屬性和動態(tài)屬性
對象是屬性(成員變量)和方法的集合。{一類事物的具體的某一個東西(符合這類事物的具體特征的某個東西)
叫對象}
類與對象的關系:類可以看成一類對象的模板,對象可以看成該類的一個具體實例,瓶子是一個類,某個瓶子就是對象
類對象職員職員-姓名-年齡-目前工資+顯示姓名()+顯示年齡()+修改姓名()+領取工資()職員A:職員姓名=A年齡=30目前工資=800職員B:職員姓名=B年齡=350目前工資=900實例化實例化抽象6封裝什么是封裝?封裝是把抽象出來的數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護在內(nèi)部,程序的其他部分只有通過被授權的操作才能對數(shù)據(jù)進行操作私有數(shù)據(jù)方法方法數(shù)據(jù)對象A對象B公有數(shù)據(jù)舉例子Packaging.java7繼承關系(一般和特殊)8Java與面向對象
對象是Java程序的核心,在java程序中“萬事萬物皆對象”。對象可以看成靜態(tài)屬性(成員變量)和動態(tài)屬性(方法)的封裝體類是用來創(chuàng)建統(tǒng)一類型的對象的“模板”,在一個類中定義了該類對象所應具有的成員變量以及方法J2SDK提供了很多類供編程人員使用,編程人員也可以自定義自己的類9類的定義類定義的格式
[public][abstract|final]
classclassName[extendssuperclassName]
[implementsinterfaceNameList]
{
…//類體,包括定義類的成員變量和方法}publicclassPerson{privateintid;privateintage=20;publicintgetAge(){returnage;}}publicclassStudentextendsPerson{ intSno;Stringschoolname;publicvoidGotoSchool(){。。。。}
}10成員變量的定義成員變量的定義格式:[修飾符]類型成員變量名[=默認值];如privateintid;publicStringname=“小花”;11成員變量成員變量可以使用java語言中任何一種數(shù)據(jù)類型(包括基本類型和引用類型),作用范圍為整個類體定義成員變量時可以不初始化,java系統(tǒng)會給你賦初始值成員變量的作用域是整個類體注意:局部變量必須賦初試值才可以使用
看例子dog.java12引用類型除了java語言中基本類型以外的變量類型Java中的對象是通過引用對其操作的例子StringS
/*聲明string類型的引用變量,但是沒使它指向一個對象*/S=newString(“helloworld!”);/*使用new語句創(chuàng)建一個String類型的對象并用S指向它,以后可以通過S完成對其的操作*/
NULL內(nèi)存0x3a123bhelloworld!堆內(nèi)存13成員方法定義成員方法的定義格式[修飾符]返回值類型方法名([參數(shù)列表]){
java語句;。。。//方法體}語法解釋:(1)形式參數(shù):在方法被調(diào)用時用于接收外界輸入的數(shù)據(jù)。(2)實參:調(diào)用方法時實際傳給方法的數(shù)據(jù)。(3)返回值:方法在執(zhí)行完畢后返回給調(diào)用它的環(huán)境的數(shù)據(jù)。(4)返回值類型:事先約定的返回值的數(shù)據(jù)類型,無返回值,必須給出返回類型viod。14成員方法定義Java語言中使用下述形式調(diào)用方法:
對象名.方法名(實參列表)實參的數(shù)目、數(shù)據(jù)類型和次序必須和所調(diào)用方法聲明的形式列表匹配。return語句終止方法的運行并指定要返回的數(shù)據(jù)。Java中進行函數(shù)調(diào)用中傳遞參數(shù)時,遵循傳遞的原則:基本類型傳遞的是該數(shù)據(jù)本身,引用類型傳遞的是對象的引用,不是對象本身15引用實例化對象或對象的創(chuàng)建和使用
創(chuàng)建一個對象有兩種方法
(1)先聲明再創(chuàng)建
對象聲明:類名對象名對象創(chuàng)建:對象名=new類名()
(2)一步到位法:
類名對象名=new類名();
使用:對象(引用).成員變量來引用對象的成員變量使用:對象(引用).方法(參數(shù)列表)來調(diào)用對象的方法16對象的創(chuàng)建和使用同一類的每個對象有不同的成員變變量存儲空間同一類的每個對象共享該類的方法例子Person.java17類和對象的關系(內(nèi)存)如何在內(nèi)存中區(qū)分類和對象?(1)類是靜態(tài)的概念,代碼區(qū)(2)對象是new出來的,位于堆內(nèi)存,類的每個成員變量在不同的對象中都有不同的值(除了靜態(tài)變量)而方法只有一份,執(zhí)行的時候才占用內(nèi)存18類和對象的關系(內(nèi)存)類C的代碼(codeseg) (heapseg)XXXXXXXXXXXXXXC1.iC1.jC2.iC2.jC1C2ClassC{ inti; intj;….main…{Cc1=newC();Cc2=newC();}}19構造方法
構造方法是定義在java類中的一個用來初始化對象的方法構造方法名字與類的名字相同,大小寫也保持一致使用new+構造方法創(chuàng)建一個新的對象構造函數(shù)與類同名且沒有返回值。即便是void也不能寫注意:當無指定構造函數(shù)時,編譯器為類自動添加形為:類名(){}的構造方法
20構造方法例如:Person類的構造函數(shù)publicclassPerson{ intid; intage=20; Person(int_id,int_age){ id=_id age=_age; }}
21創(chuàng)建對象時,使用構造函數(shù)初始化對象的成員變量。PublicclassTest{ Publicstaticvoidmain(String[]agrs){ Persontom=newPerson(1,25); Personjrry=newPerson(1,27); }}構造方法TOMjrryXXXX####
堆內(nèi)存12512722內(nèi)存詳細過程詳解
Tom:xxx_id:1_age:25調(diào)用構造函數(shù)(方法局部變量)new一個Person對象調(diào)用完成后方法、局部變量消失Id:1age:25棧內(nèi)存堆內(nèi)存23構造方法當無指定構造函數(shù)時,編譯器為類自動添加形為:類名(){}的構造方法
publicclassPerson{ intid; intage=20;}Personp=newPerson()
一旦自己定義了構造方法,系統(tǒng)就不會再給默認構造方法了24約定俗成的命名規(guī)則類名的首字母大寫變量名和方法名的首字母小寫運用駝峰標示25總結方法Java的方法類似于其他語言的函數(shù),是一段用來完成特定功能的代碼片段,聲明格式:
[修飾符1修飾符2…]返回值類型方法名(形式參數(shù)列表){java語句;…;…;}形式參數(shù):在方法被調(diào)用時用于接收外界輸入的數(shù)據(jù)。實參:調(diào)用方法時實際傳給方法的數(shù)據(jù)返回值:方法在執(zhí)行完畢后返還給調(diào)用它的環(huán)境的數(shù)據(jù)返回值類型:事先約定的返回值得數(shù)據(jù)類型,如無返還值,必須給出返回值類型void26總結方法Java語言中使用下述形式調(diào)用方法:
對象名.方法名(實參列表)實參的數(shù)目、數(shù)據(jù)類型和次序必須和所調(diào)用方法聲明的形參列表匹配Return語句終止方法的運行并制定要返回的數(shù)據(jù)Java中進行函數(shù)調(diào)用中傳遞參數(shù)時,遵循值傳遞的原則:基本類型傳遞的是該數(shù)據(jù)值本身。引用類型傳遞的是對對象的引用,而不是對象本身。27創(chuàng)建Java應用程序一個java應用程序通常由一個或多個類構成,但其中只能有一個類作為整個應用程序執(zhí)行的起點,稱之為主類。主類的類名必須與Java文件名相同,且必須含有main()方法,main()方法必須被聲明為public,static,void,具體格式如下:publicstaticvoidmain(Stringargs[]){//方法體}28創(chuàng)建Java應用程序main(Stringarg[])方法可以從命令行接收一個或多個參數(shù),這些參數(shù)作為字符串依次被傳遞并存入數(shù)組arg[]中??蠢覯ainTest()29復習:對象的創(chuàng)建和使用必須使用new關鍵字來創(chuàng)建對象對象(引用).成員變量來引用對象的成員變量對象(引用).方法(參數(shù)列表)來調(diào)用對象的方法同一類的每個對象有不同的成員變變量存儲空間同一類的每個對象共享該類的方法非靜態(tài)變量是針對每個對象進行調(diào)用30例子的分析Chap04/BirthDay(看DOC文檔)Exercise/TestCircle.java31課堂練習定義一個點(Point)類用來表示三維空間中的點(有三個坐標)。要求如下1.可以生成具有特定坐標的點對象(構造函數(shù))2.提供可以設置三個坐標的方法(修改坐標值)3.提供可以計算該點到原點距離平方的方法4.編程序為Cricle類添加一個方法,計算一個點(Point對象)是否在圓(Cricle對象)內(nèi),并寫程序驗證。
32重載overload什么是方法的重載(編譯時多態(tài)性)?在同一個類中至少有兩個方法用同一個名字,但有不同的參數(shù)個數(shù)或參數(shù)類型,調(diào)用時會根據(jù)不同的參數(shù)表選擇對應方法。類voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)1231.23123,1.2333重載overload例子TestOverLoad/test.java構造函數(shù)的重載(例子TestOverLoad.java)34this關鍵字
在類的方法定義中使用this關鍵字代表使用該方法的對象引用當必須指出當前使用方法的對象是誰時要使用this有時使用this可以處理方法中成員變量和參數(shù)重名情況this可以看做一變量,它的值是當前對象引用例子TestThis畫圖35使用類成員(Static)在類中,static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,在第一次使用時被初始化,對該類的所有對象來說,static成員變量只有一份。用static聲明的方法為靜態(tài)方法,在調(diào)用該方法時,不會將對象的引用傳遞給它,所以在static方法中不可訪問非static的成員。-----靜態(tài)方法不再是針對某個對象調(diào)用,所以不能訪問非靜態(tài)成員可以通過對象引用或者類名(不需實例化)訪問靜態(tài)成員。Cat.java36包java引入包(package)機制提供類的多重類命名空間。package語句作為java源文件第一句,指明該文件定義的類所在包。若缺省該語句,則指定為無名包)。它的格式為:packagepkg1[.pkg2[.pkg3….]];約定俗成的命名:com.域名.xxxjava編譯器把包語句對應于文件系統(tǒng)的目錄管理,package語句中使用”.”點指明包(目錄)層次如.sxt;指的是該文件中所有類位于.\com\sxt目錄下Java引入import機制簡化包的引入TestPackage37包-總結聲明包:package.pkg.xxx而編譯好的文件xx.class必須位于正確目錄下pkg\xxx\... 使用包,在另一個類中使用包中的類,必須寫全名稱,也可以用import關鍵詞,在文件開頭引入要使用的類,如importcom.bjsxt.java.*;注意:訪問位于同一個包中的類不需要引入可以不需要用import語句而直接使用java.lang包中的類必須class文件的最上層包的父目錄位于classpath下38J2SDK中主要包的介紹
Jdk目錄下jre\lib\rt.jar里面包含運行時需要的所有class文件:就是一個classpathJava.langjava語言的核心類,如String、Math、integer、System和thread,提供常用功能Java.awt構成抽象窗口工具集(abstractwindowtoolkits)的多個類,這些類被用來構件和管理應用程序的圖形用戶界面(GUI)J執(zhí)行與網(wǎng)絡相關的操作的類Java.io提供多種輸入/輸出功能的類Java.util一些實用工具類,如定義系統(tǒng)特性、使用與日期日歷相關的函數(shù)打包語句:在classpath的testpackage目錄下輸入:jar–cvftest.jar*.*39類的繼承Java中使用extends關鍵字實現(xiàn)類的繼承機制。語法為:<modifier>class<name>[extends<superclass>]{……}通過繼承,子類自動擁有了基類(父類)(superclass)的所有成員(成員變量和方法)java只支持單繼承,不允許多繼承:一個子類只能有一個基類一個基類可以派生出多個類classParent{privateintn_private=1;intfriendly=2;}classChildextendsParent{publicvoidf(){n_private=1;friendly=20;}}TestPerson.java40類及成員修飾符Java權限修飾符publicprotectedprivate置于類的成員定義前,用來限定其他對象對該類對象成員的訪問權限修飾符類內(nèi)部同一個包子類任何地方private√default√√protected√√√public√√√√對于class的權限修飾值可以用public和default1.公開:public類可以在任意地方被訪問2.默認:default類只可以被同一個包內(nèi)部的類訪問TestAccess.java41重寫(overridden)在子類中可根據(jù)需要對基類中繼承來的方法進行重寫就是說對父類中的方法不滿意需要自己重新寫重寫方法必須和被重寫方法具有相同方法名稱、參數(shù)列表和返回值重寫方法不能使用比被重寫方法更嚴格的訪問權限TestOverWrite.java42Super用super來引用當前基類(父類)的成分就是說子類繼承父類時,父類的某個方法雖然完成的不是很好但是也完成了部分功能不必重寫,就用super.f()調(diào)用父類的相應方法,再接著寫你想實現(xiàn)的功能cc::xxxValue:100Value:200thissuperTestSuper/TestInherit.java43繼承中的構造方法
子類的構造過程中必須調(diào)用基類的構造方法。子類可在自己的構造方法中使用super(argument_list參數(shù)列表)調(diào)用基類的構造方法。---如果調(diào)用super.必須寫在子類構造方法第一行---使用this(argument_list)調(diào)用本類的另外構造方法如果子類構造方法中沒有顯示的調(diào)用基類構造方法則系統(tǒng)默認調(diào)用基類無參數(shù)的構造方法。如果子類構造方法既沒有顯示地調(diào)用基類構造方法,而基類中又沒有無參數(shù)的構造方法,則編譯出錯TestSuper/TestSuperSub.java44練習classA{protectedvoidprint(Strings){System.out.println(s);}A(){print(“A()”);}publicvoidf(){print(“A:f()”);}}classBextendsA{B(){print(“B()”);}publicvoidf(){print(“B:f()”);}publicstaticvoidmain(Stringarg[]){Bb=newB();b.f();}}分析輸出結果,體會一般方法和構造方法在繼承中的區(qū)別把TestTeacher.java拷給學生,自己分析45對象轉型(casting)一個基類的引用類型變量可以指向其子類的對象一個基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)可以使用引用變量instanceof類名來判斷該引用類型變量所指向的對象是否屬于該類或該類的子類子類的對象可以當作基類的對象來使用稱作向上轉型(upcasting),否則稱作向下轉型(downcasting)46對象轉型(casting)例子1classAnimal{ publicStringname; Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n);eyesColor=c; }}classDogextendsAnimal{publicStringfurColor;Dog(Stringn,Stringc){ super(n);furColor=c;}}47對象轉型(casting)例子1publicclassTest{ publicstaticvoidmain(Stringarg[]){ Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black");
System.out.println(ainstanceofAnimal);//true System.out.println(cinstanceofAnimal);//true System.out.println(dinstanceofAnimal);//true System.out.println(ainstanceofCat);//false
a=newDog("bigyellow","yellow"); System.out.println(); //System.out.println(a.furColor); System.out.println(ainstanceofAnimal);//true System.out.println(ainstanceofDog);//true
Dogd1=(Dog)a; System.out.println(d1.furColor); }}48對象轉型(casting)例子2publicclassTest1{ publicstaticvoidmain(Stringarg[]){ Test1test=newTest1(); Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); test.f(a);test.f(c);test.f(d); }
publicvoidf(Animala){System.out.println("name:"+);if(ainstanceofCat){Catcat=(Cat)a;System.out.println(""+cat.eyesColor+"eyes");}elseif(ainstanceofDog){Dogdog=(Dog)a;System.out.println(""+dog.furColor+"fur");}}}49多態(tài)性是由封裝性和繼承性引出的面向對象程序設計語言的另一特征。靜態(tài)多態(tài)性(編譯時多態(tài)〕由方法重載(overload)實現(xiàn)動態(tài)多態(tài)性(運行時多態(tài))在執(zhí)行期間(非編譯期)判斷所引用對象實際類型,根據(jù)其實的類型調(diào)用其相應的方法
TestPolymoph/test.java總結:多態(tài)存在的條件:有繼承,有重寫,父類引用指向子類對象。一旦滿足,當調(diào)用父類里被重寫的方法時,實際new的哪個子類對象,就調(diào)用子類對象方法。50抽象類與抽象方法用abstract來修飾的類/方法規(guī)則:含有抽象方法的類必須被聲明為抽象類,抽象類必須被繼承,抽象方法必須重寫抽象類不能被實例化抽象方法只需聲明而不需實現(xiàn)TestAbstract\Test.java51final關鍵字final的變量的值不能夠被改變final的成員變量final的局部變量(形參)final的方法不能夠被重寫final的類不能夠被繼承如:publicfinalclassString類publicfinalvoidm()方法finalintI=9成員/局部變量TestFinal.java52接口/interface
接口是抽象方法和常量值的定義的集合從本質上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。接口定義舉例:
publicinterfaceRunner{(publicstaticfinal)intid=1;public(abstract)voidstart();//抽象類,不需要實現(xiàn)public(abstract)voidrun();public(abstract)voidstop();53接口/interface接口特征接口可以多重實現(xiàn);接口中聲明的屬性必須為publicstaticfinal的,可以不寫;接口中只能定義抽象方法,而且這些方法必須為publicabstract的;接口可以繼承其他的接口,并添加新的屬性和抽象方法;與繼承關系類似,接口與實現(xiàn)類之間存在多態(tài)性*接口之間可以相互繼承,類之間也可以相互繼承而類只能實現(xiàn)接口對象實現(xiàn)接口的時候一定要把接口中的方法定義54接口/interface接口規(guī)則多個無關類可以實現(xiàn)同一接口一個類可以實現(xiàn)多個無關接口與繼承關系類似接口與實現(xiàn)類之間存在多態(tài)性定義Java類的語法格式:<modifier>classclassname[extends<sopclass>][implements<interface>[,interface,…]]{}Testinterface/test.java55接口/interface聯(lián)系Testinterface/Valuable.java56類java.lang.ObjectObject類是所有Java類的根基類如果在類的聲明中未使用extends關鍵字指明其基類,則默認基類為Object類例子publicclassPerson{}publicclassPersonextendsObject{}
57類java.lang.Object該類定義了一些所有對象最基本的狀態(tài)和行為equals():比較兩個對象(引用)是否相同,如果相同返回true,否則返回false。相當于操作符“==”;getClass():返回對象運行時所
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度二零二五版跨境電商進出口代理合同范本2篇
- 二零二五年度醫(yī)療器械采購合同標的數(shù)量與質量檢測標準3篇
- 2025年度新型土石方運輸車輛租賃服務合同樣本12篇
- 二零二五年度個人留學借款借條范本及合同規(guī)范3篇
- 二零二五年度建筑裝飾工程項目施工合同
- 二零二五年度建筑安全責任追究措施協(xié)議書3篇
- 海南衛(wèi)生健康職業(yè)學院《園藝植物保護學》2023-2024學年第一學期期末試卷
- 二零二五年家政服務與家庭健康咨詢合同3篇
- 二零二五年度搬家貨運智能化物流解決方案合同3篇
- 按鍵去抖課程設計
- 微型消防站消防員培訓內(nèi)容
- 大一中國近代史綱要期末考試試題及答案
- (完整版)鋼筋加工棚驗算
- 安徽省合肥市廬陽區(qū)2023-2024學年三年級上學期期末數(shù)學試卷
- 概念方案模板
- 西南交大畢業(yè)設計-地鐵車站主體結構設計
- 2024年山東傳媒職業(yè)學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 江蘇省南通市崇川區(qū)2023-2024學年三年級上學期期末語文試卷
- crtd植入術護理查房
- 掃雪鏟冰安全教育培訓
- 人教版三年級下冊必讀書目《中國古代寓言故事》
評論
0/150
提交評論