面向?qū)ο筇卣髦v解_第1頁(yè)
面向?qū)ο筇卣髦v解_第2頁(yè)
面向?qū)ο筇卣髦v解_第3頁(yè)
面向?qū)ο筇卣髦v解_第4頁(yè)
面向?qū)ο筇卣髦v解_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4講面對(duì)對(duì)象特征(1)武漢高校國(guó)際軟件學(xué)院14.1基本概念什么是編程語(yǔ)言?人和計(jì)算機(jī)進(jìn)行溝通的工具和手段編程語(yǔ)言的發(fā)展機(jī)器語(yǔ)言:0101001匯編語(yǔ)言:mov,push,add,call第三代語(yǔ)言:高級(jí)語(yǔ)言,以C語(yǔ)言為代表,過(guò)程式編程語(yǔ)言(ProceduralProgrammingLanguage)第四代語(yǔ)言:非過(guò)程化/面對(duì)對(duì)象的編程語(yǔ)言語(yǔ)言的發(fā)展:抽象的過(guò)程2面對(duì)對(duì)象(ObjectOriented-OO)面對(duì)對(duì)象編程(ObjectOrientedProgramming-OOP)面對(duì)對(duì)象是一種軟件開(kāi)發(fā)的方法,“面對(duì)對(duì)象的分析與設(shè)計(jì)”(OOA&OOD—探討生課程)第一個(gè)面對(duì)對(duì)象的語(yǔ)言:Simula-67第一個(gè)成功的面對(duì)對(duì)象編程語(yǔ)言:SmalltalkC++,JAVA,C#,PERL等用客觀世界中描述事物的方法來(lái)描述程序中要解決的問(wèn)題萬(wàn)事萬(wàn)物都是對(duì)象程序便是成堆的對(duì)象,彼此通過(guò)消息的傳遞,懇求其他對(duì)象進(jìn)行工作4.1基本概念(續(xù))3五個(gè)基本概念對(duì)象類封裝性繼承性多態(tài)性4.1基本概念(續(xù))4對(duì)象(object)everythingisanobject現(xiàn)實(shí)世界的對(duì)象:桌子、書、自行車、電視、狗、文件、表格、按鈕、窗口對(duì)象包含兩個(gè)特性狀態(tài):指對(duì)象本身的信息(內(nèi)部信息/內(nèi)部變量)行為:實(shí)現(xiàn)對(duì)信息的訪問(wèn)/對(duì)象的操作標(biāo)記:代表對(duì)象的標(biāo)識(shí)符山地車的狀態(tài)(兩個(gè)車輪、一些齒輪、速度、擋數(shù)),行為(剎車、加速、減速和換擋)書包含很多信息,擁有訪問(wèn)所包含信息的方法,一頁(yè)一頁(yè)的看,通過(guò)書目找到感愛(ài)好的內(nèi)容4.1.1對(duì)象5對(duì)象(object)狀態(tài)變量(variables)行為方法(method)對(duì)象就是變量和相關(guān)方法的軟件集合一個(gè)對(duì)象可以由其他對(duì)象組合而成,窗口(按鈕,菜單條,文本框,狀態(tài)欄等)程序就是對(duì)象的集合,對(duì)象之間相互交互和通信完成任務(wù)搭積木Aprogramisabunchofobjectstellingeachotherwhattodobysendingmessages4.1.1對(duì)象(續(xù))6類(class)亞里士多德:theclassoffishesandtheclassofbirds現(xiàn)實(shí)世界中,存在很多同類的對(duì)象,很多桌子、書、自行車一種原型,一種抽象,一種共性,一個(gè)模板Everyobjecthasatype實(shí)例(instance),某類對(duì)象的一個(gè)特定實(shí)體,類是對(duì)象的一個(gè)抽象表格(類)填入不同的個(gè)人信息不同的對(duì)象4.1.2類7封裝性對(duì)象本身的數(shù)據(jù)得到愛(ài)護(hù)/隱藏其他對(duì)象僅僅須要知道對(duì)該對(duì)象的訪問(wèn)方法(接口/interface)即可好處模塊化--每個(gè)對(duì)象的源文件可以是相互獨(dú)立的,可以被不同的程序調(diào)用,每個(gè)對(duì)象是一塊積木,可以搭建不同的形態(tài)信息隱藏--通常定義一個(gè)公共接口/方法實(shí)現(xiàn)對(duì)對(duì)象的訪問(wèn),可以調(diào)整對(duì)象的私有信息和方法,而不會(huì)對(duì)其他調(diào)用它的對(duì)象產(chǎn)生影響可重用性黑盒子電腦的DIY噴墨打印機(jī),硒鼓壞/彩色硒鼓4.1.3封裝性8繼承性為什么會(huì)有繼承?建立一個(gè)類后,發(fā)覺(jué)另一個(gè)新的類有相同的特性,兩個(gè)選擇:重新定義一個(gè)新的類;在已有類的基礎(chǔ)上,修改(加加/減減)父類和子類,子類繼承(擁有)父類全部的數(shù)據(jù)和方法,同時(shí)子類可以有新的數(shù)據(jù)和方法,“青出于藍(lán),而勝于藍(lán)”樹(shù)型結(jié)構(gòu)(層次化結(jié)構(gòu))根(基類)4.1.4繼承性9繼承性運(yùn)輸工具航空運(yùn)輸工具陸地運(yùn)輸工具水上運(yùn)輸工具人力驅(qū)動(dòng)引擎驅(qū)動(dòng)二輪四輪客運(yùn)貨運(yùn)4.1.4繼承性(續(xù))10繼承性多重繼承類A類B類C類D類F類G一個(gè)類擁有多個(gè)父類產(chǎn)生二義性,例類C和類D都有一個(gè)同名的方法,類G?Java中僅僅支持單一繼承,同時(shí)Java接受Interface(接口)實(shí)現(xiàn)多重繼承而避開(kāi)父類二義性4.1.4繼承性(續(xù))11多態(tài)性表現(xiàn)在繼承中方法的重寫子類從父類繼承(extends擴(kuò)展)而來(lái)多個(gè)子類同屬一個(gè)父類,全部子類有相同的父類繼承父類的方法在不同的子類中有不同的表現(xiàn)形式表現(xiàn)在用一個(gè)類中方法的重載4.1.5多態(tài)性12多態(tài)性多態(tài)性在繼承中的表現(xiàn)4.1.5多態(tài)性(續(xù))13多態(tài)性classSquareextendsShape{ voiddraw(){ System.out.println("Square.draw()"); } voiderase(){ System.out.println("Square.erase()“); }}classTriangleextendsShape{ voiddraw(){ System.out.println("Triangle.draw()"); }voiderase(){ System.out.println("Triangle.erase()");}}classShape{ voiddraw(){} voiderase(){}}classCircleextendsShape{ voiddraw(){ System.out.println("Circle.draw()"); } voiderase(){ System.out.println("Circle.erase()");}}4.1.5多態(tài)性(續(xù))14多態(tài)性publicclassTest{publicstaticShaperandShape(){switch((int)(Math.random()*3)){default:case0:returnnewCircle();case1:returnnewSquare();case2:returnnewTriangle();}

}publicstaticvoidmain(String[]args){Shape[]s=newShape[9];for(inti=0;i<s.length;i++)s[i]=randShape();for(inti=0;i<s.length;i++)s[i].draw();}}Circle.draw()Triangle.draw()Circle.draw()Circle.draw()Circle.draw()Square.draw()Triangle.draw()Square.draw()Square.draw()4.1.5多態(tài)性(續(xù))15程序是對(duì)象的集合,而對(duì)象是類的實(shí)例化源程序就是一個(gè)個(gè)的Java類Java本身供應(yīng)的類(核心API)見(jiàn)Java文檔中描述程序員可以對(duì)其進(jìn)行調(diào)用j2sdk1.4.1_01\jre\lib\rt.jar(22.4MB)程序員自己定義的類4.2類16類的定義格式[類的修飾符]class類名[extends父類名]implements[接口名]{ 類型 成員變量1; 類型 成員變量2; …… ………… 類型 成員方法1(參數(shù)1,[參數(shù)2,…]){ 方法體; } 類型 成員方法2(參數(shù)1,[參數(shù)2,…]){ 方法體; } …… …………}4.2.1類的定義17類的定義格式[類的修飾符]class類名[extends父類名][implements接口名]{ …… ………… }類的修飾符public:公共類,可以被其他類所運(yùn)用,declaresthattheclasscanbeusedbyanyclassregardlessofitspackage(無(wú)任何限制)無(wú)修飾/默認(rèn)說(shuō)明:aclasscanbeusedonlybyotherclassesinthesamepackage(僅僅能在同一個(gè)包中的其他類引用)abstract:declaresthattheclasscannotbeinstantiated(宣布該類不能被實(shí)例化)final:declaresthattheclasscannotbesubclassed(宣布該類不能有子類)4.2.2類的描述18類的修飾符final--Declaresthattheclasscannotbesubclassed.(宣布該類不能有子類)4.2.3類的修飾符finalclassChessAlgorithm{...}classBetterChessAlgorithmextendsChessAlgorithm{...}Can'tsubclassfinalclasses:classChessAlgorithmclassBetterChessAlgorithmextendsChessAlgorithm{^1error19類的定義格式[類的修飾符]class類名[extends父類名][implements接口名]{ …… ………… }extends:繼承的關(guān)系implements:實(shí)現(xiàn)哪些接口(interface)的方法,實(shí)現(xiàn)多重繼承publicclassTestextendsFrame implementsActionListener,ItemListener{ …… ……}4.2.4類的定義格式20一個(gè)簡(jiǎn)潔的類classStudent{ Stringname,stuNumber; doublescore1,score2,score3; voidset1(Strings1,Strings2){ name=s1; stuNumber=s2; System.out.println(name+““+stuNumber); } doublesetScore(doubled1,doubled2,doubled3){ doubled; score1=d1; score2=d2; score3=d3; d=d1+d2+d3; returnd; }}4.2.5一個(gè)簡(jiǎn)潔的類21包(Package)的概念packageorg.jalpha;classtest{ ……}源文件位置:“D:\src\org\jalpha\test.java”編譯方法1:“cdD:\src\org\jalpha\”“javactest.java”編譯方法2:“cdD:\src\”“javacorg\jalpha\test.java”class文件位置:“D:\src\org\jalpha\test.class”運(yùn)行:“cdD:\src\”“javaorg.jalpha.test”4.3包(Package)的概念22包(Package)的概念通過(guò)包來(lái)管理類名空間防止同名類名的沖突層次化的結(jié)構(gòu)對(duì)個(gè)體(個(gè)人和機(jī)構(gòu))將類文件放在不同的書目下防止重名org\jalpha\method1\***.javamethod2\***.javaABC公司Engine.javaXYZ公司Engine.java需調(diào)用Engine.java?ABC公司com\abc\Engine.javaXYZ公司com\xyz\Engine.java23包(Package)的概念packageorg.jalpha;classtest{ ……}D:\src\org\jalpha\test.javaD:\src\org\jalpha\test1.javaD:\src\org\jalpha\test2.javaD:\src\org\weeva\test3.javapackageorg.weeva;importorg.jalpha.*;classtest3{ … …}24對(duì)象具有狀態(tài)和行為成員變量定義[訪問(wèn)權(quán)限修飾符]類型變量名;[訪問(wèn)權(quán)限修飾符]類型變量名[=初值];[訪問(wèn)權(quán)限修飾符]類型變量名[=初值][,變量名[= 初值]…];成員方法定義[訪問(wèn)權(quán)限修飾符]方法返回類型方法名()[throws異樣名]{ 方法體;}類型:基本類型,復(fù)合類型(數(shù)組、類和接口)類成員25訪問(wèn)限制修飾符公共訪問(wèn)限制符-public被全部類訪問(wèn)默認(rèn)訪問(wèn)限制符被同一包中其他類訪問(wèn)私有訪問(wèn)限制符-private被該類自身訪問(wèn)愛(ài)護(hù)訪問(wèn)限制符-protected該類自身、同一個(gè)包中的其他類、其他包中的子類訪問(wèn)私有愛(ài)護(hù)訪問(wèn)限制符-privateprotected該類自身、全部子類訪問(wèn)4.3.1訪問(wèn)限制修飾符26非訪問(wèn)限制修符靜態(tài)變量static屬于類的變量最終變量final值在程序的執(zhí)行過(guò)程中不會(huì)變更易失變量volatile可能同時(shí)被多個(gè)線程所限制和修改4.3.2非訪問(wèn)限制修符27public(公共變量/公共方法)容許全權(quán)訪問(wèn),無(wú)任何限制(先構(gòu)造對(duì)象,再訪問(wèn))4.3.3public(公共變量/公共方法)classA{

