數(shù)字化學習系統(tǒng)-06_第1頁
數(shù)字化學習系統(tǒng)-06_第2頁
數(shù)字化學習系統(tǒng)-06_第3頁
數(shù)字化學習系統(tǒng)-06_第4頁
數(shù)字化學習系統(tǒng)-06_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java開發(fā)初步開發(fā)初步第九講第九講一、面向對象的概念一、面向對象的概念Thinking in JavaThinking in Object通過Java語言來介紹面向對象程序設計,培養(yǎng)面向對象的思維,掌握其方法、原理與機制,具備一定的面向對象設計、開發(fā)能力。為后續(xù)課程及大型軟件的設計與工程實現(xiàn)打下基礎。國家數(shù)字化學習工程技術研究中心2所謂面向對象的方法,就是使我們分析、設計和實現(xiàn)一個系統(tǒng)的方法盡可能自然地使用我們在生活中用到的以對象為中心的思想,分析、認識、設計一個系統(tǒng)的方法。包括:面向對象的分析(OOA, Object-Oriented Analysis) 面向對象的設計(OOD, Obje

2、ct-Oriented Design)面向對象的程序設計(OOP, Object-Oriented Program)面向對象技術主要圍繞以下幾個概念討論:對象的封裝(抽象數(shù)據(jù)類型)、類與對象、 繼承性、多態(tài)性。國家數(shù)字化學習工程技術研究中心3對象(Object) 有兩個層次的概念:現(xiàn)實生活中對象指的是客觀世界的實體,它由狀態(tài)(State)和行為(Behavior)構成 ;程序中對象是現(xiàn)實世界對象的模型,是一組變量和相關方法的集合。變量(Variables)表示現(xiàn)實對象的狀態(tài),方法(Methods)表現(xiàn)現(xiàn)實世界對象的行為,這些變量和方法叫做這個對象的成員(Member)。國家數(shù)字化學習工程技術研

3、究中心4變量方法可將現(xiàn)實生活中的對象經(jīng)過抽象,映射為程序中的對象。對象在程序中通過一種抽象數(shù)據(jù)類型來描述,就稱為類(Class)。國家數(shù)字化學習工程技術研究中心5現(xiàn)實生活中的對象Class Car int color_number; int door_number; int speed; void brake() void speedUp() void slowDown() 抽象數(shù)據(jù)類型類(Class)類是描述對象的“基本原型”,它定義一類對象所能擁有的數(shù)據(jù)和能完成的操作。在面向對象的程序設計中,類是程序的基本單元。相似的對象可以歸并到同一個類中去,就像傳統(tǒng)語言中的變量與數(shù)據(jù)類型關系一樣。對象

4、程序中的對象是類的一個實例,是一個軟件單元,它由一組結構化的數(shù)據(jù)和在其上的一組操作構成。國家數(shù)字化學習工程技術研究中心6一個例子在程序中操作對象是類的一個實例:創(chuàng)建一個對象: Hello obj=new Hello();調(diào)用方法: obj.showString();國家數(shù)字化學習工程技術研究中心7class Hello private String s;public void showString() System.out.println(s);public void changeString(String str) s = str; 變量方法showString()方法changeStrin

5、g()封裝(Encapsulation )封裝把對象的所有組成部分組合在一起。封裝定義程序如何引用對象的數(shù)據(jù),實際上是用方法將類的數(shù)據(jù)隱藏起來,控制用戶對類的修改和訪問數(shù)據(jù)的程度。封裝有利于程序模塊化和信息隱藏。 國家數(shù)字化學習工程技術研究中心8對象A對象B私有數(shù)據(jù) 方法 方法數(shù)據(jù)公有數(shù)據(jù)子類(Subclass)子類是作為另一個類的擴充或修正而定義的一個類。國家數(shù)字化學習工程技術研究中心9Bicycle(Super class)Mountain bikesRacing bikesTandem bikesSubclass繼承(Inheritance)一個類從另一個類派生出來的過程叫繼承。這個類叫

