第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇).ppt_第1頁
第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇).ppt_第2頁
第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇).ppt_第3頁
第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇).ppt_第4頁
第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇).ppt_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 面向?qū)ο蟪绦蛟O(shè)計(高級篇 ),主講人:,應該重點掌握以下內(nèi)容: 繼承和多態(tài)性的基本概念 繼承機制 多態(tài)性與重載 抽象類 包與接口,目 錄,4.1 繼承和多態(tài)性的概念 4.2 繼承機制 4.3 多態(tài)性 4.4 抽象類 4.5 包與接口 4.6 內(nèi)部類 4.7 匿名類,4.1繼承和多態(tài)性的概念,4.1.1 繼承的概述 繼承,就是新的類從已有類那里得到已有的特性。已有的類稱為基類或父類,產(chǎn)生的新類稱為派生類或子類。派生類同樣也可以作為基類再派生新的類,這樣就形成了類的層次結(jié)構(gòu)。 類間的繼承關(guān)系是軟件復用的一種形式。子類(派生類)可以沿用父類(基類)的某些特征,并根據(jù)自己的需要對性能加以修改,

2、添加新的屬性和操作。,由于巴士、卡車和出租車作為交通工具,特將它們的共同特性抽取出來,形成一個父類(也稱超類),代表一般化屬性,而巴士、卡車和出租車轉(zhuǎn)化為子類,繼承父類的一般特性包括父類的數(shù)據(jù)成員和行為如外觀顏色和剎車等特性,有產(chǎn)生自己獨特的屬性和行為如巴士的最大載客數(shù)和報站,區(qū)別于父類的特性。,繼承的方式包括單一繼承和多重繼承。單一繼承(single inheritance)是最簡單的方式:一個派生類只從一個基類派生。多重繼承(multiple inheritance)是一個派生類有兩個或多個基類。這兩種繼承方式如圖4.1所示。請注意圖中箭頭的方向,本書約定,箭頭表示繼承的方向,由子類指向父

3、類。,4.1.2 多態(tài)性的概述 多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計的重要特性之一,它與封裝性和繼承性一起構(gòu)成了面向?qū)ο蟪绦蛟O(shè)計的三大特性。 多態(tài)性主要體現(xiàn)在:向不同的對象發(fā)送同一個消息,不同的對象在接收時會產(chǎn)生不同的行為(即方法)。也就是說,每個對象可以用自己的方式去響應共同的消息。 在Java語言中,多態(tài)性體現(xiàn)在兩個方面:由方法重載實現(xiàn)的靜態(tài)多態(tài)性(編譯時多態(tài))和方法重寫實現(xiàn)的動態(tài)多態(tài)性(也稱動態(tài)聯(lián)編)。 (1)編譯時多態(tài) 在編譯階段,具體調(diào)用哪個被重載的方法,編譯器會根據(jù)參數(shù)的不同來靜態(tài)確定調(diào)用相應的方法。 (2)動態(tài)聯(lián)編 程序中凡是使用父類對象的地方,都可以用子類對象來

4、代替。在程序運行期間可以通過引用子類的實例來調(diào)用子類的方法。,4.2 繼承機制,4.2.1繼承的定義 編程中遇到下面的情況:定義教師類。 public class DotNetTeacher /教師分為.Net教師 private String name; / 教師姓名 private String school; / 所在學校 public DotNetTeacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLession() System.out.println(啟動

5、VS2010); System.out.println(知識點講解); System.out.println(總結(jié)提問); public void introduction() System.out.println(大家好!我是 + school + 的 + name + .); ,定義教師類。 public class JavaTeacher /教師分為Java教師 private String name; / 教師姓名 private String school; / 所在學校 public JavaTeacher(String myName, String mySchool) name

