第三章面向對象_第1頁
第三章面向對象_第2頁
第三章面向對象_第3頁
第三章面向對象_第4頁
第三章面向對象_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第三章面向對象本章內容編程語言的發展面向過程的設計思想面向對象的設計思想對象和類的概念類之間的關系對象和引用Java類的定義構造函數對象的創建和使用this關鍵字static關鍵字package和import語句類的繼承方法的重寫final關鍵字對象轉型多態抽象類接口編程語言的發展機器語言---直接由計算機的指令組成,指令、數據、地址都是以“0”和“1”的符號串組成;可以被計算機直接執行。匯編語言---用容易理解和記憶的符號表示指令、數據以及寄存器等,抽象層次很低,程序員需要考慮大量的機器細節。高級語言---屏蔽了機器的細節,提高了語言的抽象層次,接近于人的自然語言,60年代出現的結構化編程語言提出了結構化數據和語句,數據和過程抽象等概念。面向對象的語言---與以往的各種語言的根本不同的是,它的設計出發點是為了更能直接的描述問題域中客觀存在的事物。語言的發展是朝著人類更容易理解的方向前進面向對象設計的思想面向對象設計的基本思想是,從現實世界中客觀存在的事物出發來構造軟件系統,并在系統的構造中盡可能運用人類的自然思維方式。面向對象更加強調運用人類在日常的思維邏輯中經常采用的思想方法與原則,如抽象、分類、繼承、聚合、多態等。面向過程的設計思想和面向對象的設計思想我要去新疆面向過程我開車,我掛檔,我踩油門,我過河北,我過陜西……面向對象我命令車去新疆車怎么去不關我的事信息封存在車這個類的內部我不用去了解車整個開動的過程對象和類的概念對象是用計算機語言對問題域中事物的描述,對象通過“屬性(attribute)”和“方法(method)”來分別對應事物所具有的靜態屬性和動態屬性。類是用于描述同一類型的對象的一個抽象的概念,類中定義了這一類對象所具有的靜態和動態屬性。類可以看成一類對象的模板,對象可以看成該類的一個具體實例。類(對象)之間的關系之關聯關系繼承關系(一般和特殊)XX是一種XX聚合關系(整體和部分)實現關系多態課堂練習抽象出下面系統中的“類”及其關系我要去新疆,這句話中的類和方法是什么?Java與面向對象對象是Java程序的核心,在Java程序中“萬事萬物皆對象”。對象可以看成是靜態屬性(成員變量)和動態屬性(方法)的封裝體。類是用來創建同一類型的對象的“模板”,在一個類中定義了該類對象所應具有的成員變量以及方法。J2SDK提供了很多類供編程人員使用,編程人員也可以定義自己的類。我們的語言:成員變量=屬性方法=函數為什么用對象?面向對象的編程---一組對象互相配合通過溝通完成特定功能所有paradigm(范例)都是對現實問題的抽象匯編是對機器語言的抽象面向過程的語言是對匯編語言的抽象對象更加符合對于現實問題的抽象對象都有對外服務的接口通過繼承可以復用對象隱藏內部服務的實現通過聚合可以復用面向對象更加容易使我們達到這些年來苦苦追求的境界Reusable、Extensibility、維護和替換更加方便組件---比對象更高層次的抽象(二進制級別)EJB、WebService、CORBA、COM、…成員變量成員變量可以是Java語言中任何一種數據類型(包括基本類型和引用類型)。在定義成員變量時可以對其初始化,如果不對其初始化,Java使用默認的值對其初始化。(右圖)成員變量的作用范圍為整個類體。Dog.java面向對象基本概念—引用

Java語言中除基本類型之外的變量型都稱之為引用類型。

Java中的對象是通過引用對其操作的。例如:/**聲明了一個String類型的引用變量,*但并沒用使用它指向一個對象*/Strings;/*使用new語句創建了一個String類型的*對象并用s指向它,以后可以通過s完成*對其的操作*/s=newString(“Helloworld”);如何在內容中區分類和對象?類是靜態的概念,在代碼區對象是new出來的,位于堆內存,類的每個成員變量來自不同的對象中都有不同的值(除了靜態變量),而方法只有一份,執行的時候才占有內存。對象的創建和使用必須使用new關鍵字創建對象。使用對象(引用).