6、子類(派生類),而被繼承的類叫該類的超類(父類)繼承的子類可利用父類中定義的方法和變量,就像它們屬于子類本身一樣。也可以改變繼承來的方法和變量。國家數(shù)字化學習工程技術研究中心10class Car int color_number; int door_number; int speed; public void push_break() public void add_oil() class Trash_Car extends Car double amount; public void fill_trash() 方法的覆蓋(override)在子類中重新定義父類中已有的方法。國家數(shù)字化學習工

7、程技術研究中心11class Car int color_number; int door_number; int speed; public void push_break() speed = 0; public void add_oil() class Trash_Car extends Car double amount; public void fill_trash() public void push_break() speed = speed 10; 方法的重載(Overload)同一個類中至少有兩個方法用同一個名字,但有不同的參數(shù)列表。使用重載方法時,Java編譯器根據(jù)傳遞給這個

8、參數(shù)的數(shù)目和類型確定正確的方法。重載實現(xiàn)了對象的多態(tài)特性。多態(tài)性的特點大大提高了程序的抽象度和簡潔性。國家數(shù)字化學習工程技術研究中心12類void show(int int_num)void show(double double_num)void show(int int_num, float float_num)1231.23123,1.23二、類與對象二、類與對象Java的類分為兩大部分:系統(tǒng)定義的類和用戶自定義類。學習Java語言在某種程度上就是在:學習如何定義所需要的類,即學習Java程序的書寫規(guī)范,熟悉和掌握語法規(guī)則;熟悉Java平臺定義了哪些經(jīng)常要用到、而且滿足我們需要的類。Jav

9、a的類庫就是系統(tǒng)定義的類,它是系統(tǒng)提供的已實現(xiàn)的標準類的集合,提供了Java程序與運行它的系統(tǒng)軟件(Java虛擬機)之間的接口。國家數(shù)字化學習工程技術研究中心13用面向對象的觀點來看,世界上的一切事物都是對象。而物以“類”聚,所以這些對象可以劃分成各種“類”。按照面向對象的觀點,一個類分為狀態(tài)和行為兩部分,再加上類名這一部分,可以把一個類的定義分為3個部分:IS,HAS,DOES。其具體含義是:IS 說明該類“是”什么樣的一個類,即說明類的名字及其性質,如一個類的父類、修飾符等,這一部分稱為類聲明。HAS 說明這個類“有”些什么特征及屬性,這些特征和屬性用域變量來表示,這一部分統(tǒng)稱為成員變量。

10、DOES 說明這個類可以“做”什么,即這個類有哪些行為,這些行為用實例方法和類方法描述,這些方法統(tǒng)稱為成員方法。國家數(shù)字化學習工程技術研究中心14IS和HAS部分構成了一個類的狀態(tài),DOES就是一個類的行為,行為通過成員方法(Member Method)來實現(xiàn)。這樣,定義一個類的基本形式為:class 類名 / IS 成員變量;/ HAS 成員方法;/ DOESclass是聲明一個類的關鍵字,類名是要聲明的類的名字,它必須是一個合法的Java標識符,習慣上用大寫字母開頭。國家數(shù)字化學習工程技術研究中心15國家數(shù)字化學習工程技術研究中心16類修飾符是下列之一: public | abstract

11、 | final public 該關鍵字聲明的類可以在其他的任何類中使用。默認時,該類只能被同一個程序包中其他的類使用。abstract 抽象類,沒有具體對象的概念類,沒有具體實現(xiàn)功能,只用于擴展子類。例如:“鳥”,它可以派生出“鴿子”、“燕子”等具體類。final 最終類,表示該類已經(jīng)非常具體,沒有子類可擴展。國家數(shù)字化學習工程技術研究中心17訪問控制符public:任何其它類、對象只要可以看到這個類的話,那么它就可以存取變量的數(shù)據(jù),或使用方法。Dinner.java protected:同一類,同一包可以使用。不同包的類要使用,必須是該類的子類。ChocolateChip.java pri

12、vate:不允許任何其他類存取和調(diào)用。IceCream.java default:(前邊沒有修飾字的情況)在同一包中出現(xiàn)的類才可以直接使用它的數(shù)據(jù)和方法。Cake.java國家數(shù)字化學習工程技術研究中心18類變量類變量類變量屬于類的變量和方法staticstatic 在變量或方法之前,表明它們是屬于類的,稱為類方法(靜態(tài)方法)或類變量(靜態(tài)變量)。若無static修飾,則是實例方法和實例變量。類變量在各實例間共享 ConcentricCirclesTester國家數(shù)字化學習工程技術研究中心19class ABCD char data; static int share_data;class D

