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

下載本文檔

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

文檔簡(jiǎn)介

1、Java開(kāi)發(fā)初步開(kāi)發(fā)初步第九講第九講一、面向?qū)ο蟮母拍钜?、面向?qū)ο蟮母拍頣hinking in JavaThinking in Object通過(guò)Java語(yǔ)言來(lái)介紹面向?qū)ο蟪绦蛟O(shè)計(jì),培養(yǎng)面向?qū)ο蟮乃季S,掌握其方法、原理與機(jī)制,具備一定的面向?qū)ο笤O(shè)計(jì)、開(kāi)發(fā)能力。為后續(xù)課程及大型軟件的設(shè)計(jì)與工程實(shí)現(xiàn)打下基礎(chǔ)。國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心2所謂面向?qū)ο蟮姆椒?,就是使我們分析、設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng)的方法盡可能自然地使用我們?cè)谏钪杏玫降囊詫?duì)象為中心的思想,分析、認(rèn)識(shí)、設(shè)計(jì)一個(gè)系統(tǒng)的方法。包括:面向?qū)ο蟮姆治?OOA, Object-Oriented Analysis) 面向?qū)ο蟮脑O(shè)計(jì)(OOD, Obje

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

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

4、程序中的對(duì)象是類(lèi)的一個(gè)實(shí)例,是一個(gè)軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心6一個(gè)例子在程序中操作對(duì)象是類(lèi)的一個(gè)實(shí)例:創(chuàng)建一個(gè)對(duì)象: Hello obj=new Hello();調(diào)用方法: obj.showString();國(guó)家數(shù)字化學(xué)習(xí)工程技術(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 )封裝把對(duì)象的所有組成部分組合在一起。封裝定義程序如何引用對(duì)象的數(shù)據(jù),實(shí)際上是用方法將類(lèi)的數(shù)據(jù)隱藏起來(lái),控制用戶對(duì)類(lèi)的修改和訪問(wèn)數(shù)據(jù)的程度。封裝有利于程序模塊化和信息隱藏。 國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心8對(duì)象A對(duì)象B私有數(shù)據(jù) 方法 方法數(shù)據(jù)公有數(shù)據(jù)子類(lèi)(Subclass)子類(lèi)是作為另一個(gè)類(lèi)的擴(kuò)充或修正而定義的一個(gè)類(lèi)。國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心9Bicycle(Super class)Mountain bikesRacing bikesTandem bikesSubclass繼承(Inheritance)一個(gè)類(lèi)從另一個(gè)類(lèi)派生出來(lái)的過(guò)程叫繼承。這個(gè)類(lèi)叫

6、子類(lèi)(派生類(lèi)),而被繼承的類(lèi)叫該類(lèi)的超類(lèi)(父類(lèi))繼承的子類(lèi)可利用父類(lèi)中定義的方法和變量,就像它們屬于子類(lèi)本身一樣。也可以改變繼承來(lái)的方法和變量。國(guó)家數(shù)字化學(xué)習(xí)工程技術(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)在子類(lèi)中重新定義父類(lèi)中已有的方法。國(guó)家數(shù)字化學(xué)習(xí)工

7、程技術(shù)研究中心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)同一個(gè)類(lèi)中至少有兩個(gè)方法用同一個(gè)名字,但有不同的參數(shù)列表。使用重載方法時(shí),Java編譯器根據(jù)傳遞給這個(gè)

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

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

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

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