6、= myName; school = mySchool; public void giveLession()/授課方法的具體實現(xiàn) System.out.println(啟動 MyEclipse); System.out.println(知識點講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實現(xiàn) System.out.println(大家好!我是 + school + 的 + name + .); ,在程序處理中,發(fā)現(xiàn)兩個類的定義非常相似,有很多相同點,如教師的屬性姓名、所屬部門類似,類的方法也基本相同。 針

7、對這種情況,將java教師類和.net教師類的共性抽取出來,形成父類Teacher類,使得.net教師和java教師成為Teacher類的子類,則子類繼承父類的基本屬性和方法,就簡化了子類的定義。上述代碼修改如下:,父類Teacher: public class Teacher private String name; / 教師姓名 private String school; / 所在學校 public Teacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLesso

8、n() /授課方法的具體實現(xiàn) System.out.println(知識點講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實現(xiàn) System.out.println(大家好!我是“ + school + 的 + name + 。); ,子類JavaTeacher: public class JavaTeacher extends Teacher public JavaTeacher(String myName, String mySchool) super(myName, mySchool); public

9、 void giveLesson() System.out.println(啟動 MyEclipse); super.giveLesson(); 子類NetTeacher: public class DotNetTeacher extends Teacher public DotNetTeacher(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動 VS2010); super.giveLesson(); ,子類自動繼承父類的屬性和方法,

10、子類中不再存在重復代碼,從而實現(xiàn)代碼的重用。完整的代碼如下: 【例4-1】 自定義父類Teacher,創(chuàng)建其兩個子類JavaTeacher和DotNetTeacher。 /*本程序的功能是定義一個教師類Teacher,并聲明該類的兩個子類,并進行調(diào)試。*/,文件名: test_teacher.java,4.2.2繼承的傳遞性 類的繼承是可以傳遞的。類b繼承了類A,類c有繼承了類b,這是c包涵a和b的所有成員,以及c自身的成員,這稱為類繼承的傳遞性。類的傳遞性對java語言有重要的意義。下面的代碼體現(xiàn)這一點。 public class Vehicle void vehicleRun() Syst

11、em.out.println(汽車在行駛!); ,public class Truck extends Vehicle /直接父類為Vehicle void truckRun() System.out.println(卡車在行駛!); public class SmallTruck extends Truck/直接父類為Truck protected void smallTruckRun() Console.WriteLine(微型卡車在行駛!); pbulic static void main(String args) SmallTruck smalltruck = new SmallTru

12、ck(); smalltruck.vehicleRun(); /祖父類的方法調(diào)用 smalltruck.truckRun(); /直接父類的方法調(diào)用 smalltruck.smallTruckRun(); /子類自身的方法調(diào)用 ,4.2.3 類中屬性的繼承與隱藏 1. 屬性的繼承 子類可以繼承父類的所有非私有屬性。見下面代碼: public class Person public String name; public int age; public void showInfo() System.out.println( “尊敬的”+name+”,您的年齡為:”+age); public cl

13、ass Student extends Person public string school; public int engScore; public int javaScore; public void setInfo() name=“陳冠一”; /基類的數(shù)據(jù)成員 age=20; /基類的數(shù)據(jù)成員 school=“鄭州輕工業(yè)學院”; ,2. 屬性的隱藏 子類也可以隱藏繼承的成員變量,對于子類可以從父類繼承的成員變量,只要子類中定義的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量 。 當子類執(zhí)行它自己定義的方法時,所操作的就是它自己定義的數(shù)據(jù)成員,從而覆蓋父類繼承來的數(shù)據(jù)成員。

14、子類通過成員變量的隱藏可以把父類的狀態(tài)變?yōu)樽陨淼臓顟B(tài)。,4.2.4 類中方法的繼承、覆蓋與重載 1. 方法的繼承 父類中非私有方法都可以被子類所繼承。 下面的程序?qū)崿F(xiàn)這點,詳見程序中的注釋。 class Person/基類 private String name; private int age; public void initInfo(String n,int a) name =n; age =a; public void showInfo() System.out.println( 尊敬的 + name + ,您的年齡為:+age); ,public class SubStudent e

15、xtends Person/子類 private String school; private int engScore; private int javaScore; public void setScores(String s,int e,int j) school=s; engScore =e; javaScore =j; public static void main(String args) SubStudent objStudent = new SubStudent(); objStudent.initInfo(王爍,22); /來自父類繼承的方法 objStudent.showI

16、nfo(); /來自父類繼承的方法 objStudent.setScores(情話大學,79,92); ,1.在子類繼承父類的成員方法時,應注意: 子類不能訪問父類的private(私有)成員方法,但子類可以訪問父類的public(公有)、protected(保護)成員方法。 protected訪問時,子類和同一包內(nèi)的方法都能訪問父類的protected成員方法,但其他方法不能訪問。 2. 方法的覆蓋 子類通過方法的覆蓋可以隱藏繼承的方法 ,方法覆蓋是指:子類中定義一個方法,并且這個方法的名字、返回類型、參數(shù)列表與從父類繼承的方法完全相同。,【例4-2】自定義父類Person,創(chuàng)建其子類Sub