13、emo ABCD a,b,c,d;object achar dataobject cchar dataObject bchar datastatic intshare_dataobject dchar data方法方法方法是類的動態(tài)屬性。對象的行為是由它的方法來實現(xiàn)的。一個對象可通過調(diào)用另一個對象的方法來訪問該對象。 與類一樣,方法也有兩個主要部分:方法首部聲明和方法體。方法聲明的基本形式為:返回類型 方法名( ) /方法體國家數(shù)字化學習工程技術研究中心20方法聲明的完整形式:方法修飾符 返回類型 方法名稱(參數(shù)1,參數(shù)2,) throws exceptionList statements;

14、/方法體:方法的內(nèi)容方法修飾符public |protected |privatestaticfinal |abstractnativesynchronized返回類型可以是任意的Java數(shù)據(jù)類型,當一個方法不需要返回值時,返回類型為void。參數(shù)的類型可以是簡單數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型(數(shù)組、類或接口),參數(shù)傳遞方式是值傳遞。方法體是對方法的實現(xiàn)。它包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域只在該方法內(nèi)部。國家數(shù)字化學習工程技術研究中心21創(chuàng)建對象與構造函數(shù)創(chuàng)建對象與構造函數(shù)1. 對象聲明像聲明基本類型的變量一樣,對象聲明的一般形式為類名 對象名;2. 為對象分配內(nèi)

15、存及初始化分配內(nèi)存及初始化形式如下:對象名= new 構造方法名(參數(shù)表);創(chuàng)建對象首先需說明新建對象所屬的類,由與類同名的構造方法給出;然后要說明新建對象的名字,即賦值號左邊的對象名;賦值號右邊的new是為新建對象開辟內(nèi)存空間的運算符,用new運算符開辟新建對象的內(nèi)存之后,系統(tǒng)自動調(diào)用構造方法初始化該對象。若類中沒有定義構造方法,系統(tǒng)會調(diào)用默認的構造方法。 國家數(shù)字化學習工程技術研究中心22國家數(shù)字化學習工程技術研究中心23class Car int car_number; void set_number(int car_num) car_number=car_num; void show_

16、number() System.out.println (My car No. is : +car_number); class CarDemo public static void main(String args) Car Democar=new Car(); DemoCar.set_number(6868); DemoCar.show_number(); 程序包程序包程序包(package)由于Java編譯器為每個類生成一個字節(jié)碼文件,且文件名與類名相同,因此同名的類有可能發(fā)生沖突。為了解決這一問題,Java提供包來管理類名空間。如同目錄是文件的松散的集合一樣,包是類和接口的一種松散集合

17、。一般并不要求處于同一個包中的類或者接口之間有明確的聯(lián)系,如包含、繼承等關系,但是由于同一包中的類在默認情況下可以互相訪問,所以為了方便編程和管理,通常需要把相關的或在一起協(xié)同工作的類和接口放在一個包里。 國家數(shù)字化學習工程技術研究中心24打包Java中用package語句來將一個Java源文件中的類打成一個包。package語句作為Java源文件的第一條語句,指明該文件中定義的類所在的包。(若缺省該語句,則指定為無名包)。它的格式為: package pkg1.pkg2.pkg3;Java編譯器把包對應于文件系統(tǒng)的目錄管理,package語句中,用 . 來指明目錄的層次。國家數(shù)字化學習工程技

18、術研究中心25package myclass.graphics; 這條語句指定這個包中的類生成的類文件存儲在目錄 myclass/graphics 下。包層次的根目錄要在編譯該程序時用-d 來確定的。 javac d path Square.java國家數(shù)字化學習工程技術研究中心26/Square.javapackage myclass.graphics;class Square ;class Circle ;class Triangle ;myclasspathSquaregraphics我們可以編寫自己的類,也可以使用由系統(tǒng)提供的類庫。下面列出了一些常用的Java包:java.lang 基