12、vate:不允許任何其他類(lèi)存取和調(diào)用。IceCream.java default:(前邊沒(méi)有修飾字的情況)在同一包中出現(xiàn)的類(lèi)才可以直接使用它的數(shù)據(jù)和方法。Cake.java國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心18類(lèi)變量類(lèi)變量類(lèi)變量屬于類(lèi)的變量和方法staticstatic 在變量或方法之前,表明它們是屬于類(lèi)的,稱(chēng)為類(lèi)方法(靜態(tài)方法)或類(lèi)變量(靜態(tài)變量)。若無(wú)static修飾,則是實(shí)例方法和實(shí)例變量。類(lèi)變量在各實(shí)例間共享 ConcentricCirclesTester國(guó)家數(shù)字化學(xué)習(xí)工程技術(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方法方法方法是類(lèi)的動(dòng)態(tài)屬性。對(duì)象的行為是由它的方法來(lái)實(shí)現(xiàn)的。一個(gè)對(duì)象可通過(guò)調(diào)用另一個(gè)對(duì)象的方法來(lái)訪問(wèn)該對(duì)象。 與類(lèi)一樣,方法也有兩個(gè)主要部分:方法首部聲明和方法體。方法聲明的基本形式為:返回類(lèi)型 方法名( ) /方法體國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心20方法聲明的完整形式:方法修飾符 返回類(lèi)型 方法名稱(chēng)(參數(shù)1,參數(shù)2,) throws exceptionList statements;

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

15、存及初始化分配內(nèi)存及初始化形式如下:對(duì)象名= new 構(gòu)造方法名(參數(shù)表);創(chuàng)建對(duì)象首先需說(shuō)明新建對(duì)象所屬的類(lèi),由與類(lèi)同名的構(gòu)造方法給出;然后要說(shuō)明新建對(duì)象的名字,即賦值號(hào)左邊的對(duì)象名;賦值號(hào)右邊的new是為新建對(duì)象開(kāi)辟內(nèi)存空間的運(yùn)算符,用new運(yùn)算符開(kāi)辟新建對(duì)象的內(nèi)存之后,系統(tǒng)自動(dòng)調(diào)用構(gòu)造方法初始化該對(duì)象。若類(lèi)中沒(méi)有定義構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法。 國(guó)家數(shù)字化學(xué)習(xí)工程技術(shù)研究中心22國(guó)家數(shù)字化學(xué)習(xí)工程技術(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編譯器為每個(gè)類(lèi)生成一個(gè)字節(jié)碼文件,且文件名與類(lèi)名相同,因此同名的類(lèi)有可能發(fā)生沖突。為了解決這一問(wèn)題,Java提供包來(lái)管理類(lèi)名空間。如同目錄是文件的松散的集合一樣,包是類(lèi)和接口的一種松散集合

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

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

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

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

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

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

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

24、有什么區(qū)別,只是在定義子類(lèi)時(shí)“extends ”不再是可選項(xiàng)。何時(shí)選擇繼承?一個(gè)很好的經(jīng)驗(yàn):“B是A中的一類(lèi)嗎?”如果是則讓B做A的子類(lèi)34子類(lèi)的定義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子類(lèi)的定義36子類(lèi)的定義【例】實(shí)現(xiàn)電話類(lèi)的繼承結(jié)構(gòu)。為了代碼簡(jiǎn)潔,而把注意力集中在要討論的語(yǔ)法機(jī)制上,這里假設(shè)移動(dòng)電話僅一種,電話的計(jì)費(fèi)方式為:國(guó)內(nèi)長(zhǎng)途和國(guó)際長(zhǎng)途話費(fèi)分別是市話費(fè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. 域的繼承子類(lèi)可以繼承父類(lèi)的所有非私有域。例如各類(lèi)電話類(lèi)所包含的域 Telephone.java38Mobile_P

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

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

28、一個(gè)來(lái)自繼承父類(lèi),另一個(gè)由自己定義。在這種情況下,當(dāng)子類(lèi)執(zhí)行繼承的父類(lèi)方法時(shí),處理的是父類(lèi)的變量,而當(dāng)子類(lèi)執(zhí)行它自己定義的方法時(shí),所操作的就是它自定義的變量,而把來(lái)自繼承父類(lèi)的變量“隱藏”起來(lái)了。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. 方法的繼承父類(lèi)的非私有方法可以被子類(lèi)所繼承。根據(jù)方法的繼承關(guān)系,將電話類(lèi)及其各子類(lèi)所包含的方法列舉如下。(1)Telephone類(lèi)abstract boolean charge_Mode();double getBalance();(2)Fixed_Telephon

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

31、)覆蓋后的方法不能比被覆蓋的方法有更嚴(yán)格的訪問(wèn)權(quán)限。(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)用對(duì)于重寫(xiě)的方法,Java

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

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

34、有類(lèi)似的功能且目的相同,但在實(shí)現(xiàn)該功能的具體方式和細(xì)節(jié)方面有所不同,因此需要定義多種不同的方法體46覆蓋實(shí)現(xiàn)多態(tài)性在覆蓋實(shí)現(xiàn)多態(tài)性的方式中,子類(lèi)重定義父類(lèi)方法,此時(shí)方法的名字、參數(shù)個(gè)數(shù)、類(lèi)型、順序完全相同,那么如何區(qū)別這些同名的不同方法呢?此時(shí)這些方法是存在不同的類(lèi)層次結(jié)構(gòu)中,在調(diào)用方法時(shí)只需要指明是調(diào)用哪個(gè)類(lèi)(或?qū)ο螅┑姆椒ǎ秃苋菀装阉鼈儏^(qū)分開(kāi)來(lái),其調(diào)用形式為: 對(duì)象名.方法名 或 類(lèi)名.方法名例如,IP電話的計(jì)費(fèi),若建立IP_Phone類(lèi)的對(duì)象my,其調(diào)用為: my.charge_Mode();假如charge_Mode()是一個(gè)類(lèi)方法,則可使用類(lèi)名,其調(diào)用為: IP_Phone.cha

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

36、ic class Employee extends Objectpublic class Manager extends Employee則:Employee e = new Manager(); /合法語(yǔ)句49多態(tài)性舉例對(duì)象狀態(tài)的確定在Java語(yǔ)言中,提供了操作符instanceof用來(lái)判斷對(duì)象是否屬于某個(gè)類(lèi)的實(shí)例。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構(gòu)造方法的繼承與重載構(gòu)造方法的繼承與重載構(gòu)造方法的重載構(gòu)造方法的重載是指同一個(gè)類(lèi)中定義不同參數(shù)的多個(gè)構(gòu)造方法,以完成不同情況下對(duì)象的初始化。例如,point類(lèi)可定義不同的構(gòu)造方法創(chuàng)建不同的點(diǎn)對(duì)象。point();/未初始化坐標(biāo)point(x);/初始化一個(gè)坐標(biāo)point(x, y);/初始化兩個(gè)坐標(biāo)一個(gè)類(lèi)的若干個(gè)構(gòu)造方法之間可以相互調(diào)用。當(dāng)類(lèi)中一個(gè)構(gòu)造方法需要調(diào)用另一個(gè)構(gòu)造方法時(shí),可以使用關(guān)鍵字this,并且這個(gè)調(diào)用語(yǔ)句應(yīng)該是該構(gòu)造方法的第一個(gè)可執(zhí)行語(yǔ)句。51構(gòu)造方法的重載對(duì)Ordinary_phone類(lèi),可以根據(jù)需

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

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

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

41、先執(zhí)行來(lái)自繼承父類(lèi)的無(wú)參數(shù)構(gòu)造方法,然后再執(zhí)行自己的構(gòu)造方法。55構(gòu)造方法的繼承2. 在構(gòu)造方法中super關(guān)鍵字的使用super是表示父類(lèi)對(duì)象的關(guān)鍵字,super表示當(dāng)前對(duì)象的直接父類(lèi)對(duì)象的一個(gè)引用,通過(guò)super可使用父類(lèi)對(duì)象的方法或域。Fixed_Telephone( ) /無(wú)參數(shù)的構(gòu)造方法Fixed_Telephone (long pn) phoneNumber = pn; /初始化電話號(hào)碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機(jī)費(fèi)Fixed_Telephone(long

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

43、monthFee = mf; /初始化座機(jī)費(fèi)Fixed_Telephone(long pn, double mf, double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費(fèi)的剩余金額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)用父類(lèi)

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

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

46、(參數(shù)表);/抽象方法聲明接口聲明中有兩個(gè)部分是必需的:interface關(guān)鍵字和接口的名字。用public修飾的接口是公共接口,可以被所有的類(lèi)和接口使用;沒(méi)有public修飾符的接口則只能被同一個(gè)包中的其他類(lèi)和接口利用。60接口的實(shí)現(xiàn)定義接口是為了讓某些類(lèi)實(shí)現(xiàn)它。 類(lèi)實(shí)現(xiàn)某個(gè)接口,要在類(lèi)的聲明中要包括一條implements語(yǔ)句,并提供在接口中定義的所有抽象方法的具體實(shí)現(xiàn)。 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,可以在implements后面列出要實(shí)現(xiàn)的多個(gè)接口,這些接口以逗號(hào)分隔。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接口的實(shí)現(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() 接口的實(shí)現(xiàn)實(shí)現(xiàn)接口時(shí)應(yīng)注意的問(wèn)題:(1)在類(lèi)的聲明部分,用implements關(guān)鍵字聲明該類(lèi)將要實(shí)現(xiàn)哪些接口。(2)類(lèi)在實(shí)現(xiàn)抽象方法時(shí),必須用public修飾符。(3)除抽象類(lèi)以外,在類(lèi)的定義部分必須為接口中所有的抽象方法定義方法體,且方法首部應(yīng)該與接口中的定義完全一致。(4)若實(shí)現(xiàn)某接口的類(lèi)是abstract的抽象類(lèi),則它可以不實(shí)現(xiàn)該接口所有的方法。但是對(duì)于這個(gè)抽象類(lèi)的任何

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論