17、Student。 /*本程序的功能是定義一個Person類和它的子類SubStudent,測試父子類具有同名方法時子類的方法覆蓋父類的同名方法*/,文件名: SubStudent.java,3. 方法的重載 與方法的覆蓋(overriding)不同,方法的重載(overloading)不是父子類之間的同名方法的調(diào)用,而是在一個類中允許同名的方法存在,是類對自身同名方法的重新定義。 如java系統(tǒng)提供的輸出命令的同名方法的使用如下: System.out.println();/輸出一個空行 System.out.println(double salary);/ 輸出一個雙精度類型的變量后換行 S

18、ystem.out.println(String name);/輸出一個字符串對象的值后換行 由于重載發(fā)生在同一個類里,不能再用類名來區(qū)分不同的方法了,所以一般采用不同的形式參數(shù)列表,包括形式參數(shù)的個數(shù)、類型、順序的不同,來區(qū)分重載的方法。只需簡單地調(diào)用print方法并把一個參數(shù)傳遞給print,由系統(tǒng)根據(jù)這個參數(shù)的類型來判斷應該調(diào)用哪一個print方法。 方法重載有不同的表現(xiàn)形式,如基于不同類型參數(shù)的重載: class Add public String Sum(String para1, String para2) public int Sum(int para1, int para2)

19、,如相同類型不同參數(shù)個數(shù)的重載: class Add public int Sum(int para1, int para2) public int Sum(int para1, int para2,int para3) 【例4-3】自定義父類Area,創(chuàng)建其攜帶不同參數(shù)及返回類型的同名方法。 /*本程序的功能是定義一個Area類和它的同名方法,測試類中同名方法的重載*/,文件名: TestArea.java,4. 構(gòu)造方法的重載 構(gòu)造方法也可以重載,它是指同一個類中存在著若干個具有不同參數(shù)列表的構(gòu)造方法。如Employee類中構(gòu)造方法的重載。 class Employee /定義父類: 員工

20、類 /忽略類中屬性,值保留重載的構(gòu)造方法 Employee() /無參的構(gòu)造方法,僅僅初始化員工的編號 employeeNo = employeeNextNo+; Employee(String name) /有一個參數(shù)的構(gòu)造方法,僅僅初始化員工的編號和姓名 employeeNo = employeeNextNo+; employeeName = name; Employee(String name , double initSalary) /有兩個參數(shù)的構(gòu)造方法,僅僅初始化員工的編號、姓名和工資 employeeNo = employeeNextNo+; employeeName = nam

21、e; employeeSalary = initSalary; ,4.2.5在子類中使用構(gòu)造方法 子類不能繼承父類的構(gòu)造方法。 子類在創(chuàng)建新對象時,依次向上尋找其基類,直到找到最初的基類,然后開始執(zhí)行最初的基類的構(gòu)造方法,再依次向下執(zhí)行派生類的構(gòu)造方法,直至執(zhí)行完最終的擴充類的構(gòu)造方法為止。 注:對于無參數(shù)的構(gòu)造方法,執(zhí)行不會出現(xiàn)問題。如果是帶參數(shù)的構(gòu)造方法,還需要做相應的處理。 如果基類中沒有默認構(gòu)造方法或者希望調(diào)用帶參數(shù)的基類構(gòu)造方法,就要使用關(guān)鍵字super來顯式調(diào)用基類構(gòu)造方法。 使用關(guān)鍵字super調(diào)用基類構(gòu)造方法的語句,必須是子類構(gòu)造方法的第一個可執(zhí)行語句。 調(diào)用基類構(gòu)造方法時傳遞