publicintx;

publicvoidprint(){…}}classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}packageabc;classA{

publicintx;

publicvoidprint(){…}}packagexyz;importabc.A;classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}干脆訪問(wèn)公有變量x和公共方法print()28private(私有變量/私有方法)僅能在其所定義的類中被訪問(wèn)(先構(gòu)造對(duì)象,再訪問(wèn))D:\>javacA.javaxhasprivateaccessinAa.x=100;^print()hasprivateaccessinAa.print();^2errors4.3.4private(私有變量/私有方法)classA{

privateintx;

privatevoidprint(){…}}classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}29protected(愛(ài)護(hù)變量/愛(ài)護(hù)方法)容許類本身、子類(有確定限制)以及同一個(gè)包中全部類訪問(wèn)(先構(gòu)造對(duì)象,再訪問(wèn))4.3.5protected(愛(ài)護(hù)變量/愛(ài)護(hù)方法)classA{

protectedintx;

protectedvoidprint(){…}}classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}packageabc;classA{

protectedintx;

protectedvoidprint(){…}}packagexyz;importabc.A;classBextendsA{ voidtest(Aa,Bb){ a.x=100; a.print(); b.x=100; b.print(); }}//illegal//illegal//legal//legal30無(wú)修飾(友好變量/友好方法)容許類本身以及同一個(gè)包中全部類訪問(wèn)4.3.6無(wú)修飾(友好變量/友好方法)classA{ intx; voidprint(){…}}classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}packageabc;classA{ intx; voidprint(){…}}packageabc;classB{ voidtest(){ Aa=newA(); a.x=100; a.print(); }}31小結(jié)名稱訪問(wèn)權(quán)修飾符類本身子類包所有類公共public默認(rèn)---保護(hù)protected*私有private*指子類與父類不在同一個(gè)包中的狀況4.3.7小結(jié)32static(靜態(tài)變量/靜態(tài)方法)類的變量/方法,獨(dú)立于類的對(duì)象,可以干脆依據(jù)類名調(diào)用classS{ staticintA=12,B=34; staticvoidprint(){…}}classTest{ publicstaticvoidmain(Stringargs[]){ System.out.println(“A=“+S.A+“B=“+S.B); S.print(); }}4.4類成員變量33static(靜態(tài)變量/靜態(tài)方法) classTest{