成員變量來引用對象的成員變量。使用對象(引用).

方法(參數列表)來調用對象的方法。同一類的每個對象有不同的成員變量存儲空間。同一類的每個對象共享該類的方法。類和對象的關系構造方法(構造函數)使用new+構造方法創建一個新的對象。構造函數是定義在Java類中的一個用來初始化對象的函數。構造函數與類同名且沒有返回值。例如:Person類的構造函數publicclassPerson{intid;intage;Person(intn,inti){id=n;age=i;}}構造函數

創建對象時,使用構造函數初始化對象的成員變量。

publicclassTest{publicstaticvoidmain(Stringargs[]){Persontom=newPerson(1,25);Personjoin=newPerson(2,27);Personkate=newPerson();}}構造函數

當沒有構造函數時,編譯器為類自動添加形如類名(){}

的構造函數。例如:classPoint{publicintx;publicinty;}---Pointp=newPoint();---約定俗成的命名規則類名的首字母大寫變量名和方法的首字母小寫運用駝峰標識實例(1)//定義如下類:classBirthDate{ privateintday; privateintmonth; privateintyear; publicBirthDate(intd,intm,inty){ day=d;month=m;year=y; } publicvoidsetDay(intd){day=d;} publicvoidsetMonth(intm){month=m;} publicvoidsetYear(inty){year=y;} publicintgetDay(){returnday;} publicintgetMonth(){returnmonth;} publicintgetYear(){returnyear;} publicvoiddisplay(){ System.out.println(day+“–”+month+“–”+year); }}實例(2)publicclassTest{ publicstaticvoidmain(Stringargs[]){ Testtest=newTest(); intdate=9; BirthDated1=newBirthDate(7,7,1970); BirthDated2=newBirthDate(1,1,2000); test.change1(date); test.change2(d1); test.change3(d2); System.out.println(“date=”+date); d1.display(); d2.display(); } publicvoidchange1(inti){i=1234;} publicvoidchange2(BirthDateb){b=newBirthDate(22,2,2004);} publicvoidchange3(BirthDateb){ b.setDay(22); }}方法的重載方法的重載是指一個類中可以定義有相同的名字,但參數不同的多個方法。調用時,會根據不同的參數表選擇對應的方法。例如:在Person類中添加如下的方法:voidinfo(){System.out.println(“Myidis”+id);}voidinfo(Stringt){System.out.println(t+“”+id+”“+age);}//運行如下程序publicclassTest{publicstaticvoidmain(Stringargs[]){Personp=newPerson(1,20);();(“hello”);}}構造方法的重載與普通方法一樣,構造方法也可以重載;例如:課本79頁Student類的構造方法作業創建一個基本類Desk,描述桌子的長、寬、高和顏色屬性,其中長、寬、高用double數據類型,顏色用String型。在基本類Desk中添加構造方法Desk(doublea,doublew,doubleh),用來在創建桌子對象時指定桌子的長、寬、高,顏色設置一個默認值“白色”。在基本類Desk中添加構造方法Desk(Stringc),用來在創建桌子對象時指定桌子的顏色,長款高都設置默認值1.0再加一個構造方法,通過長寬高和顏色四個屬性來定制桌子在測試類中創建長為1.2,寬為2.5,高為1.0,顏色為黃色的桌子,添加輸出語句在控制臺上顯示該桌子的長寬高和顏色。復習:對象的創建和使用必須使用new關鍵字創建對象。使用對象.成員變量來引用對象的成員變量。使用對象.方法(參數列表)來調用對象的方法。同一類的每個對象有不同的成員變量存儲空間。同一類的每個對象共享該類的方法。非靜態方法是針對每個對象進行調用變量的分類和作用域局部變量:定義在塊內、方法內的變量(包括方法的參數)。作用域是以塊和方法為單位的,僅在定義該變量的塊或方法內有效先定義賦值,然后再使用,不可以超前使用在查找時,首先被查找。若局部變量與類成員變量名相同時,則該類成員變量在方法體內被暫時“屏蔽”起來。方法體內不能定義靜態變量。類成員變量:定義在類內、方法外的變量,使用了修飾符static的變量是靜態變量,也稱為類變量。作用域是以類為單位的一般情況下,類成員變量應該先定義后使用。但類成員變量可以超前引用,即在定義位置前引用,但靜態變量不能超前引用靜態變量。注意:類外面不能有變量的聲明this關鍵字在類的方法定義中使用的this關鍵字代表使用該方法的對象的引用。當必須指出當前使用方法的對象是誰時要使用this。有時使用this可以處理方法中成員變量和參數變量重名的情況。this可以看作是一個變量,它的值是當前對象的引用。可以使用this調用本類的其他構造方法,但該語句出現的位置要求是所隸屬的構造方法的第一條可執行語句。Leaf.javaBall.javathis使用方法總結利用this.可以調用當前對象的方法或屬性。一個類的若干構造方法之間可以互相調用,當一個構造方法需要調用另一個構造方法時,應使用this(實參列表),同時這條調用語句應該是整個構造方法中的第一條可執行語句。在利用this調用構造方法時,根據實參的個數匹配調用的是那個其他的構造方法。當方法需返回當前正在討論的對象時,可以使用returnthis形式。static關鍵字在類中,用static聲明的成員變量為靜態成員變量,它為該類的公用變量,在第一次使用時被初始化,對于該類的所有對象來說,static成員變量只有一份。用static聲明的方法為靜態方法,在調用該方法時,不會將對象的引用傳遞給它,所以在static方法中不可訪問非static的成員。可以通過對象引用或類名(不需要實例化)訪問靜態成員。Cat.javaEmpTest.java靜態初始化器靜態屬性和非靜態屬性都需要初始化,非靜態屬性的初始化可以在聲明的同時進行,也可以放在構造方法中完成。而對于靜態屬性,這兩種方式的初始化效果不同。Student.java作為靜態屬性,可以在靜態初始化器中完成初始化靜態屬性可以在兩個地方完成初始化賦值工作,一是在聲明時,二是在靜態初始化器中。語法如下:static{