22、的參數(shù)不能是關(guān)鍵字this或當前對象的非靜態(tài)成員。,【例4-4】子類中使用構(gòu)造方法的實例。 /* 程序功能描述:在程序中聲明了父類Employee和子類CommonEmployee ,子類繼承了父類的非私有的屬性和方法,但父子類計算各自的工資的方法不同,如父類對象直接獲取工資,而子類在底薪的基礎(chǔ)上增加獎金數(shù)為工資總額,通過子類的構(gòu)造方法中super的調(diào)用類初始化父類的對象,并調(diào)用繼承父類的方法toString()輸出員工的基本信息。*/,文件名: test_constructor.java,4.3.1 多態(tài)性的體現(xiàn) 在java語言中,多態(tài)性體現(xiàn)在兩個方面:由方法重載實現(xiàn)的靜態(tài)多態(tài)性(編譯時多態(tài)

23、)和方法覆蓋實現(xiàn)的動態(tài)多態(tài)性(運行時多態(tài))。 靜態(tài)多態(tài)性是在編譯的過程中確定同名操作的具體操作對象的,而動態(tài)多態(tài)性則是在程序運行過程中動態(tài)地確定操作所針對的具體對象的。這種確定操作具體對象的過程就是聯(lián)編(binding),也稱為動態(tài)綁定。,4.3 多態(tài)性,4.3.2 靜態(tài)多態(tài)性 靜態(tài)多態(tài)性是在編譯的過程中確定同名操作的具體操作對象的。下面的代碼體現(xiàn)了編譯時的多態(tài)性。 public class Person private String name; private int age; public void initInfo(String n,int a) / 同名方法 name =n; age

24、=a; public void initInfo(String n) / 同名方法 name =n; public void showInfo() System.out.println( “尊敬的”+name+”,您的年齡為:”+age); ,4.3.3動態(tài)多態(tài)性 和靜態(tài)聯(lián)編相對應,如果聯(lián)編工作在程序運行階段完成,則稱為動態(tài)聯(lián)編。在編譯、連接過程中無法解決的聯(lián)編問題,要等到程序開始運行之后再來確定。 如果父類的引用指向一個子類對象時,當調(diào)用一個方法完成某個功能時,程序會動態(tài)地(在執(zhí)行時)選擇正確的子類的同樣方法去實現(xiàn)該功能,就稱為動態(tài)方法綁定。,下面動態(tài)方法調(diào)用的簡單例子。 class Par

25、ent public void function() System.out.println(I am in Parent!); class Child extends Parent public void function() System.out.println(I am in Child!); public class test_parent public static void main(String args) Parent p1=new Parent( ); Parent p2=new Child( ); p1.function( ); p2.function( ); 程序的輸出結(jié)果

26、為: I am in Parent! I am in Child!,4.3.4父類對象與子類對象間的指代使用和轉(zhuǎn)化 this和super關(guān)鍵字是常用來指代父類對象與子類 對象的關(guān)鍵字。 1.this關(guān)鍵字 this表示的是當前對象本身,更準確地說,this代表了當前對象的一個引用。對象的引用可以理解為對象的另一個名字,通過引用可以順利地訪問對象,包括修改對象的屬性、調(diào)用對象的方法。 2.super關(guān)鍵字 super表示的是當前對象的直接父類對象,是當前對象的直接父類對象的引用。所謂直接父類是相對于當前對象的其他“祖先”而言的。, 通過super關(guān)鍵字訪問父類中被隱藏的成員變量 class Fa

27、ther int x=0; class Child extends Father int x=1; public Child() System.out.println (super.x); public static void main(String args) new Child(); /super.x=0 子類的構(gòu)造方法中,通過super關(guān)鍵字調(diào)用父類的構(gòu)造方法 public class Student extends Person public Student(String myName, int myAge) super(myName, myAge);/調(diào)用父類的構(gòu)造方法,完成對屬性值

28、的初始化 , 方法覆蓋后,通過super關(guān)鍵字調(diào)用父類的方法 public class Student extends Person public void showInfo() super.showInfo(); System.out.println(,你的英語成績是:+engScore+, JAVA成績是:+javaScore); 3. 父類對象與子類對象的轉(zhuǎn)化 假設(shè)B類是A類子類或間接子類,當我們用子類B創(chuàng)建一個對象,并把這個對象的引用賦給A類的對象: A a; B b=new B(); a = b; 稱這個A類對象:a是子類對象b的上轉(zhuǎn)型對象. 子類對象可以賦給父類對象,但指向子類的父

29、類對象,不能操作子類新增的成員變量,不能使用子類新增的方法。 上轉(zhuǎn)型對象可以操作子類繼承或隱藏成員變量,也可以使用子類繼承的或重寫的方法。 可以將對象的上轉(zhuǎn)型對象再強制轉(zhuǎn)換到一個子類對象,該子類對象又具備了子類所有屬性和功能。 如果子類重寫了父類的方法,那么重寫方法的調(diào)用原則如下:Java運行時系統(tǒng)根據(jù)調(diào)用該方法的實例,來決定調(diào)用哪個方法。 對子類的一個實例,如果子類重寫了父類的方法,則運行時系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運行時系統(tǒng)調(diào)用父類的方法。 總之,父類對象和子類對象的轉(zhuǎn)化需要注意如下原則: 子類對象可以被視為是其父類的一個對象。 父類對象不能被當作是其某一個

