第三章面向對象編程_第1頁
第三章面向對象編程_第2頁
第三章面向對象編程_第3頁
第三章面向對象編程_第4頁
第三章面向對象編程_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章面向對象編程第1頁,課件共63頁,創(chuàng)作于2023年2月本章知識要點:定義繼承、多態(tài)、重載、覆蓋和虛擬方法調用使用訪問修飾符protected和“友元包”描述構造器和方法重載的概念描述完整的對象構造和初始化操作在java程序中識別下列內容重載方法和構造器使用this來調用重載的構造器覆蓋方法調用超類方法父類構造器調用父類構造器類設計第2頁,課件共63頁,創(chuàng)作于2023年2月面向對象的思想概述面向對象的編程思想力圖使對計算機語言中對事物的的描述與現(xiàn)實世界中該事物的本來面目盡可能的一致。類(class)和對象(object)是面向對象方法的核心概念。類是對一類事物描述,是抽象的、概念上的定義;對象是實際存在的該類事物的每個個體,因而也稱實例(instance)。第3頁,課件共63頁,創(chuàng)作于2023年2月類和對象(1)對象表示現(xiàn)實世界中某個具體的事物。抽象是從特定的實例中抽取共同的性質以形成一般化概念的過程。對象具有兩方面的含義:在現(xiàn)實世界中:是客觀世界中的一個實體在計算機世界中:是一個可標識的存儲區(qū)域第4頁,課件共63頁,創(chuàng)作于2023年2月類和對象(2)類是具有共同屬性和行為的對象的抽象。類可以定義為數(shù)據(jù)和方法的集合。類也稱為模板,因為它們提供了對象的基本框架。類對象抽象實例化屬性或狀態(tài)操作或行為數(shù)據(jù)或變量方法封裝的實體=數(shù)據(jù)+方法第5頁,課件共63頁,創(chuàng)作于2023年2月創(chuàng)建類classname{typevariable1;…typevariableN;

typemethodname1(parameter-list){//方法體}…typemethodnameN(parameter-list){//方法體}}

在類中,屬性是通過成員變量體現(xiàn)的,而操作是用成員函數(shù)(又稱為方法)實現(xiàn)的。Java中定義類的通用格式:成員變量(對象屬性)成員方法(對象行為或操作)第6頁,課件共63頁,創(chuàng)作于2023年2月類和對象舉例定義一個類:

classPerson{

intage;

intgetAge(){ returnage; }

voidsetAge(inti){ age=i; } }聲明并創(chuàng)建一個Person類的對象,將該對象命名為a:

Persona=newPerson();調用對象a中的方法:

a.setAge(36);第7頁,課件共63頁,創(chuàng)作于2023年2月聲明屬性語法格式:[<modifiers>]type<attr_name>[=defaultValue];舉例:

publicclassPerson{

privateintage;

publicStringname=“Lila”;}第8頁,課件共63頁,創(chuàng)作于2023年2月定義方法定義方法的一般格式:[access]typemethodname1([parameter-list]){//方法體}發(fā)往某個對象的消息對應于一個方法調用。作為對消息的響應,對象將執(zhí)行一個類似于過程體的方法。方法是包含在類中的函數(shù)。方法名稱返回類型修飾符,可選參數(shù)列表,可選舉例:publicvoidsetdate(intday,intmonth,intyear){day=23;month=7;year=2003;}第9頁,課件共63頁,創(chuàng)作于2023年2月構造方法構造函數(shù)名稱與類名稱相同構造函數(shù)沒有返回類型其任務是在創(chuàng)建對象時初始化其內部狀態(tài)classFruit{booleanseedLess;booleanseasonal;floatprice;

Fruit(booleanseed,booleanseason,floatp){

seedLess=seed; seasonal=season; price=p; }

}第10頁,課件共63頁,創(chuàng)作于2023年2月默認的構造方法(1)Java語言中,每個類都至少有一個構造方法;如果類的定義者沒有顯式的定義任何構造方法,系統(tǒng)將自動提供一個默認的構造方法:默認構造方法沒有參數(shù)默認構造方法沒有方法體Java類中,一旦類的定義者顯式定義了一個或多個構造方法,系統(tǒng)將不再提供默認的構造方法;第11頁,課件共63頁,創(chuàng)作于2023年2月默認的構造方法(2)類的定義:publicclassPerson{

privateintage;

publicvoidsetAge(intw){age=w;} }等價于:

publicclassPerson{

privateintage

publicPerson(){}

publicvoidsetAge(intw){age=w;} }應用舉例:publicclassTest{

publicstaticvoidmain(Stringargs[]){Persond=newPerson();d.setAge(120);}}第12頁,課件共63頁,創(chuàng)作于2023年2月創(chuàng)建對象使用下列語法可創(chuàng)建對象:

new構造函數(shù)關鍵字new通常稱為創(chuàng)建運算符,用于分配對象內存,并將該內存初始化為缺省值。一旦new完成分配和初始化內存,它就將調用構造函數(shù)來執(zhí)行對象初始化。

當創(chuàng)建一個類時,只是創(chuàng)建了一種新的數(shù)據(jù)類型。對象是類的一個實例。classFruitDemo{publicstaticvoidmain(Stringargs[]){ Fruitf=newFruit(true,false,50.0F);}}

創(chuàng)建對象第13頁,課件共63頁,創(chuàng)作于2023年2月練習分析并編譯、運行下面的源文件,體會類的定義、對象的創(chuàng)建、對象成員方法的調用、類的定義和應用程序在源文件結構上的不同;

//源文件A.javapublicclassA{publicvoidm1(){System.out.println("hi");}}

//源文件Test.javapublicclassTest{ publicstaticvoidmain(String[]args){ Ahello=newA(); hello.m1(); }}第14頁,課件共63頁,創(chuàng)作于2023年2月面向對象的應用舉例(1)程序BirthDate.java:publicclass

BirthDate{

privateintday;

privateintmonth;

publicintyear;

publicvoidsetDay(intd){day=d;}

publicvoidsetMonth(intm){month=m;}

publicvoidsetYear(inty){year=y;}

publicintgetDay(){returnday;}

publicintgetMonth(){returnmonth;}

publicintgetYear(){returnyear;}

publicvoidshow(){ System.out.println(day+"-"+month+"-"+year); }}第15頁,課件共63頁,創(chuàng)作于2023年2月面向對象的應用舉例(2)程序ObjectOperating.java: publicclassObjectOperating{

publicstaticvoidmain(Stringargs[]){ BirthDateb=newBirthDate(); b.setDay(25); b.setMonth(12); b.setYear(2003);b.day=2; b.year=2003; b.show(); } }

第16頁,課件共63頁,創(chuàng)作于2023年2月Java中的訪問修飾符Java中共有四種訪問修飾符:1、public:完全公開,沒有類或包的限制2、protected:強調繼承關系,沒有包的限制3、default:有包的限制,沒有類的限制,對于同一包中的類來說,相當于public修飾符。也可叫做packageprivate4、private:有包的限制,同時也有類的限制,只能被同一個類中的成員函數(shù)或內部類訪問。第17頁,課件共63頁,創(chuàng)作于2023年2月關于訪問權限的習題測試privatefriendlyprotectedpublic同一類同包不同類同包子類不同包子類不同包不同類calssuseYYYYNYYYNYYYNNYYNNNY下題每空5分,測測您的分數(shù):第18頁,課件共63頁,創(chuàng)作于2023年2月實例驗證……在同一個類中packageaccessdemo;publicclassSuperClass{publicvoidtestPublic(){System.out.println("apublicmethodinsuperclass");}protectedvoidtestProtected(){System.out.println("aprotectedmethodinsuperclass");}voidtestFriendly(){System.out.println("afriendlymethodinsuperclass");}privatevoidtestPrivate(){System.out.println("aprivatemethodinsuperclass");}publicstaticvoidmain(Stringargs[]){ SuperClasssc=newSuperClass(); sc.testPublic(); sc.testProtected(); sc.testFriendly(); sc.testPrivate(); } }第19頁,課件共63頁,創(chuàng)作于2023年2月實例驗證……同一包不同類packageaccessdemo;importaccessdemo.SuperClass;publicclassSamePackOtherClass{publicstaticvoidmain(Stringargs[]){ SuperClasss=newSuperClass(); s.testPublic(); s.testProtected(); s.testFriendly();

s.testPrivate(); } }s.testPrivate();第20頁,課件共63頁,創(chuàng)作于2023年2月實例驗證……同一包子類packageaccessdemo;importaccessdemo.SuperClass;publicclassSamePackSubClassextendsSuperClass{publicstaticvoidmain(Stringargs[]) {SamePackSubClasss1=newSamePackSubClass();s1.testPublic();s1.testProtected();s1.testFriendly();s1.testPrivate();

}}s1.testPrivate();第21頁,課件共63頁,創(chuàng)作于2023年2月實例驗證……不同包子類packageaccessdemo.otherpack;importaccessdemo.SuperClass;publicclassOtherPackSubClassextendsSuperClass{publicstaticvoidmain(Stringargs[]){OtherPackSubClasss1=newOtherPackSubClass();s1.testPublic();s1.testProtected();s1.testFriendly();s1.testPrivate();} }s1.testFriendly();s1.testPrivate();第22頁,課件共63頁,創(chuàng)作于2023年2月實例驗證……不同包不同類packageaccessdemo.otherpack;importaccessdemo.SuperClass;publicclassOtherPackOtherClass{publicstaticvoidmain(Stringargs[]){ SuperClasss=newSuperClass(); s.testPublic(); s.testProtected(); s.testFriendly(); s.testPrivate(); } } s.testProtected(); s.testFriendly(); s.testPrivate();第23頁,課件共63頁,創(chuàng)作于2023年2月繼承繼承表示一個類從其它類中獲得結構和行為(子類/父類)又名普遍化交通工具是一個父類地面交通工具和空中交通工具是子類VehicleGroundVehicleAirVehicleThearrowpointstowardthesuperclass第24頁,課件共63頁,創(chuàng)作于2023年2月繼承繼承通常被稱為“is-a”或“kind-of”一個子類的實例也“isa”父類的實例一個子類的實例是“kind-of”父類第25頁,課件共63頁,創(chuàng)作于2023年2月多層次ACarisakindofGroundVehiclewhichisakindofVehicleVehicleandAirVehicleareancestorsofAirplaneAirVehicleandAirplanearedescendantsofVehicleVehicleGroundVehicleAirVehicleCarTruckAirplaneHelicopter第26頁,課件共63頁,創(chuàng)作于2023年2月繼承操作屬性在繼承結構的最高一層定義所有子類的實例能夠繼承這些操作每個子類可以增加或重新定義繼承的屬性GroundVehiclelicenseNumberweightregister()CarTrucktonnagecalculateTax()Atruckhasthreeattributes:licenseNumberweighttonnageandtwooperations:registercalculateTax第27頁,課件共63頁,創(chuàng)作于2023年2月繼承關系

關系也可以繼承每個子類都可以分享繼承的關系GroundVehiclelicenseNumberweightregister()AtruckhasanownerCarTrucktonnagecalculateTax()OwnerPerson1..*andacarhasanowner1owner第28頁,課件共63頁,創(chuàng)作于2023年2月覆蓋方法

子類可以修改從父類繼承的行為。子類可以創(chuàng)建同父類的方法不同功能的方法,但方法名、返回值類型、參數(shù)列表必須一致。要求:

1.方法聲明形式一致

2.方法權限不允許縮小

3.覆蓋的方法不允許拋出比父類方法更多的異常第29頁,課件共63頁,創(chuàng)作于2023年2月方法覆蓋的示例classA1{voidcallme(){System.out.println(“在A1的callme()成員函數(shù)里”);}}classB1extendsA1{voidcallme(){System.out.println(“在B1的callme()成員函數(shù)里”);}}publicclassDispatch{publicstaticvoidmain(Stringargs[]){A1a=newA1();a.callme();A1b=newB1();b.callme();}}示例II:6-10練習第30頁,課件共63頁,創(chuàng)作于2023年2月Super關鍵字

super關鍵字引用使用該關鍵字的類的超類。它用于引用超類的成員變量和方法。 1).點取父類中被子類隱藏了的數(shù)據(jù)成員

2).點取已經(jīng)覆蓋了的方法 3).作為方法名表示父類構造方法 注:在創(chuàng)建子類對象時,缺省沿繼承鏈調用所有父類無參的構造方法,也可以用super關鍵字來顯示調用直接父類的構造方法