靜態屬性名=初始值;}package和import語句為便于管理大型軟件系統中數目眾多的類,解決類的命名沖突問題,Java引入包(package)機制,提供類的多重命名空間。package和import語句package語句作為Java源文件的第一條語句,指明該文件中定義的類所在的包。(若缺省該語句,則指定為無名包)。它的格式為:packagepkg1[.pkg2[.pkg3…]];Java編譯器把包對應于文件系統的目錄管理,package語句中,用‘.’來指明包(目錄)的層次,例如使用語句packagecom.sww;則該文件中所有的類位于.\com\sww目錄下設置Classpath變量javac–d.Book.javapackage和import語句如果將一個類打包,則使用該類時,必須使用該類的全名(例如:com.sww.MyClass),Java編譯器才會找到該類。也可以使用import在文件的開頭引入要使用到的類,例如:可以不需要用import語句直接使用java.lang包中的類。

importcom.sww.MyClass;importjava.util.*;//引入java.util包中的所有的類

………MyClassmyClass=newMyClass();//可以直接使用類名

………packageimport總結如果想將一個類放入包中,在這個類源文件第一句話寫package必須保證該類的class文件位于正確目錄下該類的源碼可能會產生影響刪除或轉移到另外的目錄另外的類想訪問的話:寫全名引入.具體類名訪問位于同一個包中的類不需要引入必須使class文件的最上層包的父目錄位于classpath下J2SDK中主要的包介紹java.lang—包含一些Java語言的核心類,如String、Math、Integer、System和Thread,提供常用的功能。java.awt---包含了構成抽象窗口工具類(abstractwindowtoolkits)的多個類,這些類被用來構建和管理應用程序的圖形用戶界面(GUI)。java.applet—包含applet運行所需的一些類。—包含執行與網絡相關的操作的類。java.io—包含能提供多種輸入/輸出功能的類。java.util—包含一些使用工具類,如定義系統特性、使用與日期日歷相關的函數。jar-cvfxx.jar*.*類的繼承與權限控制Java中使用extends關鍵字實現類的繼承機制,其語法規則為:

<modifier>class<name>[extends]<superclass>]{……}通過繼承,子類自動擁有了基類(superclass)的所有成員(成員變量和方法)。java只支持單繼承,不允許多繼承;一個子類只能有一個基類一個基類可以派生出多個子類//繼承中的權限控制classParent{privateintn_private=1;intn_friendly=2;protectedintn_protected=3;publicintn_public=4;}classChildextendsParent{publicvoidf(){n_private=10;n_friendly=20;n_protected=30;n_public=40;}}訪問控制Java權限修飾符publicprotectedprivate置于類的成員定義前,用來限定其他對象對該類對象成員的訪問權限。對于class的權限修飾只可以用public和defaultpublic類可以在任意地方被訪問

default類只可以被同一個包內部的類訪問Rectangle.javaCubic.java繼承中的訪問修飾符父子類在同一包中定義子類可以無條件地繼承父類的所有非私有屬性父子類在不同包中定義只有父類中被public和protected修飾的屬性能被子類繼承下來父類中缺省修飾符修飾的屬性不能被子類所引用方法的重寫在子類中可以根據需要對從基類中繼承來的方法進行重寫。重寫方法必須和被重寫方法具有相同方法名稱、參數列表和返回類型。重寫方法不能使用比被重寫方法更嚴格的訪問權限。TestOverWrite.javasuper關鍵字在Java中使用super來引用基類的成分;例如:

classFatherclass{publicintvalue;publicvoidf(){value=100;system.out.println(“FatherClass.value=”+value);}}classChildClassextendsFatherClass{publicintvalue;publicvoidf(){super.f();value=200;System.out.println(“ChildClass.value=”+value);System.out.println(value);System.out.println(super.value);}}TestInherit.java繼承中的構造方法子類的構造過程中必須調用其基類的構造方法。子類可以在自己的構造方法中使用super(argument_list)調用基類的構造方法。使用this(argument_list)調用本類的另外的構造方法如果使用super,必須寫在子類構造方法的第一行如果子類的構造方法中沒有顯式地調用基類構造方法,則系統默認調用基類無參數的構造方法。如果子類構造方法中既沒有顯式調用基類構造方法,而基類中又沒有無參的構造方法,則編譯出錯。TestSuperSub.java課堂練習classA{ protectedvoidprint(Strings){ System.out.println(s); } A(){print(“A()”);} publicvoidf(){print(“A:f()”);}}classBextendsA{ B(){super();print(“B()”);} publicvoidf(){print(“B:f()”);} publicstaticvoidmain(Stringargs[]){ Bb=newB();b.f(); }}

分析輸出結果,體會構造函數和一般成員函數在繼承中的區別。OverWriteOverRide實例(1)classPerson{ privateStringname; privateStringlocation; Person(Stringname){ =name; location=“beijing”; } Person(Stringname,Stringlocation){ =name; this.location=location; } publicStringinfo(){ return“name:“+name+”location:“+location; }}classStudentextendsPerson{ privateStringschool; Student(Stringname,Stringschool){ this(name,school,”beijing”); }

Student(Stringn,Stringl,Stringschool){ super(n,l); this.school=school; } publicStringinfo(){ ()+”school:“+school; }}實例(2)publicclassTest{ publicstaticvoidmain(String[]args){ Personp1=newPerson(“A”); Personp2=newPerson(“B”,”shanghai”); Students1=newStudent(“C”,”S1”); Students2=newStudent(“C”,”shanghai”,”S2”); System.out.println(()); System.out.println(()); System.out.println(()); System.out.println(()); }}分析輸出結果和對象的構造過程:課堂練習根據上面的程序,構造“Teacher”類,繼承“Person”類。要求:增加”職稱(String)”屬性.具有和”Student”類類似的重載構造方法.重寫“Person”類的info()方法,增加職稱信息.Object類Object類是所有Java類的根基類如果在類的聲明中未使用extends關鍵字指明其基類,則默認基類為Object類

publicclassPerson{…….}

等價于:

publicclassPersonextendsObject{……}toString方法Object類中定義有publicStringtoString()方法,其返回值是String類型,描述當前對象的有關信息。在進行String與其它類型數據的連接操作時(如:System.out.println(“info”+person)),將自動調用該對象類的toString()方法可以根據需要在用戶自定義類型中重寫toString()方法。TestToString.javaequals方法Object類中定義有:publicbooleanequals(Objectobj)方法提供定義對象是否“相等”的邏輯。Object的equals方法定義為:x.equals(y)當x和y是同一個對象的引用時返回true否則返回falseJ2SDK提供的一些類,如String,Date等,重寫了Object的equals方法,調用這些類的equals方法,x.equals(y),當x和y所引用的對象是同一類對象且屬性內容相等時(并不一定是相同對象),返回true否則返回false。可以根據需要在用戶自定義類中重寫equals方法。TestEquals.java對象轉型(casting)一個基類的引用類型變量可以“指向”其子類的對象。一個基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)。可以使用引用變量instanceof類名來判斷該引用型變量所“指向”的對象是否屬于該類或該類的子類。子類的對象可以當作基類的對象來使用稱作向上轉型(upcasting),反之稱為向下轉型(downcasting)對象轉型實例1(1)classAnimal{ publicStringname; Animal(Stringname){ =name; }classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n);eyeColor=c; }}classDogextendsAnimal{ publicStringfurColor; Dog(Stringn,Stringc){ super(n);furColor=c; }}對象轉型實例1(2)publicclassTest{ publicstaticvoidmain(Stringargs[]){ 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();//bigyellow System.out.println(a.furColor);//!error System.out.println(ainstanceofAnimal);//true

System.out.println(ainstanceofDog);//true Dogd1=(Dog)a;//要加強制轉換符

System.out.println(d1.furColor);//yellow }}對象轉型實例2publicclassTest{ publicstaticvoidmain(String[]args){ Testtest=newTest(); 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”); } }}動態綁定和多態動態綁定是指在執行期間(而非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。上面例子中,根據Lady對象的成員變量pet所引用的不同的實際類型而調用相應的enjoy方法。classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringn,Stringf){ super(n); featherColor=f; } publicvoidenjoy(){ System.out.pringln(“鳥叫聲……”); }publicclassTest{ publicstaticvoidmain(Stringargs[]){ Ladyl3=newLady(“l3”,newBird(“birdname”,”green”); ls.myPetEnjoy(); }}動態綁定使軟件可擴展性達到極致,三個條件:1要有繼承2要有重寫3父類引用指向子類對象TestPolymoph.java抽象類用abstract關鍵字來修飾一個類時,這個類叫做抽象類;用abstract來修飾一個方法時,該方法叫做抽象方法。含有抽象方法的類必須被聲明為抽象類,抽象類必須被繼承,抽象方法必須被重寫。抽象類不能被實例化抽象方法只需聲明,而不需實現。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidenjoy();}classCatextendsAnimal{privateStringeyesColor;Cat(Stringn,Stringc){super(n);eyesColor=c;}publicvoidenjoy(){System.out.println(“貓叫聲……”);}}final關鍵字final的變量的值不能夠被改變final的成員變量final的局部變量(形參)final的方法不能夠被重寫final的類不能夠被繼承String,Math等類都屬于finalTestFinal.java接口接口(interface)是抽象方法和常量值的定義的集合。從本質上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實現。接口定義舉例:publicinterfaceRunner{publicstaticfinalintid=1;publicvoidstart();publicvoidrun();publicvoidstop();}接口特性接口可以實現多重實現;接口中聲明的屬性默認為publicstaticfinal的;也只能是publicstaticfinal的;接口中只能定義抽象方法,而且這些方法默認為public的、也只能是public的;接口可以繼承其他的接口,并添加新的屬性和抽象方法。接口多個無關的類可以實現同一個接口。一個類可以實現多個無關的接口。與繼承關系類似,接口與實現類之間存在多態性。定義Java類的語法格式

<modifier>class<name>[extends<superclass>][implements<interface>[,<interface>]*]{<declarations>*}接口舉例interfaceSinger{publicvoidsing();publicvoidsleep();}classStudentimplementsSinger{privateStringname;Student(Stringname){=name;}publicvoidstudy(){System.out.println(“studying”);}publicStringgetName(){returnname;}publicvoidsing(){System.out.println(“studentissinging”);}publicvoidsleep(){System.out.println(“studentissle

溫馨提示

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

評論

0/150

提交評論