19、本語言類,程序運行時自動引入java.io 所有的輸入輸出類java.util 實用的數(shù)據(jù)類型類java.awt 構建圖形用戶界面(GUI)的類java.awt.image 處理和操縱網(wǎng)上圖片的工具類java.awt.peer 實現(xiàn)與平臺無關的GUI的類java.applet 實現(xiàn)Java Applet的工具類 實現(xiàn)網(wǎng)絡功能的類國家數(shù)字化學習工程技術研究中心27為了能使用Java中已提供的類,我們需要用import語句來引入所需要的類。import package1.package2. (classname |*);例如:import myclass.graphics.*;import jav

20、a.io.*;國家數(shù)字化學習工程技術研究中心28使用包中的類可以通過以下3種方法之一進行:1. 裝載整個包 利用import 語句載入整個包。例如: import graphicPackage.*;該語句必須位于源程序中的任何類和接口定義之前。2. 裝載一個類或接口有時只需要某個包中的一個類或接口,無需裝載整個包。例如: import graphicPackage.Circle;3. 直接使用包名作類名的前綴如果沒有使用import語句裝載某個包,可以直接在所需要的類名前加上包名作為前綴。例如: graplicPackage.Rectangle rectG;國家數(shù)字化學習工程技術研究中心29繼

21、承與多態(tài)繼承與多態(tài)繼承是面向對象程序設計方法中實現(xiàn)軟件重用的一種重要手段,通過繼承可以更有效地組織程序結構,明確類之間的關系,并充分利用已有的類來創(chuàng)建新類,通過繼承可以實現(xiàn)代碼的重用,以完成更復雜的設計、開發(fā)。多態(tài)則可以統(tǒng)一多個相關類的對外接口,并在運行時根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性。30子類、父類與繼承機制子類、父類與繼承機制繼承的概念在類的定義過程中,繼承是一種由已有的類創(chuàng)建新類的機制。繼承而得到的類為子類,被繼承的類為父類,父類包括所有直接或間接被繼承的類。在類的聲明中加入extends子句就可以創(chuàng)建一個類的子類:class SubClass extends Su

22、perClass Java中不通過extends關鍵字支持多重繼承,即extends之后只能有唯一的父類。如果缺省extends子句,則該類為java.lang.Object的子類。子類可以繼承父類中訪問權限設定為public、 protected和包可訪問的成員變量和方法,但是不能繼承訪問權限為private的成員變量和方法。31繼承的概念一個父類可以同時擁有多個子類,而每一個子類則只能有唯一的父類。子類是對公共域和方法在功能、內(nèi)涵方面的擴展和延伸。父類、子類間的關系具有:共享性 即子類可以共享父類的公共域和方法。差異性 即子類和父類一定會存在某些差異,否則就應該是同一個類。層次性 即由Ja

23、va規(guī)定的單繼承性,每個類都處于繼承關系中的某一個層面。32類的層次Java語言中的類是有嚴格的層次結構的。除Object類之外,每個類都繼承惟一的父類。這種繼承性性質使得類的層次結構形成了一種樹狀結構。Object類定義和實現(xiàn)了Java系統(tǒng)所需要的眾多類的共同行為,它是所有類的父類,也即這個樹狀結構中的根類,所有的類都是由這個類繼承、擴充而來的,這個Object類定義在java.lang包中。33繼承的實現(xiàn)繼承的實現(xiàn)子類的定義定義一個子類,即在定義一個類的時候加上extends關鍵字,并在之后帶上其父類名,其一般格式為:類的修飾符 class extends ; ; 這和前面定義類的格式并沒

24、有什么區(qū)別,只是在定義子類時“extends ”不再是可選項。何時選擇繼承?一個很好的經(jīng)驗:“B是A中的一類嗎?”如果是則讓B做A的子類34子類的定義class Point int x, y; void setXY( int i, int j) x=i; y=j; class Circle extends Point double r; double area() return 3.14*r*r ; 35子類的定義36子類的定義【例】實現(xiàn)電話類的繼承結構。為了代碼簡潔,而把注意力集中在要討論的語法機制上,這里假設移動電話僅一種,電話的計費方式為:國內(nèi)長途和國際長途話費分別是市話費的3倍和9倍。