30、子類的對象。 如果一個方法的形式參數(shù)定義的是父類對象,那么調(diào)用這個方法時,可以使用子類對象作為實際參數(shù)。,Java語言中,用abstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類。抽象類只關(guān)心它的子類是否具有某種功能,并不關(guān)心該功能的具體實現(xiàn),功能的具體行為由子類負責實現(xiàn)的。一個抽象類中可以有一個或多個抽象方法。 4.4.1 抽象類的定義 抽象類的一般格式: abstract class ClassName /類實現(xiàn) 如abstract class ClassOne /類實現(xiàn) ,4.4 抽象類,一旦ClassOne類聲明為抽象類,則它不能被實例化,只能用作派生類的基類而存在。下面的語句會產(chǎn)生編

31、譯錯誤: ClassOne a = new ClassOne(); 抽象方法的一般格式: abstract 返回值類型 抽象方法( 參數(shù)列表 ); 如語句public abstract void Method(); 抽象方法的一個主要目的就是為所有子類定義一個統(tǒng)一的接口,抽象方法必須被重寫。 抽象類必須被繼承,抽象方法必須被重寫。抽象方法只需聲明,無需實現(xiàn);抽象類不能被實例化,抽象類不一定要包含抽象方法。若類中包含了抽象方法,則該類必須被定義為抽象類。,抽象類有以下的定義規(guī)則: 抽象類必須用abstract關(guān)鍵字來修飾;抽象方法也必須用abstract來修飾。 抽象類不能被實例化,也就是不能用

32、new關(guān)鍵字去產(chǎn)生對象。 抽象方法只需聲明,而不需實現(xiàn)。 含有抽象方法的類必須被聲明為抽象類,抽象類的子類必須覆蓋所有的抽象方法后才能被實例化,否則這個子類還是個抽象類。,具體實現(xiàn)可參考下面兩段的代碼。 (1)抽象類的基本實現(xiàn)方法 abstract class Base int basevar; / 成員變量 public abstract void M1(); / 抽象的成員函數(shù),只有聲明,沒有集體的實現(xiàn),、/必須在該類的子類實現(xiàn)方法 . class Derived extends Base int derivedvars; / 成員變量 public void M1() /子類必須重寫父類

33、的抽象成員函數(shù)M1 / 實際實現(xiàn)的語句體 . ,(2)繼承于抽象類的類一般應該實現(xiàn)抽象類中的所有抽象方法(重寫)。如果沒有,那么該派生類也應該聲明為抽象類。 abstract class A public abstract void MethodA(); class B extends A /錯誤,子類B沒有實現(xiàn)對象父類A中抽象方法MethodA /的重寫,一次B類應聲明為抽象類 public void MethodB() class C extends A public void MethodA() 。,4.4.2 抽象類的使用 下面給出一個抽象類的使用,體會一下抽象類和抽象方法的定義,以及

34、子類怎樣實現(xiàn)對父類抽象方法的重寫。 【例4-5】抽象類的使用實例。 /*程序功能介紹:Shape類是對現(xiàn)實世界形狀的抽象,子類Rectangle和子類Circle是Shape類的兩個子類,分別代表現(xiàn)實中兩種具體的形狀。在子類中根據(jù)不同形狀自身的特點計算不同子類對象的面積。*/,文件名: test_shape .java,接下來,再給一個較為復雜的實例,它體現(xiàn)了java中多態(tài)性的特點,大家可細細體會。 【例4-6】多態(tài)性的使用實例。 /*程序功能介紹:多態(tài)性實現(xiàn)的工資系統(tǒng)中的一部分程序。Employee類是抽象的員工父類,Employee類的子類有經(jīng)理Boss,每星期獲取固定工資,而不計工作時間

35、;子類普通雇員CommissionWorker類,除基本工資外還根據(jù)每周的銷售額發(fā)放浮動工資等。子類Boss和CommissionWorker聲明位final,表明它們不再派生新的子類。*/,文件名: test_abstract .java,4.5.1 java中的包 一個包就是一些提供訪問保護和命名空間管理的相關(guān)類與接口的集合。使用包的目的就是使類容易查找使用, 防止命名沖突, 以及控制訪問。標準Java庫被分類成許多的包,其中包括java.io、javax.swing和等等。標準Java包是分層次的。就像在硬盤上嵌套有各級子目錄一樣,可以通過層次嵌套組織包。所有Java包都在Java和Ja

