版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java面向對象程序設計
Java面向對象任務目的掌握Java類的定義掌握Java類的成員變量和成員方法的定義掌握對象的創(chuàng)建和使用掌握構造方法創(chuàng)建和使用掌握類的繼承掌握類的訪問控制修飾符掌握類的對象轉型掌握類的多態(tài)掌握抽象類和接口面向對象語言的特征計算機編程語言經歷了由低級到高級語言的轉變過程,包括機器語言、匯編語言、高級語言,其中高級語言包括面向過程的語言和面向對象的語句,典型的面向過程的語言C語言,面向對象語言是Java語言,對象是Java語言的核心,Java語言中體現了“萬事萬物皆對象”。面向對象語言有三大特征:封裝、繼承和多態(tài)。封裝性將數據和數據的操作放在一起形成一個封裝體,這個封裝體它可以提供對外部的訪問,同時對內部的具體細節(jié)也實現了隱藏,也能控制外部的非法訪問。封裝體的基本單位是類,對象是類的實例,一個類的所有對象都具有相同的數據結構和操作代碼。繼承性是面向對象的第二個特性,它支持代碼重用,繼承可以在現有類的基礎上進行擴展從而形成一個新的類,它們之間成為基類和派生類的關系,派生類不僅具有基類的屬性特征和行為特征而且還可以添加新的特征。采用繼承的機制來組織、設計系統中的類,可以提高程序的抽象程度,使之更接近于人類的思維方式,同時也通過繼承能較好地實現代碼重用,可以提高程序開發(fā)效率,降低維護的工作量。多態(tài)性使得多個不同的對象接收相同的消息卻產生不同的行為,它大大提高了程序的抽象程度和簡潔性,更重要的是,它最大限度地降低了類和程序模塊之間的耦合性,提高了類模塊的封閉性,使得它們不需了解對方的具體細節(jié),就可以很好地共同工作。這個優(yōu)點對于程序的設計、開發(fā)和維護都有很大的好處。類客觀世界物以類聚,將一些具有共同特征的的實體放在一起,形成類,如“學生”類、“教師”類、“玩具”類等。面向對象的程序是用來解決實際問題的,要求程序和現實世界中的實體具有一致性,那怎樣將客觀世界的實體轉變?yōu)橛嬎銠C程序設計語言,這涉及到“具體”到“抽象”的過程,將實現世界中的物體類的共性的特征和行為抽取出來,用計算機的程序設計語言class類來表示。類是用于描述同一類型的對象的一個抽象的概念,類中定義了這一類對象所具有的靜態(tài)(成員變量)和動態(tài)(成員方法)屬性。它是一種新的數據類型,具有封裝性。類的定義類是Java程序的基本單位,在Java中定義一個類,一般包括類的聲明和類體兩個部分。其一般格式為:類聲明{ //類體}1、類聲明:一般格式為:[修飾符]class類名[extends基類名][implements接口名]其中[]部分是可選的,修飾符包括訪問控制符和非訪問控制符,class是Java的關鍵字,表示這是一個類的定義,類名必須是合法標識符,且首字母一般約定為大寫字母,類名指定一個有意義的名稱,extends表示繼承,該類要繼承基類名,implements表示該類還要實現其他接口。2、類體:類體就是類聲明后{}里面的部分,一般包括類的成員變量和類的成員方法的定義。3、最簡單的類的定義形式如下:class類名{ //成員變量定義部分;
…… //成員方法定義部分;
……}定義一個學生類:classStudent{//定義成員變量StringstrName;//學生姓名StringstrNo;//學生學號intiAge;//學生年齡doubledScore;//學生成績//定義成員方法voiddisplay(){System.out.println("學生的姓名:"+strName+"的成績"+dScore);}}類的成員變量與成員方法類的成員變量與成員方法定義一個類時,在類體中可以有成員變量和成員方法。成員變量,它體現的是對象的靜態(tài)屬性,而成員方法體現的是對象的動態(tài)行為。1、成員變量:在類中定義的變量,也稱為屬性。成員變量定義的格式:[修飾符]數據類型成員變量;1)修飾符可以使訪問控制符,也可以是static、final等關鍵字,數據類型可以是基本數據類型,也可以是引用數據類型。2)在定義類的成員變量時可以對其初始化,如果不對其初始化,Java使用默認值對其初始化。其結果如表3.1所示:表3.1Java類的成員的變量默認初始值成員變量類型默認取值byte0short0int0long0Lchar‘\u0000’float0.0Fdouble0.0booleanfalse所有引用類型null3)成員變量的作用范圍為整個類體2、成員方法:1)成員方法的定義:Java的類的成員方法類似于其他語言的函數,是一段完成特定功能的代碼段。成員方法的定義格式:修飾符返回值類型方法名([形式參數列表]){//方法體;}方法定義的第一行稱為方法的聲明,{}里面稱為方法體。修飾符可以使訪問控制符,也可以是static、final等關鍵字,在定義方法時要指明返回類型,返回值類型可以基本數據類型,也可以引用數據類型,如果方法不返回值,則應顯示式聲明返回類型為void,如果一個方法需要接受外界輸入的數據,則要定義形式參數,如果不需要外界輸入數據,形式參數列表可以為空。2)形式參數列表的定義格式:數據類型1變量名1,數據類型2變量名2,…數據類型n變量名n例如:publicvoidsetName(StringName){strName=Name;}publicvoiddisplay(){System.out.println("學生的姓名:"+strName+"的成績"+dScore);}3)方法的返回值語句return語句方法體采用return語句終止方法的運行并指定要返回的數據,該值會返回給調用者。語法格式:return表達式;return關鍵字用于結束方法以及返回方法指定的類型的值,當方法的返回值為void時,return及其返回值可以省略。4)成員方法的使用:成員方法的調用一般通過對象來調用,調用的語法格式為:對象名.方法名(實參列表);方法調用中實參列表數據類型和個數和形參列表數據一一對應。【例3-1】:通過案例掌握類的方法的定義和調用。classStudent{//定義成員變量StringstrName;//學生姓名StringstrNo;//學生學號intiAge;//學生年齡doubledScore;//學生成績//定義成員方法voiddisplay(){System.out.println("學生姓名:"+strName+",學號:"+strNo+",年齡:"+iAge+",成績"+dScore);}}publicclassDemo3_01{publicstaticvoidmain(String[]args){ Students1=newStudent(); s1.strName="余華"; s1.strNo="1001"; s1.iAge=18; s1.dScore=90.2; s1.display(); }}程序輸出結果:對象
從類是一種新的數據類型,封裝了對象的靜態(tài)屬性和行為,類可以看成某一類對象的模板,對象可以看成類的一個具體實例。對象的創(chuàng)建由類創(chuàng)建對象,創(chuàng)建對象一般分為兩個部分:1、聲明對象名類名對象名;2、給對象實例化:對象名=new類名([參數列表]);用new來創(chuàng)建對象并實例化,為對象申請空間,分配內存。類名([參數列表])是調用類的構造方法,給對象進行初始化。以上1、2兩個部分可以合并:類名對象名=new類名([參數列表]);為學生類創(chuàng)建對象yuhuaStudentyuhua=newStudent();對象的使用創(chuàng)建對象后,對象就擁有自己的成員變量和成員方法,對象通過“.”號來調用成員變量和成員方法。對象名.成員變量名;對象名.成員方法名([實參]);實參調用方法時實際傳給方法的數據?!纠?-2】:通過案例掌握類的定義和對象的創(chuàng)建。classPerson{//成員變量的定義privateintid;privateintage=20;//成員方法的定義publicvoidsetId(intParaId){id=ParaId;}publicintgetID(){returnid;}publicvoidsetAge(intParaAge){age=ParaAge;}publicintgetAge(){returnage;}publicvoiddisplay(){System.out.println(id+":"+age);}}publicclassDemo3_02{ publicstaticvoidmain(String[]args){Personp1=newPerson(); p1.setId(1001); p1.setAge(25); p1.display(); }}程序輸出結果:例3-3】:通過案例掌握類的成員變量和成員方法的調用。定義一個點類,在該類里定義二個方法,一個實現實現點到原點之間的距離,另一個實現任意兩個點之間的距離,創(chuàng)建對象調用該方法并輸出結果。classPointClass{intx;inty;PointClass(int_x,int_y){x=_x;y=_y;}publicdoubledisO(){returnMath.sqrt(x*x+y*y);}publicdoubledis(PointClassp2){returnMath.sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y));}}publicclassDemo3_03{ publicstaticvoidmain(String[]args){ PointClassp1=newPointClass(3,4); doubled1=p1.disO(); System.out.println("p1到原點的距離:"+d1); PointClassp2=newPointClass(5,9); doubled2=p1.dis(p2); System.out.println("p1到p2的距離:"+d2); }}程序運行的結果:類的構造方法在類體中有一種特殊的方法,即構造方法,它在創(chuàng)建對象時自動調用,構造方法的作用對對象進行初始化。構造方法具有如下特點:1)構造方法名與類名相同。2)構造方法沒有返回值,返回值類型為空,即使void也不寫。3)構造方法可以有多個形式參數,也可以無參。4)一個類中可以同時定義多個構造方法,調用構造方法時,系統會根據參數個數及類型尋找匹配的構造方法。5)如果類中沒有定義構造方法,系統會提供默認一個無參的構造方法,其方法體為空,形式如下:類名(){}6)如果類中已經定義構造方法,系統不再提供默認無參構造方法。7)構造方法的調用與成員方法的調用不同,它是在創(chuàng)建對象時自動調用,即格式:new類名(參數);【例3-4】:通過案例掌握構造方法的定義和調用。classPerson{Stringname;intage;Person(){name="Lisi";age=20;}Person(StringstrName,intiAge){name=strName;age=iAge;}Person(StringstrName){name=strName;age=20;}}publicclassDemo3_04{ publicstaticvoidmain(String[]args){ Personp1=newPerson();//調用第一個構造方法 Personp2=newPerson("zhao",20);//調用第二個構造方法 Personp3=newPerson("zhao");//調用第三個構造方法 }}方法的重載方法重載通常用于完成一組任務相似,但參數的不同的方法。Java中方法的重載是指一個類中可以定義有相同的名字,但參數不同的多個方法。調用時,會根據不同的參數表選擇相應的方法。方法的重載具有的特點:1、方法名相同2、方法的參數不同,參數不同包括:參數的個數或者類型不同3、跟方法的返回值無關,返回值類型可以相同也可以不相同【例3-5】:通過案例掌握方法重載的定義和調用。classPerson{privateintid;privateintage;Person(){id=1001;age=25;}Person(int_id,int_age){ id=_id; age=_age;}publicintgetAge(){returnage;}publicvoidsetAge(inti){age=i;}publicintgetId(){returnid;}voidinfo(){System.out.println("myidis:"+id);}voidinfo(Stringt){System.out.println(t+"id"+id);}}publicclassDemo3_05{ publicstaticvoidmain(String[]args){ Personp=newPerson(); Personp2=newPerson(2,500); (); ("ok"); }}程序輸出的結果:方法的重載在調用時,根據實參和形參的對應關系找到類型相匹配的關系,如果沒有找到類型相匹配的方法,Java編譯器會找可以兼容的類型來調用(根據數據類型轉換原則,自動轉換的數據類型可以來調用)。例如:【例3-6】:通過案例掌握方法重載,如果沒有找到類型匹配的方法,通過兼容的類型來調用。classArea{doublegetArea(doubler){ return3.14*r*r;}doublegetArea(floatx,inty){ returnx*y;} floatgetArea(intx,floaty){ returnx*y; }}publicclassDemo3_06{ publicstaticvoidmain(String[]args){ Areaa1=newArea(); System.out.println(a1.getArea(2));//調用第一個getArea方法 System.out.println(a1.getArea(2.5f,3));//調用第二個getArea方法 System.out.println(a1.getArea(3,2.5f));//調用第三個getArea方法}}程序運行的結果:a1對象調用getArea的三個方法,其中a1.getArea(2)調用第一個getArea方法,根據數據類型轉換原則,2數值默認是int整型常量,將整型常量轉換為double型數據類型,屬于自動轉換。如果將a1.getArea(2.5f,3)中的2.5后面的f去掉,則編譯不成功,因為2.5數值屬于double型數據,將double型數據賦給float型數據,需要強制轉換。this關鍵字this是Java的一個關鍵字,表示當前對象的引用,主要應用在:1、this調用本類的成員變量:this可以調用本類的成員變量,其語法格式:this.成員變量類的成員變量和方法中的形式參數重名的情況下,采用this關鍵字來區(qū)別。classRectangle{privatedoublelength;privatedoublewidth;Rectangle(doublelength,doublewidth){this.length=length;this.width=width;}}this.length表示當前對象this訪問成員變量length,而不是形式參數變量length。2、使用this調用本類的其他構造方法在構造方法中用this調用本類中的其他構造方法,此時this指代本類類名,調用時要放在構造方法的首行。其語法格式:this(參數列表);此處的參數列表和被調用的構造方法參數列表是匹配的,如下例:classPerson{intage;Stringname;publicPerson(){}publicPerson(intage){this.age=age;}publicPerson(intage,Stringname){this(age);//調用了第二個構造方法=name;}}3、this可以看作一個變量,它的值是當前對象的引用【例3-7】:通過案例掌握this關鍵字的使用。publicclassDemo3_07{ inti=0; Demo3_07(inti){this.i=i;} Demo3_07increament(){i++;returnthis;//返回的是當前的對象}voiddisplay(){System.out.println("i="+i);}publicstaticvoidmain(String[]args){ Demo3_07demo07=newDemo3_07(100);demo07.increament().increament().display();}}程序運行結果:static關鍵字static是Java的關鍵字,static表示“全局”或者“靜態(tài)”的意思,可以用來修飾類的成員變量和類的成員方法。1、修飾類的成員變量:在類中,用static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,在第一次使用時被初始化,對于該類的所有對象來說,static成員變量只有一份。語法格式:static數據類型變量名;2、修飾類的成員方法:用static聲明的方法為靜態(tài)方法,在調用該方法時,不會將對象的引用傳遞給它,所以在static方法中不可以訪問非static的成員??梢酝ㄟ^對象引用或類名(不需要實例化)訪問靜態(tài)成員。3、語法格式:修飾符static返回值類型方法名(參數列表){//方法體}4、static的使用【例3-8】:通過案例掌握static關鍵字的使用。publicclassDemo3_08{ privatestaticintsid=0;privateStringname;intid;Demo3_08(Stringname){=name;id=sid++;}publicvoidinfo(){System.out.println("Mynameis"+name+"No."+id);}publicstaticvoidmain(Stringarg[]){ Demo3_08.sid=100; Demo3_08demo08_1=newDemo3_08("demo08_1"); demo08_1.sid=2000;Demo3_08demo08_2=newDemo3_08("demo08_1");demo08_1.info();demo08_2.info();}}程序運行的結果:包如何有效組織管理Java程序中的涉及到各個類,Java提供了包機制,用于區(qū)別類名的命名空間。包的概念包(package)是Java類的管理機制,包的作用:1、把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。2、包采用了層次結構,如同文件夾一樣,采用了樹形目錄的存儲方式。3、同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區(qū)別。因此,包可以避免名字沖突。4、包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。import語句import語句是引入語句,用戶在編寫程序時,通過import語句導入包中的類,用戶程序才可以直接使用該類。import語句導入包中的類,有兩種情況:1、語法格式為:import包名.子包名.*;“*”表示本層次的所有類。importjava.util.*;//將java.util包下所有的類都引入進來importjava.awt.*;//將java.awt包下所有的類都引入進來2、語法格式為:import包名.子包名.具體的類名;importjava.util.Scanner;//只引入java.util包下Scanner類注:JDK中java.lang包下所有的類自動引入,不要采用import語句引入。package語句package語句作為Java源程序的第一條語句,指明該文件中定義的類所在的包,若缺省該語句,則指定為無名包。包語句的語法格式為:packagepkg1[.pkg2[.pkg3…]];package是Java的關鍵字,pkg1是包名,pkg2是子包名,pkg3是子包中的子包。Java編譯器把包對應于文件系統的目錄管理,package語句中,用“.”來指明包的層次,包的層次和操作系統的文件夾是一一對應的。例如語句:packagenet.ahiec.www;則該程序通過編譯后所有的類位于.\net\ahiec\www目錄下?!纠?-9】:通過案例掌握package、import關鍵字的使用。求判斷一個點是否在圓內,并求圓的面積。packagenet.ahiec.www;classPointClass{intx;inty;PointClass(int_x,int_y){x=_x;y=_y;}}classCircleClass{PointClasso;intr;CircleClass(PointClass_o,int_r){o=_o;r=_r;}booleancontains(PointClassp){ intx=p.x-o.x; inty=p.y-o.y; if(x*x+y*y>r*r) returnfalse; else returntrue;}publicdoubleCircleArea(){return3.14*r*r;}}publicclassDemo3_09{ publicstaticvoidmain(String[]args){PointClasso=newPointClass(0,0);PointClassp=newPointClass(2,3);intr=4;CircleClassc1=newCircleClass(o,r);if(c1.contains(p)){System.out.println("p點在圓內");}else{System.out.println("p點在圓外");}System.out.println(c1.CircleArea());}}該程序編譯:在dos命令提示符下輸入:javac–d.TestPackage.java其中–d是指設置編譯生成的.class放到哪一個目錄,“.”號表示當前文件夾。如果編程成功,則在當前文件夾下形成三個子文件夾.\net\ahiec\www\下形成三個class文件。如下圖:程序運行的結果:在dos命令提示符下輸入:javanet.ahiec.www.TestPackage注意:如果在其他程序中引用PointClass和CircleClass類,有一下幾種方法:1、采用引入的方法:1)引入具體類名:importnet.ahiec.www.PointClass;importnet.ahiec.www.CircleClass;2)采用“*”importnet.ahiec.www.*;2、在程序中寫全名net.ahiec.www.PointClassp1=newnet.ahiec.www.PointClass();net.ahiec.www.CircleClassc1=newnet.ahiec.www.Circle(p1,3);3、訪問位于同一個包中的類不需要引入。常用包JDK給程序開發(fā)人員提供了豐富的類,這些類都在相關的包中,下面列舉出一些常用的包,如表3.2所示,這些包我們有的已經接觸,有的會在后續(xù)的學習中會用到。表3.2常用的包包名說明java.lang提供利用Java編程語言進行程序設計的基礎類。java.utilJAVA的一些實用工具包,如Date,Calendar,ArrayListjava.awt包含用于創(chuàng)建用戶界面和繪制圖形圖像的所有類。java.awt.event提供處理由AWT組件所激發(fā)的各類事件的接口和類。javax.swing提供一組“輕量級”(全部是Java語言)組件,盡量讓這些組件在所有平臺上的工作方式都相同。java.io輸入流和輸入流相的類。java.sql提供訪問并處理存儲在數據源中的數據的API。提供用于網絡應用程序的類。訪問權限Java的訪問權限是指能夠控制類、成員變量、方法的使用權限的關鍵字。分為類的成員訪問權限和類的訪問權限。1、類的成員訪問權限在一個類的內部,其成員(包括成員變量和成員方法)能否被其他類所訪問,取決于該成員的修飾詞。Java的類成員訪問權限修飾詞有四類:private,無(默認情況下),protected和public。其權限控制如表3.3所示:表3.3成員的訪問權限
同一個類中同一個包中不同包中的子類不同包中的非子類private可以訪問
默認可以訪問可以訪問
protected可以訪問可以訪問可以訪問
public可以訪問可以訪問可以訪問可以訪問2、類的訪問權限對類的訪問權限只有兩種,一種是加public修飾符的訪問權限,另一種不加任何訪問權限修飾符,默認的訪問權限。1)加public修飾符的類訪問權限例如:publicclassBB{//類體}用public修飾的類稱為公共類,公共類可以被任何包中的類訪問。2)不加任何訪問權限修飾符例如:classBB{//類體}Java類前面不加任何訪問權限修飾符,稱為友好類(friendly),只能在同一個包中類才可以訪問?!纠?-10】:通過案例掌握訪問權限修飾符的使用。classStudent{protectedStringschool;privateStringname;//僅限于Student類訪問。publicintage;Student(Stringname,intage,Stringschool){=name;this.age=age;this.school=school;}}publicclassDemo3_10{ publicstaticvoidmain(String[]args){Students=newStudent("li",25,"chc");System.out.println();//name定義時的權限是private,在Monitor中不能訪問。System.out.println(s.age);//可以訪問age成員System.out.println(s.school);//可以訪問school成員}}在上例中System.out.println();會發(fā)生編譯錯誤,如圖3.18所示,因為在Monitor中不能訪問name,它是private,只能在Student類中訪問。繼承前面介紹了類的第一大特性,類的封裝性,這一節(jié)講類的繼承性,繼承是面向對象設計的又一個重要特性,繼承產生類的層次,通過繼承能夠方便地復用代碼,提高開發(fā)的效率。如下圖所示:交通工具的類層次。上圖交通工具類屬于基類,它有三個子類,分別是汽車類、飛機類和輪船類,而汽車類又分為三個子類:公交車類、小汽車類和卡車類,小汽車類也有三個子類構成,分別是轎車類、跑車類和面包車類。擁有子類的類稱為父類或稱基類,一個父類可以擁有多個子類,比如小汽車類擁有三個子類:轎車類、跑車類和面包車類,Java實現的是單繼承,也就是一個子類只能屬于一個父類。繼承使描述事物更加抽象化、簡單。跑車具有小汽車所有的屬性,同時還有自己特有的屬性,跑得快。在跑車類里面添加“跑得快”屬性就可以了,其他屬性通過繼承父類的小汽車而獲得。繼承的引入定義一個Wife和Husband類,兩個類具有共同的特性,姓名、年齡和身份證號,定義如下: classWife{ privateStringname; privateintage; privatelongID; privateHusbandhusband; } classHusband{ privateStringname; privateintage; privatelongID; privateWifewife; }從Wife和Husband兩個類除了各自的husband、wife屬性不同外其它都相同,這樣會產生程序代碼冗余,類的繼承可以去除代碼冗余,實現代碼復用。將Wife和Husband兩個類共同特性抽取出來,形成一個新類Person類,如下:classPerson{privateStringname;privateintage;privatelongID;}再讓Wife和Husband類繼承Person類,只要在Wife和Husband類寫上自己獨有的特性就可以,共有的特性從Person繼承過來。classWifeextendsPerson{privateHusbandhusband;}classHusbandextendsPerson{privateWifewife;}對于Wife、Husband使用繼承后,除了代碼量的減少,還能夠非常明顯地看到他們之間的關系。繼承的語法格式:[類修飾符]class子類extends父類{//類體}extends是關鍵字,表示“繼承”的意思,子類又稱派生類,父類又稱基類(超類),類修飾符可以是public,也可以是默認。子類繼承父類具有以下特點:1)子類繼承父類,子類擁有父類非private的屬性和方法2)子類可以擁有自己屬性和方法,即子類可以對父類進行擴展。3)子類可以用自己的方式實現父類的方法(重寫)。4)一個子類只能屬于一個父類,一個父類擁有多個子類。類的繼承【例3-11】:通過案例掌握類的繼承的定義和特性。classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){ =name;}publicvoidsetAge(intage){ this.age=age;}publicStringgetName(){ returnname;}publicintgetAge(){ returnage;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){ returnschool;}publicvoidsetSchool(Stringschool){ this.school=school;}}publicclassDemo3_11{ publicstaticvoidmain(String[]arg){ Studentstudent=newStudent(); student.setName("John"); student.setAge(18); student.setSchool("SCH"); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getSchool()); }}程序運行的結果:成員變量的隱藏繼承中,子類定義了與父類相同的成員變量時,就會發(fā)生子類對父類變量的隱藏。對于子類對象來說,父類中的同名成員變量被隱藏起來,子類優(yōu)先使用自己的成員變量。如下例:【例3-12】:通過案例掌握類繼承中的變量隱藏特性。classTestA{intn=10;}publicclassDemo3_12extendsTestA{ intn=100; publicstaticvoidmain(String[]args){ Demo3_12demo12=newDemo3_12(); System.out.println(demo12.n); }}程序運行的結果:子類TestB從父類TestA繼承了成員變量n,但在子類類體中又定義了成員變量n,此時實際上子類它擁有兩個同名的成員變量n,通過子類創(chuàng)建的對象引用該成員時,引用的是子類類體中定義的成員,從父類繼承的成員被隱藏,運行結果輸入是100。繼承方法的重寫在實際開發(fā)過程中,經常遇到在子類中要重新定義父類的某一個方法,也就是子類根據需要對父類中繼承來的方法進行重寫。方法一旦重寫后,對于子類對象,調用的是自己的成員,覆蓋父類的成員方法。方法重寫也就方法覆蓋。子類對父類的方法重寫滿足:1)方法名相同2)方法的參數列表相同3)方法的返回值相同4)重寫方法不能使用比被重寫方法更嚴格的訪問權限【例3-13】:通過案例掌握類繼承中的方法重寫特性。classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetInfo(){return"Name:"+name+"\n"+"age:"+age;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){returnschool;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetInfo(){return"Name:"+getName()+"\nage:"+getAge()+"\nschool:"+school; }}publicclassDemo3_13{ publicstaticvoidmain(String[]args){Studentstudent=newStudent();Personperson=newPerson();person.setName("none");person.setAge(1000);student.setName("John");student.setAge(18);student.setSchool("SCH");System.out.println(person.getInfo());System.out.println(student.getInfo());}}程序運行的結果:在子類中重寫了父類的getInfo方法,當子類對象調用getInfo方法時,優(yōu)先運行子類的getInfo方法。super關鍵字如果子類和父類有相同的成員變量和成員方法時,子類會隱藏或覆蓋父類的成員變量和成員方法,使用子類自己的成員變量和成員方法,但這時如果子類想訪問父類的成員變量和成員方法,采用super關鍵字。語法格式:super.父類的成員變量名;super.父類成員方法名;【例3-14】:通過案例掌握類繼承中的super關鍵字的使用。classCountry{Stringname;voidvalue(){name="China";}}classCityextendsCountry{Stringname;voidvalue(){name="hefei";super.value();//調用父類的成員方法System.out.println(name);System.out.println();//調用父類的成員屬性}}publicclassDemo3_14{ publicstaticvoidmain(String[]args){ Cityc=newCity(); c.value(); }}子類City類繼承父類Country類,子類中value方法覆蓋了父類的value方法,通過super關鍵字調用了父類的value方法和name屬性。程序運行的結果:繼承中構造方法創(chuàng)建對象是通過調用構造方法來完成,類的繼承中,創(chuàng)建子類對象時,先要創(chuàng)建父類對象,有了父類對象,然后才能完成創(chuàng)建子類對象。也就是子類的構造過程中必須調用其基類的構造方法。它分為隱式調用和顯示調用兩種方式。1、隱式調用父類構造方法如果子類構造方法中沒有顯示調用父類的構造方法,系統提供默認調用父類無參構造方法。2、顯示調用父類構造方法子類的構造方法使用super語句顯示調用父類的構造方法,super語句必須寫在子類構造方法的第一行。語法格式:super(參數列表);該語句是調用父類的構造方法,根據參數列表的匹配性來調用相應的構造方法?!纠?-15】:通過案例掌握類繼承中隱式、顯示調用父類構造方法的使用。classSuperClass{privateintn;SuperClass(){System.out.println("SuperClass()");}SuperClass(intn){System.out.println("SuperClass(intn)");this.n=n;}}classSubClassextendsSuperClass{privateintn;SubClass(){super(300);//顯示調用父類的構造方法System.out.println("SuperClass");}SubClass(intn){//隱式調用父類的構造方法System.out.println("SubClass(intn):"+n);this.n=n;}}publicclassDemo3_15{ publicstaticvoidmain(Stringargs[]){ SubClasssc1=newSubClass(); SubClasssc2=newSubClass(200); }}該程序創(chuàng)建對象sc1的時候調用SubClass()構造方法,該構造方法的第一句:super(300);顯示地調用了父類的構造方法SuperClass(intn),將300的值傳遞給n,父類的構造方法調用結束后,產生父類對象,然后再做子類構造方法以下的語句,完成對象sc1的創(chuàng)建。創(chuàng)建對象sc2的時候,調用子類的構造方法SubClass(intn),將實參200的值傳給形參n,該構造方法第一句沒有super語句,則采用隱式調用父類的無參構造方法SuperClass(),調用結束后,才繼續(xù)做SubClass(intn)構造方法以下的語句。程序運行的結果:在子類構造方法中調用父類的構造方法:1、子類的構造過程中必須調用其基類的構造方法。2、子類可以在自己的構造方法中使用super(argument_list)調用基類的構造方法。必須寫在子類構造方法的第一行。3、如果子類的構造方法中沒有顯示的調用基類的構造方法,則系統默認調用基類的無參數構造方法。4、如果子類構造方法中既沒有顯示調用基類構造方法,而基類又沒有無參數的構造方法,則編譯出錯。final關鍵字在面向對象程序設計中,子類可以利用重載修改父類的那里繼承來的某些數據成員和成員方法,這給程序設計帶來方便的同時,也給系統的安全性帶來了威脅。為此,Java語言提供了final修飾符來保證系統的安全性。final關鍵字可以修飾類、方法以及變量,用這個關鍵字進行修飾的類或類的成員方法和變量都是不能改變的。1、final修飾類的成員方法用final修飾類的成員方法,稱最終方法,該方法不能被重寫。主要防止任何繼承類修改此方法,保證了程序的安全性和正確性。其語法格式:訪問權限final方法名(參數列表){ //方法體}2、final修飾類final修飾類最終類,該類不能被繼承,該類中所定義的方法自動成為final方法。其語法的格式:finalclass類名{ //類體}3、final修飾變量final修飾的變量可以是類的成員變量和局部變量。對于一個final修飾的變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。其語法格式:限定修飾符final數據類型變量名=初始值;例如:publicfinaldoublePI=3.14;【例3-16】:通過案例掌握final關鍵字的使用。指出下列程序的錯誤finalclassT{ finalinti=8; publicfinalvoidm(){
}}classTTextendsT{//T是final類,不能被繼承 publicvoidm(){//m方法是final方法,不能被重寫
}}publicclassDemo3_16{ publicstaticvoidmain(String[]args){ Tt=newT(); t.i=8;//i是final變量,不能被改變或重寫賦值 }}程序編譯出現如下錯誤:多態(tài)是因為java語言中引入了封裝、繼承、多態(tài)性的面向對象機制,而多態(tài)性是面向對象的編程語言所必須具備的,若一個語言不支持多態(tài),則不能稱面向對象的,只支持類而不支持多態(tài),稱基于對象的,但不能稱面向對象的,如VB,Ada等語言。多態(tài)性機制具有一些很重要的作用:隱藏了程序的實現細節(jié),使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用,這在實現龐大的項目或工程編程中起著非常關鍵的作用。多態(tài)性是java語言的精華,熟練掌握了多態(tài),是成為java高手的最重要的條件。多態(tài)的引入多態(tài)的概念:多態(tài)是從希臘語而來,在字面上的定義是:“一個界面,多種形態(tài)”(即多種形式或方法)。下面舉幾個實例來說明:【例3-17】:計算機的光驅控制。要操作光驅,需要按一下光驅面板上的一個按鍵,此時倉門打開,托架滑出。放入一張光盤,再按一下鍵,托架收回,倉門關閉。此時,光驅被啟動,或者播放音樂,或者訪問數據,無論是哪家企業(yè)生產的光驅,其操作方法都一樣,就是說,一個“界面”(一種交互方式),“多種方法”(不同的生產商)。這樣處理只要知道一個光驅的界面使用情況,不同的生產商所生產的不同的光驅品牌我都會使用(雖然我不知道每個光驅的具體實現機理)?!纠?-18】:錄音機的控制。錄音機的控制如圖3.3所示一排按鈕:上面是錄音機的一些鍵,以后出現的錄象機、VCD、DVD等也都有這樣的一些鍵,這些鍵的功能非常相似。錄音機、錄象機、VCD、DVD在機械原理和其他原理應該有很大的差異,但它們的播放接口非常相似,一開始會使用錄音機了,以后使用錄象機、VCD、DVD就很容易了。這樣處理只要了解一種播放接口,就可以知道使用多種播放器,即使這些播放器有著不同的實現機理。通過【例3-17】、【例3-18】可以簡單歸納:利用統一的接口對不同的對象進行控制。java程序中,同一個名稱可以有多個不同實現,這就降低了程序(工程)的復雜度。【例3-19】:如圖3.4所示,是一個類繼承層次結構圖,假設每個類都有一個成員函數display(),用來在屏幕上顯示該類表示的窗口(不同類型的窗口有著不同的顯示方式)。假設w是Window類的引用,此時,無論w是指向MenuWindow還是MessageWindow對象,(注意:基類類型的引用可以指向任何基類對象或派生類對象)代碼:w.display();都可以正確執(zhí)行。如果w實際指向MeunWindow對象,那么調用的是MeunWindow的display()函數;如果w實際指向MessageWindow對象,那么調用的是MessageWindow的display()函數。體現了利用統一的接口對不同的對象進行控制原理。在java程序中實現多態(tài)性,必須要掌握以下幾點:對象轉型、抽象類和抽象方法、接口的相關知識。抽象類和抽象方法以及接口在上面我們已經闡述過來,下面我們重點闡述對象轉型。instanceof關鍵字instanceof是Java特有的一個運算符,它主要用來判斷在運行時某一個對象是否為該類或該類子類的一個實例。返回一個boolean類型的值。其語法格式為:對象引用instanceof類如果該對象是該類創(chuàng)建的或者是該類子類創(chuàng)建的對象,返回值為true,否則,返回值為false。【例3-20】:instanceof關鍵字的使用。classAnimal{ publicStringname; Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n); eyesColor=c; }}classDogextendsAnimal{ publicStringfurColor; Dog(Stringn,Stringc){ super(n); furColor=c; }}publicclassDemo3_20{ publicstaticvoidmain(String[]args){ Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); System.out.println(ainstanceofAnimal); System.out.println(cinstanceofAnimal); System.out.println(dinstanceofAnimal); System.out.println(ainstanceofCat);}}程序運行的結果:對象轉型基本數據類型轉換分為自動轉換和強制轉換,而對象也具有轉型功能,分為向下轉型和向上轉型。向上轉型:父類對象的引用或者叫基類對象的引用指向子類對象,反之叫向上轉型。對象轉型具有以下特點:1、一個基類的引用類型變量可以指向其子類的對象。2、一個基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)3、可以使用引用變量instanceof類名來判斷該引用型變量所“指向”的對象是否屬于該類或該類的子類。【例3-21】:對象轉型的使用。classAnimal{publicStringname;Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n); eyesColor=c;}}classDogextendsAnimal{ publicStringfurColor;Dog(Stringn,Stringc){ super(n);furColor=c; }}publicclassDemo3_21{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"); }}publicstaticvoidmain(String[]args){ Demo3_21demo21=newDemo3_21(); Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); demo21.f(a); demo21.f(c); demo21.f(d);}}程序運行的結果:多態(tài)即同一消息可以根據發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是方法調用),實現多態(tài)的技術稱為:動態(tài)綁定(dynamicbinding),是指在執(zhí)行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。多態(tài)的好處:1、可替換性(substitutability)。多態(tài)對已存在代碼具有可替換性。例如,多態(tài)對圓Circle類工作,對其他任何圓形幾何體,如圓環(huán),也同樣工作。2、可擴充性(extensibility)。多態(tài)對代碼具有可擴充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態(tài)功能。例如,在實現了圓錐、半圓錐以及半球體的多態(tài)基礎上,很容易增添球體類的多態(tài)性。3、接口性(interface-ability)。多態(tài)是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3所示。圖中超類Shape規(guī)定了兩個實現多態(tài)的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實現多態(tài),完善或者覆蓋這兩個接口方法。4、靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。5、簡化性(simplicity)。多態(tài)簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。一個Java程序中使用了多態(tài),基本要滿足三個條件:1)要有繼承;2)要有方法的重寫;3)要有對象轉型,父類引用指向子類對象?!纠?-22】:多態(tài)的使用。classAnimal{privateStringname;Animal(Stringname){=name;}publicvoidbarking(){ System.out.println("叫聲......");}}classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringname,Stringcolor){ super(name);featherColor=color; }publicvoidbarking(){ System.out.println("鳥叫聲......");}}classCatextendsAnimal{ privateStringeyesColor; Cat(Stringname,Stringcolor){super(name);eyesColor=color;} publicvoidbarking(){ System.out.println("貓叫聲......"); }}classDogextendsAnimal{privateStringhairColor;Dog(Stringname,Stringcolor){super(name);hairColor=color;}publicvoidbarking(){ System.out.println("狗叫聲......");}}classLady{ privateStringname; privateAnimalanimal; Lady(Stringname,Animalanimal){ =name;this.animal=animal; } publicvoidPetBarking(){animal.barking();}}publicclassDemo3_22{ publicstaticvoidmain(Stringargs[]){ Birdbird=newBird("pigeon","white"); Catcat=newCat("mimi","blue"); Dogdog=newDog("bigYellow","Yellow"); Ladylady1=newLady("lady1",bird); Ladylady2=newLady("lady2",cat); Ladylady3=newLady("lady3",dog); lady1.PetBarking(); lady2.PetBarking(); lady3.PetBarking();}}程序運行的結果:【例3-23】:使用抽象類實現例子【3-22】多態(tài)功能。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidbarking();}classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringn,Stringc){ super(n);featherColor=c; }publicvoidbarking(){ System.out.println("鳥叫聲......");}}classDogextendsAnimal{privateStringhairColor;Dog(Stringn,Stringc){super(n);hairColor=c;}publicvoidbarking(){ System.out.println("狗叫聲......");}}classLady{ privateStringname; privateAnimalanimal; Lady(Stringname,Animalanimal){ =name;this.animal=animal; } publicvoidPetBarking(){animal.barking();}}publicclassDemo3_23{ publicstaticvoidmain(Stringargs[]){ Birdbird=newBird("pigeon","white"); Dogdog=newDog("bigYellow","Yellow"); Ladylady1=newLady("lady1",bird); Ladylady2=newLady("lady2",dog); lady1.PetBarking(); lady2.PetBarking();}}程序運行的結果:抽象類在程序設計過程中,有時需要創(chuàng)建某個類代表一些基本行為,并為其定義一些方法,但是又無法或不宜在這個類中對這些行為加以具體實現,而希望在其子類中根據實際情況再去實現這些方法。這種思想通過抽象類來實現。用abstract關鍵字來修飾一個類時,這個類叫做抽象類。其語法格式:abstractclass類名{ //抽象類體}1、一個abstract類并不關心功能的具體行為,只關心它的子類是否具有這種功能,并且功能的具體行為由子類負責實現。2、抽象類不能被實例化,抽象類必須被繼承,通過子類才能實例化。抽象方法用abstract來修飾一個方法時,該方法叫做抽象方法。抽象方法只需聲明,而不需實現。其語法格式:abstract方法返回值方法名(參數列表);1、抽象方法因為沒有實現體,所有就沒有兩個花括號{},抽象方法用于抽象類或接口中。2、抽象方法必須被重寫。3、含有抽象方法的類必須被聲明為抽象類。4、在子類中實現抽象類,必須實現所有的抽象方法,如果有抽象方法沒有被實現,則該子類也是抽象類?!纠?-24】:通過案例掌握抽象類抽象方法的使用。定義一個抽象類,然后通過繼承實現該抽象類。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidenjoy();}classCatextendsAnimal{privateStringeyeColor;Cat(Stringname,StringeyeColor){super(name);this.eyeColor=eyeColor;}publicvoidenjoy(){System.out.println("貓叫聲...");}}publicclassDemo3_24{ publicstaticvoidmain(String[]args){ Catc=newCat("pipi","blue"); c.enjoy(); }}程序運行的結果:接口繼承性是JAVA語言的一個重要特征,它能夠很好地實現代碼復用。但是JAVA中的繼承是單繼承,一個子類最多只能有一個直接父類。單繼承使得程序的層次關系清晰、可讀性強,實際上單繼承使得JAVA中的類的層次結構成為樹型結構,這種結構在處理一些復雜問題時可能表現不出優(yōu)勢。現實世界中多繼承是大量存在的,有的面向對象語言也支持多繼承(如C++),多繼承有其優(yōu)點,也有其缺陷。為了彌補單繼承的不足,使其在語言中達到多繼承的效果,JAVA提供了接口,利用接口可以間接地實現多繼承接口的概念Java接口是一系列方法的聲明和常量值的集合,接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為和功能。接口的定義接口中聲明了方法和常量,接口的定義包括接口聲明和接口體兩個部分,采用interf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 黨員使命意識提升培訓協議2024
- 2024新建設工程成本咨詢協議范本
- 2024水電開發(fā)建設協議范本
- 2024年政府專項資金支持計劃協議
- 廠房2024年租賃化協議模板
- 2024年貨物運輸規(guī)范化服務協議
- 2024年設備安裝過程一切險協議范例
- 不動產居間銷售協議2024定制
- 2024年定制閣樓住宅購買協議范本
- 2024年試用期間勞動協議模板2
- 小學生學習興趣和習慣培養(yǎng)課件
- 保安公司客戶滿意度調查表
- 課間安全教育主題班會課件
- 民法典 婚姻家庭編課件
- 電氣工程及其自動化專業(yè)人才需求調研報告(新)5100字
- 公務員考試行測答題卡
- 消失模工序工藝作業(yè)指導書
- 廣西壯族自治區(qū)北海市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細居民村民委員會
- 老年人能力評定總表(含老年人日常生活活動能力、精神狀態(tài)與社會參與能力、感知覺與溝通能力、老年綜合征罹患情況)
- 小學英語期中試卷分析(三篇)
- 系動詞公開課 完整版PPT
評論
0/150
提交評論