publicvoidprint(intx){ System.out.println(x); }

publicstaticvoidmain(Stringargs[]){ intx=3; print(x); } }D:\>javacTest.javaTest.java:9:non-staticmethodprint(int)cannotbereferencedfromastaticcontextprint(x);^1errorclassTest{

publicvoidprint(intx){ System.out.println(x);}

publicstaticvoidmain(Stringargs[]){ intx=3; Testt=newTest(); t.print(x); }}classTest{

publicstaticvoidprint(intx){ System.out.println(x); }

publicstaticvoidmain(Stringargs[]){ intx=3; print(x); }}static方法中僅僅可以調(diào)用其他static方法4.4.1static(靜態(tài)變量/靜態(tài)方法)34final變量/方法final變量:定義一個(gè)常數(shù),即變量值不能變更finaldoubleAVOGADRO=6.022e23;final類:不能有子類final方法:方法不能被重寫(overriding)classChessAlgorithm{...finalvoidnextMove(ChessPiecepieceMoved,BoardLocationnewLocation){...}...}4.4.2final變量/方法35小結(jié)類:public,abstract,final,無(wú)修飾,[private]類成員publicprotectedprivate無(wú)修飾staticfinal4.4.3類成員變量小結(jié)36方法:對(duì)象行為的描述完成某種功能的程序塊定義: [訪問(wèn)權(quán)限修飾符]方法返回類型方法名()[throws異樣名]{ 方法體; }方法參數(shù)的傳遞變量的作用域方法的重載(overloading)/重寫(overriding)方法的遞歸調(diào)用4.5類成員方法37訪問(wèn)限制修飾符公共訪問(wèn)限制符-public被全部類訪問(wèn)默認(rèn)訪問(wèn)限制符被同一包中其他類訪問(wèn)私有訪問(wèn)限制符-private被該類自身訪問(wèn)愛(ài)護(hù)訪問(wèn)限制符-protected該類自身、同一個(gè)包中的其他類、其他包中的子類訪問(wèn)私有愛(ài)護(hù)訪問(wèn)限制符-privateprotected該類自身、全部子類訪問(wèn)4.5.1類成員方法的訪問(wèn)38非訪問(wèn)限制修符靜態(tài)方法static屬于類的方法最終方法final不能被子類重新定義的方法抽象方法abstract只有方法說(shuō)明,沒(méi)有具體實(shí)現(xiàn)本地方法native以其他語(yǔ)言實(shí)現(xiàn)方法功能同步方法synchronized用于多線程程序中的協(xié)調(diào)和同步4.5.2非訪問(wèn)限制修符39例4.5.2成員方法調(diào)用classTest{publicstaticvoidmain(Stringargs[]){ doubled_product; AreamyArea; myArea=newArea();d_product=myAduct(); System.out.println(“myArea的面積是:”+d_product); }}classArea{ doublewidth,height;voidsetV(doublew,doubleh){ width=w; height=h; } doubleproduct(){ returnwidth*height; }} 40方法參數(shù)4.5.3PassbyValuepublicstaticvoidmain(Stringargs[]){ intx=3,y=4; Testp=newTest(); System.out.println(x+""+y); p.addI(x,y); System.out.println(x+""+y);

Vectorc=newVector(); c.addElement("s1"); c.addElement("s2"); System.out.println(c.size()); p.addV(c); System.out.println(c.size()); }}importjava.util.Vector;classTest{ privatevoidaddV(Vectorv){ v.addElement("s3"); }

privatevoidaddI(inti1,inti2){ i1++; i2++; }形參和實(shí)參D:\>javaParameter343423留意1:類型匹配留意2:基本類型與復(fù)合類型參數(shù)傳遞的結(jié)果不同PassbyValueInJavamethods,argumentsarepassedbyvalue.Wheninvoked,themethodreceivesthevalueofthevariablepassedin.Whentheargumentisofprimitivetype,pass-by-valuemeansthatthemethodcannotchangeitsvalue.Whentheargumentisofreferencetype,pass-by-valuemeansthatthemethodcannotchangetheobjectreference,butcaninvoketheobject'smethodsandmodifytheaccessiblevariableswithintheobject.41例classTest{publicstaticvoidmain(Stringargs[]){ exA=newex(); A.p(); }}classex{ intu,v; voidp2(intx,inty){ inti,j; for(i=1;i<=x;i++){ j=y+i; System.out.print(j+“”); } } voidp(){ u=3;v=2;p2(u,v); System.out.println(); u+=v;v*=u;p2(u,v); }}u=3;v=2;u=5;v=10;輸出結(jié)果:345111213141542變量的作用域(成員變量/局部變量)4.5.4變量的作用域(成員變量/局部變量)43方法的重載(overload)方法名相同,但方法的參數(shù)不同方法描述方法名(標(biāo)識(shí)符)參數(shù)類型 方法返回值確定值abs(a)intint確定值abs(a)longlong確定值abs(a)floatfloat確定值abs(a)doubledouble……publicstaticintabs(int

a)publicstaticlongabs(long

a)publicstaticfloatabs(float

a)publicstaticdoubleabs(double

a)4.5.5方法的重載(overload)44方法的重寫(overriding)子類重寫父類的方法4.5.6方法的重寫(overriding)classFather{ …… voiddisplay(){ ……; } ……}classSonextendsFather{ …… voiddisplay(){ ……; } ……}Fatherf=newFather();f.display();Sons=newSon();s.display();454.5.7構(gòu)造方法創(chuàng)建對(duì)象/實(shí)例化對(duì)象—new