36、vax包層次內(nèi)。,4.5 包與接口,1定義包 包聲明的一般形式: package pkg.pkg1.pkg2; 說明: package 說明包的關(guān)鍵字 pkg 包名 定義包的語句必須放在所有程序的最前面。也可以沒有包,則當前編譯單元屬于無名包,生成的class文件放在在一般與.java文件同名的目錄下。package名字一般用小寫。如下創(chuàng)建包的語句: package employee ; package employee .commission ; 創(chuàng)建包就是在當前文件夾下創(chuàng)建一個子文件夾,以便存放這個包中包含的所有類的 .class文件。上面的第二個創(chuàng)建包的語句中的符號“.”代表了目錄分隔符

37、,即這個語句創(chuàng)建了兩個文件夾。第一個是當前文件夾下的子文件夾employee ;第二個是employee下的子文件夾commission,當前包中的所有類就存放在這個文件夾里。,2向包添加類 要把類放入一個包中,必須把此包的名字放在源文件頭部,并且放在對包中的類進行定義的代碼之前。例如,在文件Employee.java的開始部分如下: package myPackage; public class Employee 則創(chuàng)建的Employee類編譯后生成的Employee.class存放在子目錄myPackage下。 3包引用 通常一個類只能引用與它在同一個包中的類。如果需要使用其他包中的pub

38、lic類,則可以使用如下的幾種方法。 (1)直接使用包名、類名前綴 一個類要引用其他的類,無非是繼承這個類或創(chuàng)建這個類的對象并使用它的域、調(diào)用它的方法。對于同一包中的其他類,只需在要使用的屬性或方法名前加上類名作為前綴即可;對于其他包中的類,則需要在類名前綴的前面再加上包名前綴。例如: employee.Employee ref = new employee.Employee();,/ employee為包名 (2)加載包中單個的類。用import語句加載整個類到當 前程序中,在java程序的最前方加上下面的語句 import employee.Employee; Employee ref =

39、 new Employee();/創(chuàng)建對象 (3)加載包中多個類。用import語句引入整個包,此時 這個包中的所有類都會被加載到當前程序中。加載整個包的import語句可以寫為: import employee . *; /加載用戶自定義的 employee包中的所有類 4. 編譯和運行包 1. CLASSPATH 我們曾指出了CLASSPATH環(huán)境變量的設(shè)置是告訴Java在哪里能找到第三方提供的類庫。 2. 編譯 編譯的過程和運行的過程大同小異, 只是一個是找出來編譯, 另一個是找出來裝載。 javac d d:userchap04 packTest.java 3. 運行 d:userch

40、ap04 java test.packTest,5. Jar包 把開發(fā)好的程序交給用戶就叫發(fā)布。JDK中有一個實用工具jar.exe可以完成打包工作。打包好的文件擴展名一般為jar,所以叫JAR文件。通過編輯一個manifest.mf的文件來實現(xiàn)的。 manifest.mf文件應該包含以下一行內(nèi)容: Main-Class: 主類的完整名稱 如:Main-Class: com.misxp.PackageExercise 這一行后面必須回車換行,否則可能出錯。另外,冒號后面必須空一格。這個文件必須和字節(jié)碼文件放在同一目錄中。使用工具jar.exe可以創(chuàng)建可執(zhí)行的JAR文件。進入命令行狀態(tài) 讓字節(jié)碼

41、所在文件夾成為當前文件夾 執(zhí)行以下命令:jar cvmf manifest.mf jarfilename.jar com就可以得jarfilename.jar打包文件。Jarfilename名字可以自己取。雙擊jarfilename.jar就可以運行程序。,6. JDK中的常用包 java.lang-包含一些Java語言的核心類,如String 、Math、Integer、System和Thread,提供常用功能。 2. java.awt-包含了構(gòu)成抽象窗口工具集(abstract window toolkits)的多個類,這些類被用來構(gòu)建和管理 應用程序的圖形用戶界面(GUI)。 3. ja