25、 abstract class Telephone long phoneNumber; final int local_Call=1; final int distance_Call=3; final int international_Call=9; double balance ; abstract boolean charge_Mode (int call_Mode ) ; double getBalance ( ) return balance ; 37域的繼承與隱藏1. 域的繼承子類可以繼承父類的所有非私有域。例如各類電話類所包含的域 Telephone.java38Mobile_P

26、hone類long phoneNumber;int local_Call;int distance_Call;int international_Call;double balance;String networkType;Ordinary_phone類long phoneNumber;int local_Call;int distance_Call;int international_Call;double balance;double monthFee;boolean longdistanceService;boolean internationalService; IP_Phone類lo

27、ng phoneNumber;int local_Call;int distance_Call;int international_Call;double balance;double monthFee;boolearn started; Date expireDate;來自繼承父類Telephone的5個基本域來自繼承父類Fixed_Telephone 子類IP_Phone類中聲明的域域的繼承與隱藏2. 域的隱藏子類重新定義一個與從父類繼承來的域變量完全相同的變量,稱為域的隱藏。即子類中定義了與父類同名的域變量,就是子類變量對同名父類變量的隱藏。這里所謂隱藏是指子類擁有了兩個相同名字的變量,

28、一個來自繼承父類,另一個由自己定義。在這種情況下,當子類執(zhí)行繼承的父類方法時,處理的是父類的變量,而當子類執(zhí)行它自己定義的方法時,所操作的就是它自定義的變量,而把來自繼承父類的變量“隱藏”起來了。39域的繼承與隱藏40class Aclass B extends A static int data_a=3; static int data_a = 5; class C extends B void print_out() System.out.println(“data_a= ”+data_a); System.out.println(“A.data_a= ”+A.data_a); Syste

29、m.out.println(“B.data_a= ”+B.data_a); class Demo public static void main(String args) C c = new C( ); c.print_out( ); Demo.javadata_a=5A.data_a=3B.data_a=5方法的繼承與覆蓋 1. 方法的繼承父類的非私有方法可以被子類所繼承。根據(jù)方法的繼承關系,將電話類及其各子類所包含的方法列舉如下。(1)Telephone類abstract boolean charge_Mode();double getBalance();(2)Fixed_Telephon

30、e類abstract boolean charge_Mode(); /來自繼承父類Telephonedouble getBalance(); /來自繼承父類Telephone(3)Ordinary_phone類boolean charge_Mode(); double getBelance(); /來自繼承父類Fixed_Telephone41方法的繼承與覆蓋 2. 方法的覆蓋方法的覆蓋(Override)是指子類重定義從父類繼承來的一個同名方法,此時父類和子類中都存在一個同名方法,父類這個方法在子類中不復存在。這是子類通過重新定義與父類同名的方法,實現(xiàn)自身的行為。方法覆蓋時應遵循的原則:(1

31、)覆蓋后的方法不能比被覆蓋的方法有更嚴格的訪問權限。(2)覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的異常。4243class Car int color_number; int door_number; int speed; public void push_break() speed = 0; public void add_oil() class Trash_Car extends Car double amount; public void fill_trash() public void push_break() speed = speed 10; 覆蓋方法的調(diào)用對于重寫的方法,Java

32、運行時系統(tǒng)根據(jù)調(diào)用該方法的實例的類型來決定選擇哪個方法調(diào)用。成員變量的隱藏和方法的覆蓋的意義在于:通過隱藏域和覆蓋方法可以把父類的狀態(tài)和行為改為自身的狀態(tài)和行為,對外統(tǒng)一名字與接口,又不失其繼承性。44public class DemoCar public static void main( String args ) Car aCar = new Trash_Car( );aCar. push_break( ); 在這里, aCar. push_break( )調(diào)用的是類Trash_Car中的push_break( )方法將被調(diào)用。5.3 多態(tài)性多態(tài)性多態(tài)性是面向對象程序設計的又一個重要的技

