版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 面向?qū)ο蟪绦蛟O(shè)計(jì)(高級(jí)篇 ),主講人:,應(yīng)該重點(diǎn)掌握以下內(nèi)容: 繼承和多態(tài)性的基本概念 繼承機(jī)制 多態(tài)性與重載 抽象類 包與接口,目 錄,4.1 繼承和多態(tài)性的概念 4.2 繼承機(jī)制 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)系是軟件復(fù)用的一種形式。子類(派生類)可以沿用父類(基類)的某些特征,并根據(jù)自己的需要對(duì)性能加以修改,
2、添加新的屬性和操作。,由于巴士、卡車和出租車作為交通工具,特將它們的共同特性抽取出來,形成一個(gè)父類(也稱超類),代表一般化屬性,而巴士、卡車和出租車轉(zhuǎn)化為子類,繼承父類的一般特性包括父類的數(shù)據(jù)成員和行為如外觀顏色和剎車等特性,有產(chǎn)生自己獨(dú)特的屬性和行為如巴士的最大載客數(shù)和報(bào)站,區(qū)別于父類的特性。,繼承的方式包括單一繼承和多重繼承。單一繼承(single inheritance)是最簡(jiǎn)單的方式:一個(gè)派生類只從一個(gè)基類派生。多重繼承(multiple inheritance)是一個(gè)派生類有兩個(gè)或多個(gè)基類。這兩種繼承方式如圖4.1所示。請(qǐng)注意圖中箭頭的方向,本書約定,箭頭表示繼承的方向,由子類指向父
3、類。,4.1.2 多態(tài)性的概述 多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性之一,它與封裝性和繼承性一起構(gòu)成了面向?qū)ο蟪绦蛟O(shè)計(jì)的三大特性。 多態(tài)性主要體現(xiàn)在:向不同的對(duì)象發(fā)送同一個(gè)消息,不同的對(duì)象在接收時(shí)會(huì)產(chǎn)生不同的行為(即方法)。也就是說,每個(gè)對(duì)象可以用自己的方式去響應(yīng)共同的消息。 在Java語言中,多態(tài)性體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài))和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性(也稱動(dòng)態(tài)聯(lián)編)。 (1)編譯時(shí)多態(tài) 在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來靜態(tài)確定調(diào)用相應(yīng)的方法。 (2)動(dòng)態(tài)聯(lián)編 程序中凡是使用父類對(duì)象的地方,都可以用子類對(duì)象來
4、代替。在程序運(yùn)行期間可以通過引用子類的實(shí)例來調(diào)用子類的方法。,4.2 繼承機(jī)制,4.2.1繼承的定義 編程中遇到下面的情況:定義教師類。 public class DotNetTeacher /教師分為.Net教師 private String name; / 教師姓名 private String school; / 所在學(xué)校 public DotNetTeacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLession() System.out.println(啟動(dòng)
5、VS2010); System.out.println(知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問); public void introduction() System.out.println(大家好!我是 + school + 的 + name + .); ,定義教師類。 public class JavaTeacher /教師分為Java教師 private String name; / 教師姓名 private String school; / 所在學(xué)校 public JavaTeacher(String myName, String mySchool) name
6、= myName; school = mySchool; public void giveLession()/授課方法的具體實(shí)現(xiàn) System.out.println(啟動(dòng) MyEclipse); System.out.println(知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實(shí)現(xiàn) System.out.println(大家好!我是 + school + 的 + name + .); ,在程序處理中,發(fā)現(xiàn)兩個(gè)類的定義非常相似,有很多相同點(diǎn),如教師的屬性姓名、所屬部門類似,類的方法也基本相同。 針
7、對(duì)這種情況,將java教師類和.net教師類的共性抽取出來,形成父類Teacher類,使得.net教師和java教師成為Teacher類的子類,則子類繼承父類的基本屬性和方法,就簡(jiǎn)化了子類的定義。上述代碼修改如下:,父類Teacher: public class Teacher private String name; / 教師姓名 private String school; / 所在學(xué)校 public Teacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLesso
8、n() /授課方法的具體實(shí)現(xiàn) System.out.println(知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實(shí)現(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(啟動(dòng) MyEclipse); super.giveLesson(); 子類NetTeacher: public class DotNetTeacher extends Teacher public DotNetTeacher(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動(dòng) VS2010); super.giveLesson(); ,子類自動(dòng)繼承父類的屬性和方法,
10、子類中不再存在重復(fù)代碼,從而實(shí)現(xiàn)代碼的重用。完整的代碼如下: 【例4-1】 自定義父類Teacher,創(chuàng)建其兩個(gè)子類JavaTeacher和DotNetTeacher。 /*本程序的功能是定義一個(gè)教師類Teacher,并聲明該類的兩個(gè)子類,并進(jìn)行調(diào)試。*/,文件名: test_teacher.java,4.2.2繼承的傳遞性 類的繼承是可以傳遞的。類b繼承了類A,類c有繼承了類b,這是c包涵a和b的所有成員,以及c自身的成員,這稱為類繼承的傳遞性。類的傳遞性對(duì)java語言有重要的意義。下面的代碼體現(xiàn)這一點(diǎ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è)學(xué)院”; ,2. 屬性的隱藏 子類也可以隱藏繼承的成員變量,對(duì)于子類可以從父類繼承的成員變量,只要子類中定義的成員變量和父類中的成員變量同名時(shí),子類就隱藏了繼承的成員變量 。 當(dāng)子類執(zhí)行它自己定義的方法時(shí),所操作的就是它自己定義的數(shù)據(jù)成員,從而覆蓋父類繼承來的數(shù)據(jù)成員。
14、子類通過成員變量的隱藏可以把父類的狀態(tài)變?yōu)樽陨淼臓顟B(tài)。,4.2.4 類中方法的繼承、覆蓋與重載 1. 方法的繼承 父類中非私有方法都可以被子類所繼承。 下面的程序?qū)崿F(xiàn)這點(diǎ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(情話大學(xué),79,92); ,1.在子類繼承父類的成員方法時(shí),應(yīng)注意: 子類不能訪問父類的private(私有)成員方法,但子類可以訪問父類的public(公有)、protected(保護(hù))成員方法。 protected訪問時(shí),子類和同一包內(nèi)的方法都能訪問父類的protected成員方法,但其他方法不能訪問。 2. 方法的覆蓋 子類通過方法的覆蓋可以隱藏繼承的方法 ,方法覆蓋是指:子類中定義一個(gè)方法,并且這個(gè)方法的名字、返回類型、參數(shù)列表與從父類繼承的方法完全相同。,【例4-2】自定義父類Person,創(chuàng)建其子類Sub
17、Student。 /*本程序的功能是定義一個(gè)Person類和它的子類SubStudent,測(cè)試父子類具有同名方法時(shí)子類的方法覆蓋父類的同名方法*/,文件名: SubStudent.java,3. 方法的重載 與方法的覆蓋(overriding)不同,方法的重載(overloading)不是父子類之間的同名方法的調(diào)用,而是在一個(gè)類中允許同名的方法存在,是類對(duì)自身同名方法的重新定義。 如java系統(tǒng)提供的輸出命令的同名方法的使用如下: System.out.println();/輸出一個(gè)空行 System.out.println(double salary);/ 輸出一個(gè)雙精度類型的變量后換行 S
18、ystem.out.println(String name);/輸出一個(gè)字符串對(duì)象的值后換行 由于重載發(fā)生在同一個(gè)類里,不能再用類名來區(qū)分不同的方法了,所以一般采用不同的形式參數(shù)列表,包括形式參數(shù)的個(gè)數(shù)、類型、順序的不同,來區(qū)分重載的方法。只需簡(jiǎn)單地調(diào)用print方法并把一個(gè)參數(shù)傳遞給print,由系統(tǒng)根據(jù)這個(gè)參數(shù)的類型來判斷應(yīng)該調(diào)用哪一個(gè)print方法。 方法重載有不同的表現(xiàn)形式,如基于不同類型參數(shù)的重載: class Add public String Sum(String para1, String para2) public int Sum(int para1, int para2)
19、,如相同類型不同參數(shù)個(gè)數(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ù)及返回類型的同名方法。 /*本程序的功能是定義一個(gè)Area類和它的同名方法,測(cè)試類中同名方法的重載*/,文件名: TestArea.java,4. 構(gòu)造方法的重載 構(gòu)造方法也可以重載,它是指同一個(gè)類中存在著若干個(gè)具有不同參數(shù)列表的構(gòu)造方法。如Employee類中構(gòu)造方法的重載。 class Employee /定義父類: 員工
20、類 /忽略類中屬性,值保留重載的構(gòu)造方法 Employee() /無參的構(gòu)造方法,僅僅初始化員工的編號(hào) employeeNo = employeeNextNo+; Employee(String name) /有一個(gè)參數(shù)的構(gòu)造方法,僅僅初始化員工的編號(hào)和姓名 employeeNo = employeeNextNo+; employeeName = name; Employee(String name , double initSalary) /有兩個(gè)參數(shù)的構(gòu)造方法,僅僅初始化員工的編號(hào)、姓名和工資 employeeNo = employeeNextNo+; employeeName = nam
21、e; employeeSalary = initSalary; ,4.2.5在子類中使用構(gòu)造方法 子類不能繼承父類的構(gòu)造方法。 子類在創(chuàng)建新對(duì)象時(shí),依次向上尋找其基類,直到找到最初的基類,然后開始執(zhí)行最初的基類的構(gòu)造方法,再依次向下執(zhí)行派生類的構(gòu)造方法,直至執(zhí)行完最終的擴(kuò)充類的構(gòu)造方法為止。 注:對(duì)于無參數(shù)的構(gòu)造方法,執(zhí)行不會(huì)出現(xiàn)問題。如果是帶參數(shù)的構(gòu)造方法,還需要做相應(yīng)的處理。 如果基類中沒有默認(rèn)構(gòu)造方法或者希望調(diào)用帶參數(shù)的基類構(gòu)造方法,就要使用關(guān)鍵字super來顯式調(diào)用基類構(gòu)造方法。 使用關(guān)鍵字super調(diào)用基類構(gòu)造方法的語句,必須是子類構(gòu)造方法的第一個(gè)可執(zhí)行語句。 調(diào)用基類構(gòu)造方法時(shí)傳遞
22、的參數(shù)不能是關(guān)鍵字this或當(dāng)前對(duì)象的非靜態(tài)成員。,【例4-4】子類中使用構(gòu)造方法的實(shí)例。 /* 程序功能描述:在程序中聲明了父類Employee和子類CommonEmployee ,子類繼承了父類的非私有的屬性和方法,但父子類計(jì)算各自的工資的方法不同,如父類對(duì)象直接獲取工資,而子類在底薪的基礎(chǔ)上增加獎(jiǎng)金數(shù)為工資總額,通過子類的構(gòu)造方法中super的調(diào)用類初始化父類的對(duì)象,并調(diào)用繼承父類的方法toString()輸出員工的基本信息。*/,文件名: test_constructor.java,4.3.1 多態(tài)性的體現(xiàn) 在java語言中,多態(tài)性體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài)
23、)和方法覆蓋實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài))。 靜態(tài)多態(tài)性是在編譯的過程中確定同名操作的具體操作對(duì)象的,而動(dòng)態(tài)多態(tài)性則是在程序運(yùn)行過程中動(dòng)態(tài)地確定操作所針對(duì)的具體對(duì)象的。這種確定操作具體對(duì)象的過程就是聯(lián)編(binding),也稱為動(dòng)態(tài)綁定。,4.3 多態(tài)性,4.3.2 靜態(tài)多態(tài)性 靜態(tài)多態(tài)性是在編譯的過程中確定同名操作的具體操作對(duì)象的。下面的代碼體現(xiàn)了編譯時(shí)的多態(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動(dòng)態(tài)多態(tài)性 和靜態(tài)聯(lián)編相對(duì)應(yīng),如果聯(lián)編工作在程序運(yùn)行階段完成,則稱為動(dòng)態(tài)聯(lián)編。在編譯、連接過程中無法解決的聯(lián)編問題,要等到程序開始運(yùn)行之后再來確定。 如果父類的引用指向一個(gè)子類對(duì)象時(shí),當(dāng)調(diào)用一個(gè)方法完成某個(gè)功能時(shí),程序會(huì)動(dòng)態(tài)地(在執(zhí)行時(shí))選擇正確的子類的同樣方法去實(shí)現(xiàn)該功能,就稱為動(dòng)態(tài)方法綁定。,下面動(dòng)態(tài)方法調(diào)用的簡(jiǎn)單例子。 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父類對(duì)象與子類對(duì)象間的指代使用和轉(zhuǎn)化 this和super關(guān)鍵字是常用來指代父類對(duì)象與子類 對(duì)象的關(guān)鍵字。 1.this關(guān)鍵字 this表示的是當(dāng)前對(duì)象本身,更準(zhǔn)確地說,this代表了當(dāng)前對(duì)象的一個(gè)引用。對(duì)象的引用可以理解為對(duì)象的另一個(gè)名字,通過引用可以順利地訪問對(duì)象,包括修改對(duì)象的屬性、調(diào)用對(duì)象的方法。 2.super關(guān)鍵字 super表示的是當(dāng)前對(duì)象的直接父類對(duì)象,是當(dāng)前對(duì)象的直接父類對(duì)象的引用。所謂直接父類是相對(duì)于當(dāng)前對(duì)象的其他“祖先”而言的。, 通過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)造方法,完成對(duì)屬性值
28、的初始化 , 方法覆蓋后,通過super關(guān)鍵字調(diào)用父類的方法 public class Student extends Person public void showInfo() super.showInfo(); System.out.println(,你的英語成績(jī)是:+engScore+, JAVA成績(jī)是:+javaScore); 3. 父類對(duì)象與子類對(duì)象的轉(zhuǎn)化 假設(shè)B類是A類子類或間接子類,當(dāng)我們用子類B創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象的引用賦給A類的對(duì)象: A a; B b=new B(); a = b; 稱這個(gè)A類對(duì)象:a是子類對(duì)象b的上轉(zhuǎn)型對(duì)象. 子類對(duì)象可以賦給父類對(duì)象,但指向子類的父
29、類對(duì)象,不能操作子類新增的成員變量,不能使用子類新增的方法。 上轉(zhuǎn)型對(duì)象可以操作子類繼承或隱藏成員變量,也可以使用子類繼承的或重寫的方法。 可以將對(duì)象的上轉(zhuǎn)型對(duì)象再強(qiáng)制轉(zhuǎn)換到一個(gè)子類對(duì)象,該子類對(duì)象又具備了子類所有屬性和功能。 如果子類重寫了父類的方法,那么重寫方法的調(diào)用原則如下:Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例,來決定調(diào)用哪個(gè)方法。 對(duì)子類的一個(gè)實(shí)例,如果子類重寫了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。 總之,父類對(duì)象和子類對(duì)象的轉(zhuǎn)化需要注意如下原則: 子類對(duì)象可以被視為是其父類的一個(gè)對(duì)象。 父類對(duì)象不能被當(dāng)作是其某一個(gè)
30、子類的對(duì)象。 如果一個(gè)方法的形式參數(shù)定義的是父類對(duì)象,那么調(diào)用這個(gè)方法時(shí),可以使用子類對(duì)象作為實(shí)際參數(shù)。,Java語言中,用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫做抽象類。抽象類只關(guān)心它的子類是否具有某種功能,并不關(guān)心該功能的具體實(shí)現(xiàn),功能的具體行為由子類負(fù)責(zé)實(shí)現(xiàn)的。一個(gè)抽象類中可以有一個(gè)或多個(gè)抽象方法。 4.4.1 抽象類的定義 抽象類的一般格式: abstract class ClassName /類實(shí)現(xiàn) 如abstract class ClassOne /類實(shí)現(xiàn) ,4.4 抽象類,一旦ClassOne類聲明為抽象類,則它不能被實(shí)例化,只能用作派生類的基類而存在。下面的語句會(huì)產(chǎn)生編
31、譯錯(cuò)誤: ClassOne a = new ClassOne(); 抽象方法的一般格式: abstract 返回值類型 抽象方法( 參數(shù)列表 ); 如語句public abstract void Method(); 抽象方法的一個(gè)主要目的就是為所有子類定義一個(gè)統(tǒng)一的接口,抽象方法必須被重寫。 抽象類必須被繼承,抽象方法必須被重寫。抽象方法只需聲明,無需實(shí)現(xiàn);抽象類不能被實(shí)例化,抽象類不一定要包含抽象方法。若類中包含了抽象方法,則該類必須被定義為抽象類。,抽象類有以下的定義規(guī)則: 抽象類必須用abstract關(guān)鍵字來修飾;抽象方法也必須用abstract來修飾。 抽象類不能被實(shí)例化,也就是不能用
32、new關(guān)鍵字去產(chǎn)生對(duì)象。 抽象方法只需聲明,而不需實(shí)現(xiàn)。 含有抽象方法的類必須被聲明為抽象類,抽象類的子類必須覆蓋所有的抽象方法后才能被實(shí)例化,否則這個(gè)子類還是個(gè)抽象類。,具體實(shí)現(xiàn)可參考下面兩段的代碼。 (1)抽象類的基本實(shí)現(xiàn)方法 abstract class Base int basevar; / 成員變量 public abstract void M1(); / 抽象的成員函數(shù),只有聲明,沒有集體的實(shí)現(xiàn),、/必須在該類的子類實(shí)現(xiàn)方法 . class Derived extends Base int derivedvars; / 成員變量 public void M1() /子類必須重寫父類
33、的抽象成員函數(shù)M1 / 實(shí)際實(shí)現(xiàn)的語句體 . ,(2)繼承于抽象類的類一般應(yīng)該實(shí)現(xiàn)抽象類中的所有抽象方法(重寫)。如果沒有,那么該派生類也應(yīng)該聲明為抽象類。 abstract class A public abstract void MethodA(); class B extends A /錯(cuò)誤,子類B沒有實(shí)現(xiàn)對(duì)象父類A中抽象方法MethodA /的重寫,一次B類應(yīng)聲明為抽象類 public void MethodB() class C extends A public void MethodA() 。,4.4.2 抽象類的使用 下面給出一個(gè)抽象類的使用,體會(huì)一下抽象類和抽象方法的定義,以及
34、子類怎樣實(shí)現(xiàn)對(duì)父類抽象方法的重寫。 【例4-5】抽象類的使用實(shí)例。 /*程序功能介紹:Shape類是對(duì)現(xiàn)實(shí)世界形狀的抽象,子類Rectangle和子類Circle是Shape類的兩個(gè)子類,分別代表現(xiàn)實(shí)中兩種具體的形狀。在子類中根據(jù)不同形狀自身的特點(diǎn)計(jì)算不同子類對(duì)象的面積。*/,文件名: test_shape .java,接下來,再給一個(gè)較為復(fù)雜的實(shí)例,它體現(xiàn)了java中多態(tài)性的特點(diǎn),大家可細(xì)細(xì)體會(huì)。 【例4-6】多態(tài)性的使用實(shí)例。 /*程序功能介紹:多態(tài)性實(shí)現(xiàn)的工資系統(tǒng)中的一部分程序。Employee類是抽象的員工父類,Employee類的子類有經(jīng)理Boss,每星期獲取固定工資,而不計(jì)工作時(shí)間
35、;子類普通雇員CommissionWorker類,除基本工資外還根據(jù)每周的銷售額發(fā)放浮動(dòng)工資等。子類Boss和CommissionWorker聲明位final,表明它們不再派生新的子類。*/,文件名: test_abstract .java,4.5.1 java中的包 一個(gè)包就是一些提供訪問保護(hù)和命名空間管理的相關(guān)類與接口的集合。使用包的目的就是使類容易查找使用, 防止命名沖突, 以及控制訪問。標(biāo)準(zhǔn)Java庫被分類成許多的包,其中包括java.io、javax.swing和等等。標(biāo)準(zhǔn)Java包是分層次的。就像在硬盤上嵌套有各級(jí)子目錄一樣,可以通過層次嵌套組織包。所有Java包都在Java和Ja
36、vax包層次內(nèi)。,4.5 包與接口,1定義包 包聲明的一般形式: package pkg.pkg1.pkg2; 說明: package 說明包的關(guān)鍵字 pkg 包名 定義包的語句必須放在所有程序的最前面。也可以沒有包,則當(dāng)前編譯單元屬于無名包,生成的class文件放在在一般與.java文件同名的目錄下。package名字一般用小寫。如下創(chuàng)建包的語句: package employee ; package employee .commission ; 創(chuàng)建包就是在當(dāng)前文件夾下創(chuàng)建一個(gè)子文件夾,以便存放這個(gè)包中包含的所有類的 .class文件。上面的第二個(gè)創(chuàng)建包的語句中的符號(hào)“.”代表了目錄分隔符
37、,即這個(gè)語句創(chuàng)建了兩個(gè)文件夾。第一個(gè)是當(dāng)前文件夾下的子文件夾employee ;第二個(gè)是employee下的子文件夾commission,當(dāng)前包中的所有類就存放在這個(gè)文件夾里。,2向包添加類 要把類放入一個(gè)包中,必須把此包的名字放在源文件頭部,并且放在對(duì)包中的類進(jìn)行定義的代碼之前。例如,在文件Employee.java的開始部分如下: package myPackage; public class Employee 則創(chuàng)建的Employee類編譯后生成的Employee.class存放在子目錄myPackage下。 3包引用 通常一個(gè)類只能引用與它在同一個(gè)包中的類。如果需要使用其他包中的pub
38、lic類,則可以使用如下的幾種方法。 (1)直接使用包名、類名前綴 一個(gè)類要引用其他的類,無非是繼承這個(gè)類或創(chuàng)建這個(gè)類的對(duì)象并使用它的域、調(diào)用它的方法。對(duì)于同一包中的其他類,只需在要使用的屬性或方法名前加上類名作為前綴即可;對(duì)于其他包中的類,則需要在類名前綴的前面再加上包名前綴。例如: employee.Employee ref = new employee.Employee();,/ employee為包名 (2)加載包中單個(gè)的類。用import語句加載整個(gè)類到當(dāng) 前程序中,在java程序的最前方加上下面的語句 import employee.Employee; Employee ref =
39、 new Employee();/創(chuàng)建對(duì)象 (3)加載包中多個(gè)類。用import語句引入整個(gè)包,此時(shí) 這個(gè)包中的所有類都會(huì)被加載到當(dāng)前程序中。加載整個(gè)包的import語句可以寫為: import employee . *; /加載用戶自定義的 employee包中的所有類 4. 編譯和運(yùn)行包 1. CLASSPATH 我們?cè)赋隽薈LASSPATH環(huán)境變量的設(shè)置是告訴Java在哪里能找到第三方提供的類庫。 2. 編譯 編譯的過程和運(yùn)行的過程大同小異, 只是一個(gè)是找出來編譯, 另一個(gè)是找出來裝載。 javac d d:userchap04 packTest.java 3. 運(yùn)行 d:userch
40、ap04 java test.packTest,5. Jar包 把開發(fā)好的程序交給用戶就叫發(fā)布。JDK中有一個(gè)實(shí)用工具jar.exe可以完成打包工作。打包好的文件擴(kuò)展名一般為jar,所以叫JAR文件。通過編輯一個(gè)manifest.mf的文件來實(shí)現(xiàn)的。 manifest.mf文件應(yīng)該包含以下一行內(nèi)容: Main-Class: 主類的完整名稱 如:Main-Class: com.misxp.PackageExercise 這一行后面必須回車換行,否則可能出錯(cuò)。另外,冒號(hào)后面必須空一格。這個(gè)文件必須和字節(jié)碼文件放在同一目錄中。使用工具jar.exe可以創(chuàng)建可執(zhí)行的JAR文件。進(jìn)入命令行狀態(tài) 讓字節(jié)碼
41、所在文件夾成為當(dāng)前文件夾 執(zhí)行以下命令:jar cvmf manifest.mf jarfilename.jar com就可以得jarfilename.jar打包文件。Jarfilename名字可以自己取。雙擊jarfilename.jar就可以運(yùn)行程序。,6. JDK中的常用包 java.lang-包含一些Java語言的核心類,如String 、Math、Integer、System和Thread,提供常用功能。 2. java.awt-包含了構(gòu)成抽象窗口工具集(abstract window toolkits)的多個(gè)類,這些類被用來構(gòu)建和管理 應(yīng)用程序的圖形用戶界面(GUI)。 3. ja
42、va.applet-包含applet運(yùn)行所需的一些類。 4. -包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類。 5. java.io-包含能提供多種輸入/輸出功能的類。 6. java.util-包含一些實(shí)用工具類,如定義系統(tǒng)特性、使用與日期日歷相關(guān)的函數(shù)。,4.5.2 java中的接口 由于Java只支持單一繼承,接口是Java實(shí)現(xiàn)多重繼承功能的一種手段,一種結(jié)構(gòu)。接口只定義了與外界交流時(shí)輸入、輸出的格式。換句話說,通過在接口中定義一些方法(抽象方法),可以用接口大致規(guī)劃出類的共同行為,而把具體的實(shí)現(xiàn)留給具體的類。 如果一個(gè)抽象類中的所有方法都是抽象的,我們就可以將這個(gè)類用另外一種方式來定義,也就是接口定義
43、。接口是抽象方法和常量值的定義的集合,從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)。,1. 接口聲明 接口聲明的一般格式: public interface 接口名 / 常量 /方法聲明 常量定義部分定義的常量均具有public、static和final屬性。 接口中只能進(jìn)行方法的聲明,不提供方法的實(shí)現(xiàn),在接口中聲明的方法具有public和abstract屬性。如 public interface PCI final int voltage ; public void start(); public void stop(); 。,2. 接口實(shí)現(xiàn)
44、 接口可以由類來實(shí)現(xiàn),類通過關(guān)鍵字implements 聲明自己使用一個(gè)或多個(gè)接口。所謂實(shí)現(xiàn)接口,就是實(shí)現(xiàn)接口中聲明的方法。 class 類名 extends 基類 implements 接口,接口 / 成員定義部分 接口中的方法被默認(rèn)是public ,所以類在實(shí)現(xiàn)接口方法時(shí),一定要用public 來修飾。 如果某個(gè)接口方法沒有被實(shí)現(xiàn),實(shí)現(xiàn)類中必須將它聲明為抽象的,該類當(dāng)然也必須聲明為抽象的。如 interface IMsg void Message(); public abstract class MyClass implements IMsg public abstract void Me
45、ssage(); 【例4-7】接口實(shí)現(xiàn)的實(shí)例。,文件名: test_interface1.java,【例4-8】接口實(shí)現(xiàn)的實(shí)例。 /*程序功能:模擬現(xiàn)實(shí)世界的計(jì)算機(jī)組裝功能。定義計(jì)算機(jī)主板的PCI類,模擬主板的pci通用插槽,有兩個(gè)方法-start(啟用)和stop(停用)。接下來聲明具體的子類聲卡類SoundCard和網(wǎng)卡類NetworkCard,它們分別實(shí)現(xiàn)PCI接口中的start和stop方法,從而實(shí)現(xiàn)PCI標(biāo)準(zhǔn)的不同部件的組裝和使用。*/,文件名: Assembler.java,J ava支持在一個(gè)類中定義另一個(gè)類中,稱為嵌套類。在大多數(shù)情況下,嵌套類( 靜態(tài)的嵌套類除外)就是內(nèi)部類(
46、inner class)。這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。 內(nèi)部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內(nèi)部類聲明對(duì)象,作為外嵌類的成員。 內(nèi)部類具有自己的成員變量和成員方法。通過建立內(nèi)部類的對(duì)象,可以存取其成員變量和調(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),在外部引用它時(shí)必須給出完整的名稱。 Java將內(nèi)部類作為外部類的一個(gè)成員,就如同成員變量和成員方法一樣。因此外部類與內(nèi)部類的訪問原則是:在外部類中,通過一個(gè)內(nèi)部類的對(duì)象引用內(nèi)部類中的成員;反之,在內(nèi)部類中可以直接引用它的外部類的成員,包括靜態(tài)成員、實(shí)例成員及私有成員。 【例4-9】?jī)?nèi)部類和外部類之間的訪問 /*本例的類GroupTwo中聲明了內(nèi)部類Student,在內(nèi)部類Student中構(gòu)造方法存取了外部類GroupTwo的成員變量count。*/,4.6 內(nèi)部類,文件名: GroupTwo.java
48、,匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創(chuàng)建時(shí),作為new語句的一部分來聲明它們。 要采用另一種形式的new語句,如下所示: new 這種形式的new語句聲明一個(gè)新的匿名類,它對(duì)一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。它還創(chuàng)建那個(gè)類的一個(gè)新實(shí)例,并把它作為語句的結(jié)果而返回。要擴(kuò)展的類和要實(shí)現(xiàn)的接口是new語句的操作數(shù),后跟匿名類的主體。下面給一個(gè)匿名類的使用。,4.7 匿名類,abstract class Animal public abstract void cry(); class TestCry public void testCry(Animal animal)/ 通
49、過Animal對(duì)象的傳遞模擬不同動(dòng)物叫聲 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為我們提供的兩個(gè)出色的工具。它們提供了更好的封裝,結(jié)果就是使代碼更容易理解和維護(hù),使相關(guān)的類都能存在于同一個(gè)源代碼文件中(這要?dú)w功于內(nèi)部類),并能避免一個(gè)程序產(chǎn)生大量非常小的類(這要?dú)w功于匿名類)。,本章主要介紹了java中繼承的定義和如何實(shí)現(xiàn)的。子類繼承了父類的功能,并根據(jù)具體需要來添加功能體需要來添加功能。 多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計(jì)的另一個(gè)重要,它與封裝性和繼承性一起構(gòu)成了面向?qū)ο蟪绦蛟O(shè)計(jì)的三
51、大特性。本章也重點(diǎn)介紹了java中多態(tài)性的定義和實(shí)現(xiàn)。 由于在java中不支持多重繼承的概念,因此引入了接口的概念。本章也著重介紹了java中接口的概念,并通過一實(shí)例驗(yàn)證了接口的重要性。,本章小結(jié),class Teacher private String name; / 教師姓名 private String school; / 所在學(xué)校 public Teacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLesson() /授課方法的具體實(shí)現(xiàn) System.out.p
52、rintln(知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問); public void introduction() /自我介紹方法的具體實(shí)現(xiàn) System.out.println(大家好!我是“ + school + 的 + name + 。); ,例4-1】 自定義父類Teacher,創(chuàng)建其兩個(gè)子類JavaTeacher和DotNetTeacher。,class JavaTeacher extends Teacher public JavaTeacher(String myName, String mySchool) super(myName, mySchool); pu
53、blic void giveLesson() System.out.println(啟動(dòng) MyEclipse); super.giveLesson(); class DotNetTeacher extends Teacher public DotNetTeacher(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動(dòng) VS2010); super.giveLesson(); ,public class test_teacher public
54、 static void main(String args) /聲明javaTeacher JavaTeacher javaTeacher = new JavaTeacher(李偉,鄭州輕工業(yè)學(xué)院); javaTeacher.giveLesson(); javaTroduction(); System.out.println(n); /聲明dotNetTeacherTeacher DotNetTeacher dotNetTeacher = new DotNetTeacher(王珂,鄭州工業(yè)學(xué)院); dotNetTeacher.giveLesson(); dotNetTeac
55、roduction(); 程序運(yùn)行結(jié)果如圖所示:,【例4-2】自定義父類Person,創(chuàng)建其子類SubStudent。程序運(yùn)行結(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+同學(xué)+ 年齡為:+age+英語成績(jī)是: +engScore+, 你的JAVA成績(jī)是:+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è)學(xué)院,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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商標(biāo)侵權(quán)和解協(xié)議書
- 2025企業(yè)公司個(gè)人述職競(jìng)聘
- 四至界線協(xié)議書(2篇)
- 三年級(jí)上冊(cè)萬以內(nèi)的數(shù)加減法豎式計(jì)算200道及答案
- 2024弱電施工合同范本弱電設(shè)備工程合同范本
- XX礦業(yè)有限公司環(huán)境監(jiān)測(cè)管理制度
- 2023年西安藤信學(xué)校招聘考試真題
- 2023年祁連縣藏醫(yī)院招聘編外衛(wèi)生專業(yè)技術(shù)人員考試真題
- 日本人與日本社會(huì)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 新聞采訪與寫作學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- MOSFET功率器件行業(yè)內(nèi)各類產(chǎn)品市場(chǎng)份額分析
- 四年級(jí)英語 Where is the wind 全國獲獎(jiǎng)
- 智能靜脈用藥配置(riva)機(jī)器人介紹
- 統(tǒng)計(jì)學(xué)課件第七章假設(shè)檢驗(yàn)
- 旅行社計(jì)調(diào)業(yè)務(wù)
- 組態(tài)王與MySQL數(shù)據(jù)庫連接配置教程-20190807
- 《AP統(tǒng)計(jì)學(xué)講義》課件
- 一 《展示國家工程 了解工匠貢獻(xiàn)》(教學(xué)設(shè)計(jì))-【中職專用】高二語文精講課堂(高教版2023·職業(yè)模塊)
- 服裝設(shè)計(jì)與工藝專業(yè)調(diào)研報(bào)告
- 血糖儀市場(chǎng)推廣活動(dòng)方案
- 《機(jī)械基礎(chǔ)(第七版)》期末考試復(fù)習(xí)題庫(含答案)
評(píng)論
0/150
提交評(píng)論