例1:Applea=newApple();(創(chuàng)建對(duì)象)例2:Applea;(對(duì)象的說(shuō)明) a=newApple();(實(shí)例化對(duì)象)對(duì)象的實(shí)例化通過(guò)構(gòu)造方法(constructor)來(lái)實(shí)現(xiàn)構(gòu)造方法的名字與類名相同構(gòu)造方法沒(méi)有返回值構(gòu)造方法可以有多個(gè),構(gòu)成方法的重載(overload)46例:對(duì)象的實(shí)例化和初始化classjex6_8{publicstaticvoidmain(Stringargs[]){ Qangleq1=newQangle(); Qangleq2=newQangle(20,50); Qangleq3=newQangle(q1); System.out.println(q1.width()+“” +q1.height()); System.out.println(q2.width()+“” +q2.height()); System.out.println(q3.width()+“” +q3.height()); }}classQangle{ inta,h; Qangle(){ a=10;h=20; } Qangle(intx,inty){ a=x;h=y; } Qangle(Qangler){ a=r.width(); h=r.height(); } intwidth(){returna;} intheight(){returnh;}}輸出結(jié)果:20205010對(duì)象的實(shí)例化和初始化47再談方法的重載(overload)再談方法的重載(overload)classTree{intheight;Tree(){ prt(“Plantingaseeding”); height=0;}Tree(inti){prt(“CreatingnewTree thatis”+i+“feettall”); height=i;}voidinfo(){ prt(“Treeis”+height+ “feetheight”);} voidinfo(Strings){ prt(s+“:Treeis”+ height+“feetheight”);} staticvoidprt(Strings){ System.out.println(s);}}for(inti=0;i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論