33、術和手段。 多態(tài)性是指同名的不同方法在程序中共存。即為同一個方法名定義幾個版本的實現(xiàn),運行時根據(jù)不同情況執(zhí)行不同的版本。調(diào)用者只需使用同一個方法名,系統(tǒng)會根據(jù)不同情況,調(diào)用相應的不同方法,從而實現(xiàn)不同的功能。多態(tài)性又被稱為“一個名字,多個方法”。45多態(tài)性多態(tài)性多態(tài)性的概念多態(tài)性的實現(xiàn)有兩種方式:(1)覆蓋實現(xiàn)多態(tài)性通過子類對繼承父類方法的重定義來實現(xiàn)。使用時注意:在子類重定義父類方法時,要求與父類中方法的原型(參數(shù)個數(shù)、類型、順序)完全相同。(2)重載實現(xiàn)多態(tài)性在一個類中的定義多個同名方法的不同實現(xiàn)。定義方法時方法名相同,但方法的參數(shù)不同(參數(shù)的個數(shù)、類型、順序不同)。這些方法同名的原因是具

34、有類似的功能且目的相同,但在實現(xiàn)該功能的具體方式和細節(jié)方面有所不同,因此需要定義多種不同的方法體46覆蓋實現(xiàn)多態(tài)性在覆蓋實現(xiàn)多態(tài)性的方式中,子類重定義父類方法,此時方法的名字、參數(shù)個數(shù)、類型、順序完全相同,那么如何區(qū)別這些同名的不同方法呢?此時這些方法是存在不同的類層次結構中,在調(diào)用方法時只需要指明是調(diào)用哪個類(或對象)的方法,就很容易把它們區(qū)分開來,其調(diào)用形式為: 對象名.方法名 或 類名.方法名例如,IP電話的計費,若建立IP_Phone類的對象my,其調(diào)用為: my.charge_Mode();假如charge_Mode()是一個類方法,則可使用類名,其調(diào)用為: IP_Phone.cha

35、rge_Mode();475.3 多態(tài)性多態(tài)性重載實現(xiàn)多態(tài)性若通過重載來實現(xiàn)多態(tài)性,則是在同一個類中定義多個同名方法。 由于重載發(fā)生在同一個類中,不能再用類名或對象名來區(qū)分不同的方法了,所以在重載中采用的區(qū)分方法是使用不同的形式參數(shù)表,包括形式參數(shù)的個數(shù)不同、類型不同或順序的不同。例如,在重載加法add(x,y)時,整數(shù)加法的形參類型是整型,復數(shù)加法的形參類型是復數(shù)型。根據(jù)填入的參數(shù)的類型或者參量等的不同,系統(tǒng)可以確定調(diào)用哪一個加法函數(shù)來完成加法計算。 例 ReloadExample.java 48多態(tài)性舉例多態(tài)性還可以是指在程序中需要使用父類對象的地方,都可以用子類對象來代替。例如:publ

36、ic class Employee extends Objectpublic class Manager extends Employee則:Employee e = new Manager(); /合法語句49多態(tài)性舉例對象狀態(tài)的確定在Java語言中,提供了操作符instanceof用來判斷對象是否屬于某個類的實例。public void method (Employee e) if ( e instanceof Manager ) /do something as a Manager else if ( e instanceof Contractor ) /do something as

37、a Contractor else /do something else 50構造方法的繼承與重載構造方法的繼承與重載構造方法的重載構造方法的重載是指同一個類中定義不同參數(shù)的多個構造方法,以完成不同情況下對象的初始化。例如,point類可定義不同的構造方法創(chuàng)建不同的點對象。point();/未初始化坐標point(x);/初始化一個坐標point(x, y);/初始化兩個坐標一個類的若干個構造方法之間可以相互調(diào)用。當類中一個構造方法需要調(diào)用另一個構造方法時,可以使用關鍵字this,并且這個調(diào)用語句應該是該構造方法的第一個可執(zhí)行語句。51構造方法的重載對Ordinary_phone類,可以根據(jù)需

38、要定義幾個構造方法:Ordinary_phone( ) /無參數(shù)的構造方法,對象的各域置為默認初始值Ordinary_phone(boolean disService) this();/調(diào)自身的無參數(shù)的構造方法 longdistanceServicedisService; /確定是否開通國內(nèi)長途電話Ordinary_phone(boolean disService, boolean intService) this(disService); /調(diào)自身的帶一個參數(shù)的構造方法 internationalService = intService;/確定是否開通國際長途52構造方法的重載Ordinar