42、va.applet-包含applet運行所需的一些類。 4. -包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類。 5. java.io-包含能提供多種輸入/輸出功能的類。 6. java.util-包含一些實用工具類,如定義系統(tǒng)特性、使用與日期日歷相關(guān)的函數(shù)。,4.5.2 java中的接口 由于Java只支持單一繼承,接口是Java實現(xiàn)多重繼承功能的一種手段,一種結(jié)構(gòu)。接口只定義了與外界交流時輸入、輸出的格式。換句話說,通過在接口中定義一些方法(抽象方法),可以用接口大致規(guī)劃出類的共同行為,而把具體的實現(xiàn)留給具體的類。 如果一個抽象類中的所有方法都是抽象的,我們就可以將這個類用另外一種方式來定義,也就是接口定義

43、。接口是抽象方法和常量值的定義的集合,從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。,1. 接口聲明 接口聲明的一般格式: public interface 接口名 / 常量 /方法聲明 常量定義部分定義的常量均具有public、static和final屬性。 接口中只能進行方法的聲明,不提供方法的實現(xiàn),在接口中聲明的方法具有public和abstract屬性。如 public interface PCI final int voltage ; public void start(); public void stop(); 。,2. 接口實現(xiàn)

44、 接口可以由類來實現(xiàn),類通過關(guān)鍵字implements 聲明自己使用一個或多個接口。所謂實現(xiàn)接口,就是實現(xiàn)接口中聲明的方法。 class 類名 extends 基類 implements 接口,接口 / 成員定義部分 接口中的方法被默認是public ,所以類在實現(xiàn)接口方法時,一定要用public 來修飾。 如果某個接口方法沒有被實現(xiàn),實現(xiàn)類中必須將它聲明為抽象的,該類當然也必須聲明為抽象的。如 interface IMsg void Message(); public abstract class MyClass implements IMsg public abstract void Me

45、ssage(); 【例4-7】接口實現(xiàn)的實例。,文件名: test_interface1.java,【例4-8】接口實現(xiàn)的實例。 /*程序功能:模擬現(xiàn)實世界的計算機組裝功能。定義計算機主板的PCI類,模擬主板的pci通用插槽,有兩個方法-start(啟用)和stop(停用)。接下來聲明具體的子類聲卡類SoundCard和網(wǎng)卡類NetworkCard,它們分別實現(xiàn)PCI接口中的start和stop方法,從而實現(xiàn)PCI標準的不同部件的組裝和使用。*/,文件名: Assembler.java,J ava支持在一個類中定義另一個類中,稱為嵌套類。在大多數(shù)情況下,嵌套類( 靜態(tài)的嵌套類除外)就是內(nèi)部類(

46、inner class)。這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。 內(nèi)部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內(nèi)部類聲明對象,作為外嵌類的成員。 內(nèi)部類具有自己的成員變量和成員方法。通過建立內(nèi)部類的對象,可以存取其成員變量和調(diào)用其成員方法。,4.6 內(nèi)部類,例如下面的例子: pubic class GroupOne int count; /外部類的成員變量 public class Student /聲明內(nèi)部類 String name; /內(nèi)部類的成員變量 public void output() /內(nèi)部類的成員方法 System.out.println(th

47、+ ); ,4.6 內(nèi)部類,內(nèi)部類有如下特性: 一般用在定義它的類或語句塊之內(nèi),在外部引用它時必須給出完整的名稱。 Java將內(nèi)部類作為外部類的一個成員,就如同成員變量和成員方法一樣。因此外部類與內(nèi)部類的訪問原則是:在外部類中,通過一個內(nèi)部類的對象引用內(nèi)部類中的成員;反之,在內(nèi)部類中可以直接引用它的外部類的成員,包括靜態(tài)成員、實例成員及私有成員。 【例4-9】內(nèi)部類和外部類之間的訪問 /*本例的類GroupTwo中聲明了內(nèi)部類Student,在內(nèi)部類Student中構(gòu)造方法存取了外部類GroupTwo的成員變量count。*/,4.6 內(nèi)部類,文件名: GroupTwo.java