第31頁,課件共63頁,創(chuàng)作于2023年2月使用super關鍵字-示例classA{ publicinti;

publicA() { }

publicA(inti){this.i=i; }

intget(){ returni; }}classBextendsA{ publicB() { super(3); } publicstaticvoidmain(Stringargs[]) { Bb=newB(); intx=b.get();System.out.println(“所得值為:"+x); }}

示例II:6-12練習第32頁,課件共63頁,創(chuàng)作于2023年2月執(zhí)行結果第33頁,課件共63頁,創(chuàng)作于2023年2月多態(tài)1、方法的重載(overload)2、方法的覆蓋(override)3、一個引用變量可以指向多個不同形式的對象第34頁,課件共63頁,創(chuàng)作于2023年2月成員方法的重載方法的重載:

就是在一個類的定義中有多個名稱相同的成員方法,每個方法的參數(shù)列表必須不同。返回值類型可以不同。

方法的重載如下例所示:

voidgetArea(intw,inth);voidgetArea(floatw,floath);程序實例見備注。第35頁,課件共63頁,創(chuàng)作于2023年2月成員方法重載實例classTest{public

intmax(inta,intb){returna>b?a:b;}publicdoublemax(doublea,doubleb){returna>b?a:b;}publicStringmax(Stringa,Stringb){returna.length()>b.length()?a:b);}publicstaticvoidmain(Strings[]){Aa=newA();a.max(5,6);a.max(4.5,6.7);a.max(“abc”,“def”);}}第36頁,課件共63頁,創(chuàng)作于2023年2月構造器重載classperson{Stringname=“neusoft";intage=45;person(){}person(Stringa){name=a;}person(Stringa,intb){name=a; age=b;}publicvoiddisplay(){System.out.println("Name="+name+","+"Age="+age);}}publicclassOverloadedDemo{publicstaticvoidmain(Stringargs[]){persond1=newperson();persond2=newperson("zhou");persond3=newperson("zhou",27);d1.display();d2.display();d3.display(); }}

第37頁,課件共63頁,創(chuàng)作于2023年2月重載時使用this關鍵字classA{inti=0,j=0;publicA(inti,intj){this.i=i;this.j=j;}publicA(intk){this(k,k);}publicstaticvoidmain(Strings[]){Aa1=newA(3,5);Aa2=newA(8);……}}表示方法名時,只能出現(xiàn)在構造方法里,且為第一句第38頁,課件共63頁,創(chuàng)作于2023年2月父類構造器的調用控制classBeeextendsQueen{inta;Bee(inta){this.a=a;}Bee(){this(12);}}classQueen{inta;Queen(inta){this.a=a;}}classBeeextendsQueen{intb;Bee(intb){super(15);this.b=b;}}第39頁,課件共63頁,創(chuàng)作于2023年2月調用構造器的相關規(guī)則從一個類創(chuàng)建對象時,可以調用此類的父類的構造器。調用方法為在類的構造器的方法體中的第一條語句使用super。如果一個類的構造器中的第一條語句沒有用super來調用其父類的構造器,編譯器將在構造器中使用super調用父類的不帶參數(shù)的構造器。但如果父類中所有的構造器都是必須帶參數(shù)的,將會產生錯誤。如果某個類的構造器的第一條語句使用了this來調用本類的另一個構造器,則Java系統(tǒng)就不會默認此構造器需要調用父類的構造器了。一個構造器用this調用本類的另一個構造器時,如果被調用的構造器又是調用父類的構造器而又沒有用super,此時,Java編譯器將會默認它含有super語句。如父類中沒有不帶參數(shù)的構造器,編譯將出錯。第40頁,課件共63頁,創(chuàng)作于2023年2月方法的覆蓋

子類可以修改從父類繼承的行為。子類可以創(chuàng)建同父類的方法不同功能的方法,但方法名、返回值類型、參數(shù)列表必須一致。要求:

1.方法聲明形式一致

2.方法權限不允許縮小

3.覆蓋的方法不允許拋出比父類方法更多的異常第41頁,課件共63頁,創(chuàng)作于2023年2月Instanceof操作符一個引用變量可以指向多個不同形式的對象第42頁,課件共63頁,創(chuàng)作于2023年2月final和abstract關鍵字理解關鍵字的意義舉例(略)第43頁,課件共63頁,創(chuàng)作于2023年2月接口接口就是一種標準!第44頁,課件共63頁,創(chuàng)作于2023年2月接口的特點接口使用interface關鍵字定義接口中定義的變量都是最終的靜態(tài)變量publicstaticfinal

inta;接口沒有自己的構造函數(shù),它所定義的方法均是抽象方法

publicabstract

speak();Java中類采用單一繼承的機制,接口則采用多重繼承的機制。Java通過接口實現(xiàn)了多重繼承的功能。第45頁,課件共63頁,創(chuàng)作于2023年2月接口的多重實現(xiàn)第46頁,課件共63頁,創(chuàng)作于2023年2月接口的應用實例(一)第47頁,課件共63頁,創(chuàng)作于2023年2月多重接口的應用實例第48頁,課件共63頁,創(chuàng)作于2023年2月關于接口的注意事項1、如果一個類實現(xiàn)了一個接口,則該類必須實現(xiàn)該接口的所有方法。2、如果一個類實現(xiàn)了一個繼承其它接口的接口,則該類必須實現(xiàn)這個接口和其父接口的所有方法。3、接口不是類,不能使用new操作符來實例化。但可以聲明一個接口變量。例如:

MyInterfacex;//正確

MyInterfacex=newMyInterface();//錯誤4、一個接口變量必須指向一個實現(xiàn)了該接口的類的對象。第49頁,課件共63頁,創(chuàng)作于2023年2月接口與抽象類的區(qū)別接口:擁有的成員函數(shù)均為抽象函數(shù),支持多重繼承。抽象類:擁有能夠具體實現(xiàn)功能的成員函數(shù),支持單繼承。區(qū)別第50頁,課件共63頁,創(chuàng)作于2023年2月接口練習題Giventhefolowingclasseswhichofthefollowingwillcompilewithouterror?interfaceIFace{}classCFaceimplementsIFace{}classBase{}publicclassObRefextendsBase{publicstaticvoidmain(Stringargv[]){ObRefob=newObRef();Baseb=newBase();Objecto1=newObject();IFaceo2=newCFace();}}1)o1=o2;2)b=ob;3)ob=b;4)o1=b;第51頁,課件共63頁,創(chuàng)作于2023年2月嵌套類(內部類)內部類:就是將類定義放在其他類的定義中!內部類的優(yōu)勢:1、對于同一個包中的其它類來說,內部類可以隱藏起來(使用private關鍵字)。2、實現(xiàn)C++中友元類的功能。內部類可以訪問其所在的外部類的變量和方法。注意:1、如想實例化一個內部類,需這樣使用內部類類名:外部類類名.內部類類名2、如內部類有和外部類同名的變量和方法,則內部類的變量和方法將獲得比外部類的變量和方法高的優(yōu)先級。第52頁,課件共63頁,創(chuàng)作于2023年2月內部類(InnerClass)內部類是一個定義在另一個類內部的類,例如: classOuterClass {

staticclassA{}//靜態(tài)內部類 classB{}//非靜態(tài)內部類publicvoiddisp(){classC{}//局部內部類}}編譯后:OuterClass.class OuterClass$A.class OutClass$B.class OuterClass$1$C.class第53頁,課件共63頁,創(chuàng)作于2023年2月內部類使用示例classOuterClass{staticclassA//靜態(tài)內部類{publicA(){System.out.println("Test$A!");}}classB//非靜態(tài)內部類{publicB(){System.out.println("Test$B!");}}publicvoiddisp(){finalinta=10;intb;

classC//成員函數(shù)中的局部內部類 {publicC() {System.out.println(“inclassCa="+a);

//System.out.println(b);

} }

Cc=newC(); } }第54頁,課件共63頁,創(chuàng)作于2023年2月內部類的使用示例(續(xù))publicclassTestextendsOuterClass{publicstaticvoidmain(Stringargs[]){OuterClass.Aa=newOuterClass.A();Bb=newOuterClass().newB();OuterClasst=newOuterClass();

t.disp(); }}第55頁,課件共63頁,創(chuàng)作于2023年2月運行結果第56頁,課件共63頁,創(chuàng)作于2023年2月嵌套類特性嵌套類名必須充分有效。定義在方法中的嵌套類稱為局部類。局部類可以訪問final的局部變量。嵌套類可以是抽象類。接口可以嵌套,即可以存在內部接口,一般被內部類實現(xiàn)。嵌套類可以訪問所在域的靜態(tài)成員。非局部類可以有任意的訪問保護。嵌套類及其所在的類被同時編譯。使用內部類可以方便的編寫事件驅動程序。第57頁,課件共63頁,創(chuàng)作于2023年2月package語句(1)為便于管理大型軟件系統(tǒng)中數(shù)目眾

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論