39、y_phone(boolean disService, boolean intService, double b) /3個參數(shù)的構造方法 this(disService, intService); /調(diào)自身的帶兩個參數(shù)的構造方法 balance =b; /設置話費金額使用this域來調(diào)用同類的其他構造方法,其優(yōu)點是可以最大限度地提高對已有代碼的利用程度,提高程序的抽象、封裝程度,以及減少程序維護的工作量。53構造方法的繼承子類可以繼承父類的構造方法,繼承的方式遵循以下原則:(1)子類無條件地繼承父類的無參數(shù)的構造方法。(2)如果子類沒有定義構造方法,則它將繼承父類的無參數(shù)構造方法作為自己的構造

40、方法;如果子類定義了構造方法,則在創(chuàng)建新對象時,將先執(zhí)行來自繼承父類的無參數(shù)構造方法,然后再執(zhí)行自己的構造方法。(3)對于父類的帶參數(shù)構造方法,子類可以通過在自己的構造方法中使用super關鍵字來調(diào)用它,但這個調(diào)用語句必須是子類構造方法的第一個可執(zhí)行語句。下面我們主要討論第2和第3點。54構造方法的繼承1. 父類與子類的構造方法的執(zhí)行順序下面給出一個簡單示意性的例子?!纠?試分析下面程序的繼承關系以及構造方法的調(diào)用順序。我們是否可以先不看執(zhí)行結果,分析構造方法執(zhí)行順序是A()、B()、C()還是C()、B()、A()? ConstructorTest.java 該例表明:在創(chuàng)建新對象時,子類