48、,匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創(chuàng)建時,作為new語句的一部分來聲明它們。 要采用另一種形式的new語句,如下所示: new 這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展,或者實現(xiàn)一個給定的接口。它還創(chuàng)建那個類的一個新實例,并把它作為語句的結(jié)果而返回。要擴展的類和要實現(xiàn)的接口是new語句的操作數(shù),后跟匿名類的主體。下面給一個匿名類的使用。,4.7 匿名類,abstract class Animal public abstract void cry(); class TestCry public void testCry(Animal animal)/ 通

49、過Animal對象的傳遞模擬不同動物叫聲 animal.cry(); public class Example public static void main(String args) TestCry cry = new TestCry () ; cry.testCry(new Animal ()/ 構(gòu)建匿名類,模擬貓叫 public void cry() System.out.println(Cat is crying!); ); cry.testCry(new Animal ()/ 構(gòu)建匿名類,模擬狗叫 public void cry() System.out.println(Dog is

50、 crying!); ); / . 省略其他 ,從技術(shù)上說,匿名類可被視為非靜態(tài)的內(nèi)部類,所以它們具有和方法內(nèi)部聲明的非靜態(tài)內(nèi)部類一樣的權(quán)限和限制。 內(nèi)部和匿名類是Java為我們提供的兩個出色的工具。它們提供了更好的封裝,結(jié)果就是使代碼更容易理解和維護,使相關(guān)的類都能存在于同一個源代碼文件中(這要歸功于內(nèi)部類),并能避免一個程序產(chǎn)生大量非常小的類(這要歸功于匿名類)。,本章主要介紹了java中繼承的定義和如何實現(xiàn)的。子類繼承了父類的功能,并根據(jù)具體需要來添加功能體需要來添加功能。 多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計的另一個重要,它與封裝性和繼承性一起構(gòu)成了面向?qū)ο蟪绦蛟O(shè)計的三

51、大特性。本章也重點介紹了java中多態(tài)性的定義和實現(xiàn)。 由于在java中不支持多重繼承的概念,因此引入了接口的概念。本章也著重介紹了java中接口的概念,并通過一實例驗證了接口的重要性。,本章小結(jié),class Teacher private String name; / 教師姓名 private String school; / 所在學校 public Teacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLesson() /授課方法的具體實現(xiàn) System.out.p

52、rintln(知識點講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實現(xiàn) System.out.println(大家好!我是“ + school + 的 + name + 。); ,例4-1】 自定義父類Teacher,創(chuàng)建其兩個子類JavaTeacher和DotNetTeacher。,class JavaTeacher extends Teacher public JavaTeacher(String myName, String mySchool) super(myName, mySchool); pu

53、blic void giveLesson() System.out.println(啟動 MyEclipse); super.giveLesson(); class DotNetTeacher extends Teacher public DotNetTeacher(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動 VS2010); super.giveLesson(); ,public class test_teacher public

54、 static void main(String args) /聲明javaTeacher JavaTeacher javaTeacher = new JavaTeacher(李偉,鄭州輕工業(yè)學院); javaTeacher.giveLesson(); javaTroduction(); System.out.println(n); /聲明dotNetTeacherTeacher DotNetTeacher dotNetTeacher = new DotNetTeacher(王珂,鄭州工業(yè)學院); dotNetTeacher.giveLesson(); dotNetTeac

55、roduction(); 程序運行結(jié)果如圖所示:,【例4-2】自定義父類Person,創(chuàng)建其子類SubStudent。程序運行結(jié)果如圖所示: class Person/基類 protected String name; protected int age; public void initInfo(String n,int a) name =n; age =a; public void showInfo() System.out.println( 尊敬的 + name + ,您的年齡為:+age); ,public class SubStudent extends Person/

56、子類 private String school; private int engScore; private int javaScore; public void showInfo() / 與父類同名的方法 System.out.println(school+ 的 + name+同學+ 年齡為:+age+英語成績是: +engScore+, 你的JAVA成績是:+javaScore); public void setScores(String s,int e,int j) school=s; engScore =e; javaScore =j; public static void main(String args) SubStudent objStudent = new SubStudent(); objStudent.initInfo(王爍,22);/來自父類繼承的方法 objStudent.setScores(鄭州輕工業(yè)學院,79,92); objStudent.showInfo();/調(diào)用自身和父類同名的方法,子類的方法覆蓋父/類同名的方法 ,程序輸出結(jié)果如圖所示:,【例4-3】自定義父類Area,創(chuàng)建其攜帶不同參數(shù)及返回類型的同名方法。,class Area float g

溫馨提示

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

評論

0/150

提交評論