41、先執(zhí)行來自繼承父類的無參數(shù)構造方法,然后再執(zhí)行自己的構造方法。55構造方法的繼承2. 在構造方法中super關鍵字的使用super是表示父類對象的關鍵字,super表示當前對象的直接父類對象的一個引用,通過super可使用父類對象的方法或域。Fixed_Telephone( ) /無參數(shù)的構造方法Fixed_Telephone (long pn) phoneNumber = pn; /初始化電話號碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機費Fixed_Telephone(long

42、 pn, double mf, double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費的剩余金額56構造方法的繼承設計子類的構造方法可選擇如下方式:(1)僅調(diào)用父類的無參數(shù)構造方法。(2)定義自己的一個(或多個)構造方法,并調(diào)用父類的帶參數(shù)的構造方法。 57Fixed_Telephone( ) /無參數(shù)的構造方法Fixed_Telephone (long pn) phoneNumber = pn; /初始化電話號碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn;

43、monthFee = mf; /初始化座機費Fixed_Telephone(long pn, double mf, double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費的剩余金額Ordinary_phone (long pn , double mf , boolean ds) super (pn, mf); longdistanceService = ds; Ordinary_phone(long pn , double mf , double b , boolean ds) super (pn ,mf, b); /調(diào)用父類

44、三個參數(shù)的構造方法為繼承的域賦初值 longdistanceService = ds ;/用參數(shù)初始化自定義域接口接口接口(interface)也有人翻譯為界面,是用來實現(xiàn)類間多重繼承功能的一種結構。接口是在語法上與類有些相似。它定義了若干個抽象方法和常量,形成一個屬性集合,該屬性集合通常對應了某一組功能。凡是需要實現(xiàn)這種特定功能的類,都可以繼承并使用它。一個類只能直接繼承一個父類,但可以同時實現(xiàn)若干個接口。實現(xiàn)(或繼承)接口實際上就獲得了多個特殊父類的屬性,即實現(xiàn)了多重繼承。所謂多重繼承,是指一個子類可以有一個以上的直接父類,該子類可以繼承它所有父類的屬性。58接口與多繼承接口定義的僅僅是實

45、現(xiàn)某一特定功能的一組對外的協(xié)議和規(guī)范,而并沒有真正地實現(xiàn)這個功能。這些功能的真正實現(xiàn)是在繼承這個接口的各個類中完成的。因為接口包含的是未實現(xiàn)的一些抽象的方法,它與抽象類有些相象。它們之間存在以下的區(qū)別:接口不能有任何實現(xiàn)了的方法,而抽象類可以。類可以繼承(實現(xiàn))許多接口,但只能繼承一個父類。類有嚴格的層次結構,而接口沒有層次結構,沒有聯(lián)系的類可以實現(xiàn)相同的接口。 59接口的定義接口是由常量和抽象方法組成的特殊類。接口的定義包括兩個部分:接口聲明和接口體。聲明接口一般格式如下:public interface 接口名 extends 父接口名表 域類型 域名常量值; /常量域聲明 返回值 方法名

46、(參數(shù)表);/抽象方法聲明接口聲明中有兩個部分是必需的:interface關鍵字和接口的名字。用public修飾的接口是公共接口,可以被所有的類和接口使用;沒有public修飾符的接口則只能被同一個包中的其他類和接口利用。60接口的實現(xiàn)定義接口是為了讓某些類實現(xiàn)它。 類實現(xiàn)某個接口,要在類的聲明中要包括一條implements語句,并提供在接口中定義的所有抽象方法的具體實現(xiàn)。 一個類可以實現(xiàn)多個接口,可以在implements后面列出要實現(xiàn)的多個接口,這些接口以逗號分隔。public class StockApplet extends Applet implements StockWatche

47、r public void valueChanged(String tickerSymbol, double newValue) if (tickerSymbol.equals(sunTicker) else if (tickerSymbol.equals(oracleTicker) 61接口的實現(xiàn)62interface Collection int MAX_NUM=100;void add(Object obj);void delete(Object obj);Object find(Object obj);int currentCount( );class FIFOQueue implem

48、ents Collection void add ( Object obj ) void delete( Object obj ) Object find( Object obj ) int currentCount() 接口的實現(xiàn)實現(xiàn)接口時應注意的問題:(1)在類的聲明部分,用implements關鍵字聲明該類將要實現(xiàn)哪些接口。(2)類在實現(xiàn)抽象方法時,必須用public修飾符。(3)除抽象類以外,在類的定義部分必須為接口中所有的抽象方法定義方法體,且方法首部應該與接口中的定義完全一致。(4)若實現(xiàn)某接口的類是abstract的抽象類,則它可以不實現(xiàn)該接口所有的方法。但是對于這個抽象類的任何

49、一個非抽象子類,不允許存在未被實現(xiàn)的接口方法。即非抽象類中不能存在抽象方法。63接口的使用如果接口需要擴充,可以創(chuàng)建新的接口來繼承老接口。比如,可以創(chuàng)建一個StockWatcher的子接口StockTracker: public interface StockTracker extends StockWatcher void currentValue(String tickerSymbol,double newValue);也就是說,接口是共同遵守的協(xié)議,一般不要變動,若要變動就創(chuàng)建一個新的接口。接口除了被繼承和實現(xiàn)之外,還可以作為一種類型來使用。定義了一個接口,就是定義了一個新的引用數(shù)據(jù)類型

50、。在可以使用類型的名字(如變量聲明、方法參數(shù)聲明等)的地方,都可使用這個接口名。64抽象類、接口和抽象類、接口和Object類的應用類的應用假設有若干 (如1000)個Circle,Rectangle以及若干個其他形狀,希望計算它們的總面積,直截了當?shù)淖龇ㄊ菍⑺鼈兎謩e放到多個數(shù)組中,分別循環(huán)求出各形狀的面積,然后累加,這種做法是不漂亮的。如果還有其它形狀:triangle,ellipses等,上述方法顯得“累贅”。我們希望有一種統(tǒng)一的表示,例如用一個數(shù)組shape,存放所有的形狀,然后用:for (i=0; ishape.length; i+) area_total += shapei.are

51、a();求出總面積。65首先看看Circle和Rectangle兩個類66class Circle public float r; Circle(float r) this.r = r; /this指這個對象的 public float area() return 3.14*r*r; class Rectangle public float width,height; Rectangle (float w, float h) width = w; height = h; public float area() return width*height; 用抽象類實現(xiàn)多種形狀面積的累加現(xiàn)在要利用抽象類實現(xiàn)多種形狀面積的累加,確保每種形狀分別用不同的方法來計算它們的面積和周長。因此,超類Shape包含抽象方法computeArea,然后在不同的子類中用不同的面積計算方法覆蓋這個方法。假定聲明了1000個Shape對象的數(shù)組,然后循環(huán)1000次隨機產(chǎn)生1000個平面圖形對象,形狀為圓、矩形、正方形三種之一。 6768abstr

溫馨提示

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

評論

0/150

提交評論