在一個(gè)面向?qū)ο笙到y(tǒng)中:
對(duì)象是對(duì)現(xiàn)實(shí)世界中事物的抽象,是 Java 程序的基本封裝單位,是類的實(shí)例;
類是對(duì)象的抽象,是數(shù)據(jù)和操作的封裝體;
屬性是事物靜態(tài)特征的抽象,在程序中用數(shù)據(jù)成員加以描述;
操作是事物動(dòng)態(tài)特征的抽象,在程序中用成員方法來實(shí)現(xiàn)。
把客觀世界中的事物映射到面向?qū)ο蟮某绦蛟O(shè)計(jì)中就是對(duì)象。
對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)中用來描述客觀事物的程序單位。
客觀世界中的許多對(duì)象,無論其屬性還是其行為常常有許多共同性,抽象出這些對(duì)象的共同性便可以構(gòu)成類。
類是對(duì)象的抽象和歸納,對(duì)象是類的實(shí)例。
1. 抽象原則
抽象(Abstraction)就是從被研究對(duì)象中舍棄個(gè)別的、非本質(zhì)的、或與研究主旨無關(guān)的次要特征,而抽取與研究工作有關(guān)的實(shí)質(zhì)性內(nèi)容加以考察,形成對(duì)所研究問題正確的、簡(jiǎn)明扼要的認(rèn)識(shí)。
1.1 過程抽象
軟件開發(fā)者可以把任何一個(gè)完成確定功能的操作序列都看作是一個(gè)單一的實(shí)體,盡管它實(shí)際上可能是由一系列更低級(jí)的操作完成的。
過程抽象可以把復(fù)雜的功能一層層分解為更簡(jiǎn)單的子模塊,這樣開發(fā)者可在不同層次上考慮問題,如在高層上就不必關(guān)心低層的細(xì)節(jié)問題。
面向過程的程序設(shè)計(jì)采用的是過程抽象方法。
過程抽象有利于控制、降低整個(gè)程序的復(fù)雜度,但是,這種方法允許在全系統(tǒng)的范圍內(nèi)進(jìn)行功能的描述,本身自由度大,難于規(guī)范化和標(biāo)準(zhǔn)化,不易保證軟件的質(zhì)量,而且操作起來也有一定難度。
1.2 數(shù)據(jù)抽象
數(shù)據(jù)抽象把系統(tǒng)中需要處理的數(shù)據(jù)和施加于這些數(shù)據(jù)之上的操作結(jié)合在一起,根據(jù)功能、性質(zhì)、作用等因素抽象成不同的抽象數(shù)據(jù)類型。
每個(gè)抽象數(shù)據(jù)類型既包含了數(shù)據(jù),也包含了針對(duì)這些數(shù)據(jù)的授權(quán)操作,并限定數(shù)據(jù)的值只能由這些操作來觀察和修改。
因此,數(shù)據(jù)抽象是相對(duì)于過程抽象更為嚴(yán)格、更為合理的抽象方法。
面向?qū)ο蟪绦蛟O(shè)計(jì)就是采用數(shù)據(jù)抽象這一方法來構(gòu)建程序中的類和對(duì)象的。
它強(qiáng)調(diào)把數(shù)據(jù)和操作結(jié)合為一個(gè)不可分的系統(tǒng)單位 - 對(duì)象,對(duì)象的外部只需要知道這個(gè)對(duì)象能做什么,而不必知道它是如何做的。
2. 對(duì)象
把客觀世界這一事實(shí)映射到面向?qū)ο蟮某绦蛟O(shè)計(jì)中,則把問題域中的事物抽象成了對(duì)象(Object),事物的靜態(tài)特征(屬性)用一組數(shù)據(jù)來描述,事物的動(dòng)態(tài)特征(行為)則用一組方法來刻畫。
對(duì)象具有以下特征:
對(duì)象標(biāo)識(shí):即對(duì)象的名字,是用戶和系統(tǒng)識(shí)別它的唯一標(biāo)志。對(duì)象標(biāo)識(shí)有“外部標(biāo)識(shí)”和“內(nèi)部標(biāo)識(shí)”之分。外部標(biāo)識(shí)供對(duì)象的定義者或使用者用,內(nèi)部標(biāo)識(shí)供系統(tǒng)內(nèi)部唯一地識(shí)別每一個(gè)對(duì)象。在計(jì)算機(jī)世界中,可以把對(duì)象看成計(jì)算機(jī)存儲(chǔ)器中一塊可標(biāo)識(shí)的區(qū)域,它能保存固定或可變數(shù)目的數(shù)據(jù)(或數(shù)據(jù)的集合)。
屬性:即一組數(shù)據(jù),用來描述對(duì)象的靜態(tài)特征。在 Java 程序中,把這一組數(shù)據(jù)稱為數(shù)據(jù)成員。
方法:也稱為服務(wù)或操作,它是對(duì)象動(dòng)態(tài)特征(行為)的描述。每一個(gè)方法確定對(duì)象的一種行為或功能。在 Java 程序中稱為成員方法。
在 Java 程序中,類是創(chuàng)建對(duì)象的模板,對(duì)象是類的實(shí)例,任何一個(gè)對(duì)象都是隸屬于某個(gè)類的。
Java 程序設(shè)計(jì)是從類的設(shè)計(jì)開始的。
3. 類
在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位,是具有相同屬性和方法的一組對(duì)象的集合。
類的概念使我們能對(duì)屬于該類的全部對(duì)象進(jìn)行統(tǒng)一的描述。
在定義對(duì)象之前應(yīng)先定義類。
描述一個(gè)類需要指明下述三個(gè)方面內(nèi)容:
類標(biāo)識(shí):類的一個(gè)有別于其他類的名字。
屬性說明:用來描述相同對(duì)象的靜態(tài)特征。
方法說明:用來描述相同對(duì)象的動(dòng)態(tài)特征。
4. 類與對(duì)象的關(guān)系
類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的一個(gè)實(shí)體。
可以把類與對(duì)象之間的關(guān)系看成是抽象與具體的關(guān)系。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)象被稱作類的一個(gè)實(shí)例(Instance),而類是對(duì)象的模板(Template)。
類是多個(gè)實(shí)例的綜合抽象,而實(shí)例又是類的個(gè)體實(shí)物。
由于對(duì)象是類的實(shí)例,因此在定義對(duì)象之前應(yīng)先定義類。在定義了類之后,才可以在類的基礎(chǔ)上創(chuàng)建對(duì)象。
5. 定義類的一般格式
進(jìn)行 Java 程序設(shè)計(jì),實(shí)際上就是定義類的過程。
一個(gè) Java 源程序文件往往是由許多個(gè)類組成的。
從用戶的角度看,Java 源程序中的類分為兩種:
系統(tǒng)定義的類:即 Java 類庫,它是系統(tǒng)定義好的類。Java 語言由語法規(guī)則和類庫兩部分組成,語法規(guī)則確定 Java 程序的書寫規(guī)范;類庫則提供了 Java 程序與運(yùn)行它的系統(tǒng)軟件(Java 虛擬機(jī))之間的接口。
用戶自定義類:系統(tǒng)定義的類雖然實(shí)現(xiàn)了許多常見的功能,但是用戶程序仍然需要針對(duì)特定問題的特定邏輯來定義自己的類。
在 Java 程序中,用戶自定義類的一般格式如下:
class 類名
{
數(shù)據(jù)成員
成員方法
}
{
數(shù)據(jù)成員
成員方法
}
類的結(jié)構(gòu)是由類說明和類體兩部分組成的。
類的說明部分由關(guān)鍵字 class 與類名組成,類名的命名遵循 Java 標(biāo)識(shí)符的定義規(guī)則。
類體是類聲明中花括號(hào)所包括的全部?jī)?nèi)容,它又是由數(shù)據(jù)成員(屬性)和成員方法(方法)兩部分組成。
數(shù)據(jù)成員描述對(duì)象的屬性;成員方法則刻畫對(duì)象的行為或動(dòng)作,每一個(gè)成員方法確定一個(gè)功能或操作。
6. Java 類庫
Java 的類庫是系統(tǒng)提供的已實(shí)現(xiàn)的標(biāo)準(zhǔn)類的集合,是 Java 編程的 API(Application Program Interface),它可以幫助開發(fā)者方便、快捷地開發(fā) Java 程序。
Java 基礎(chǔ)類庫(JFC)是由 Sun 公司提供的,也有少量則是由其他軟件開發(fā)商以商品形式提供的。
學(xué)習(xí) Java 語言程序設(shè)計(jì),一是要學(xué)習(xí)其語法規(guī)則中的基本數(shù)據(jù)類型、基本運(yùn)算和基本語句等,這是編寫 Java 程序的基本功;二是要學(xué)習(xí)使用類庫,這是提高編程效率和質(zhì)量的必由之路,甚至從一定程度上來說,能否熟練自如地掌握盡可能多的 Java 類庫,決定了一個(gè) Java 程序員編程能力的高低。
在 Java 系統(tǒng)中,系統(tǒng)定義好的類根據(jù)實(shí)現(xiàn)的功能不同,可以劃分成不同的集合。每個(gè)集合稱為一個(gè)包,所有包稱為類庫。根據(jù)功能的不同,Java 類庫的每個(gè)包中都有若干個(gè)具有特定功能和相互關(guān)系的類和接口。
使用類庫中系統(tǒng)定義好的類有三種方式:一是直接使用系統(tǒng)類;二是繼承系統(tǒng)類,在用戶程序里創(chuàng)建系統(tǒng)類的子類;三是創(chuàng)建系統(tǒng)類的對(duì)象。
無論采用哪種方式,使用系統(tǒng)類的前提條件是這個(gè)系統(tǒng)類應(yīng)該是用戶程序可見的類。為此用戶程序需要用 import 語句引入它所用到的系統(tǒng)類或系統(tǒng)類所在的包。
類庫包中的程序都是字節(jié)碼形式的程序,利用 import 語句將一個(gè)包引入到程序里,就相當(dāng)于在編譯過程中將該包中的所有系統(tǒng)類的字節(jié)碼加入到用戶的 Java 程序中,這樣用戶的 Java 程序就可以使用這些系統(tǒng)類及其中的各種功能了。
Java 程序常用的包:
java.lang 包
Java 語言的核心類庫,包含了運(yùn)行 Java 程序必不可少的系統(tǒng)類,如基本數(shù)據(jù)類型、基本數(shù)學(xué)函數(shù)、字符串處理、線程、異常處理類等。
每個(gè) Java 程序運(yùn)行時(shí),系統(tǒng)都會(huì)自動(dòng)地引入 java.lang 包,所以這個(gè)包的加載是缺省的。
java.io 包
包含了實(shí)現(xiàn) Java 程序與操作系統(tǒng)、用戶界面以及其他 Java 程序之間進(jìn)行數(shù)據(jù)交換所使用的類,如基本輸入/輸出流、文件輸入/輸出流、過濾輸入/輸出流、管道輸入/輸出流、隨機(jī)輸入/輸出流等。
凡是需要完成與操作系統(tǒng)有關(guān)的較底層的輸入/輸出操作的 Java 程序,都要用到 java.io 包。
java.awt 包
它是 Java 語言用來構(gòu)建圖形用戶界面(GUI)的類庫,包括了許多界面元素和資源。
java.awt 包主要在三個(gè)方面提供界面設(shè)計(jì)支持:一是低級(jí)繪圖操作;二是圖形界面組件和布局管理;三是界面用戶交互控制和事件響應(yīng)。
java.awt.event 包
它是對(duì) JDK 1.0 版本中原有的 Event 類的一個(gè)擴(kuò)充,它使得程序可以用不同的方式來處理不同類型的事件,并使每個(gè)圖形界面的元素本身可以擁有處理它上面事件的能力。
java.awt.image 包
用來處理和操作來自于網(wǎng)上的圖片的 Java 工具類庫。
java.applet 包
用來實(shí)現(xiàn)運(yùn)行于 Internet 瀏覽器中的 Java Applet 的工具類庫,它僅包含少量幾個(gè)接口和一個(gè)非常有用的類 java.applet.Applet。
java.net 包
它是 Java 語言用來實(shí)現(xiàn)網(wǎng)絡(luò)功能的類庫。
目前已經(jīng)實(shí)現(xiàn)的 Java 網(wǎng)絡(luò)功能主要有:底層網(wǎng)絡(luò)通信;編寫用戶自己的 Telnet、FTP、郵件服務(wù)等實(shí)現(xiàn)網(wǎng)上通信的類;用于訪問 Internet 上資源和進(jìn)行 CGI 網(wǎng)關(guān)調(diào)式的類。
利用 java.net 包中的類,開發(fā)者可以編寫自己的具有網(wǎng)絡(luò)功能的程序。
java.rmi 包、java.rmi.registry 包和 java.rmi.server 包
這三個(gè)包用來實(shí)現(xiàn) RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)功能。
利用 RMI 功能,用戶程序可以在遠(yuǎn)程計(jì)算機(jī)(服務(wù)器)上創(chuàng)建對(duì)象,并在本地計(jì)算機(jī)(客戶機(jī))上使用這個(gè)對(duì)象。
java.util 包
包括了 Java 語言中的一些低級(jí)的實(shí)用工具,如時(shí)間的處理、變長(zhǎng)數(shù)組的處理、棧和哈希(散列)表的處理。
java.sql 包
它是實(shí)現(xiàn) JDBC(Java Database Connection)的類庫。
利用這個(gè)包可以使 Java 程序具有訪問不同種類的數(shù)據(jù)庫的功能。
只要安裝了合適的驅(qū)動(dòng)程序,同一個(gè) Java 程序不需要修改就可以存取、修改這些不同的數(shù)據(jù)庫中的數(shù)據(jù)。
JDBC 的這種功能,再加上 Java 程序本身具有的平臺(tái)無關(guān)性,大大拓寬了 Java 程序的應(yīng)用范圍,特別是商業(yè)應(yīng)用的使用領(lǐng)域。
java.security 包、java.security.acl 包、java.security.interfaces 包
這三個(gè)包提供更完善的 Java 程序安全性控制和管理,利用它們可以對(duì) Java 程序加密,也可以把特定的 Java Applet 標(biāo)記為“可信賴的”,使它能夠具有與 Java Application 相近的安全權(quán)限。
java.awt.peer 包
它是實(shí)現(xiàn) Java 語言跨平臺(tái)特性的手段之一。
其作用是將不同的平臺(tái)包裹、隱藏起來,使這些平臺(tái)在用戶程序面前呈現(xiàn)基本相同的面貌。
java.util.zip 包
用來實(shí)現(xiàn)文件壓縮功能。
java.awt.datatransfer 包
提供了處理數(shù)據(jù)傳輸?shù)墓ぞ哳悾缂糍N版、字符串發(fā)送器等。
java.lang.reflect 包
提供了用于反射對(duì)象的工具,反射允許程序監(jiān)視一個(gè)正在運(yùn)行的對(duì)象并獲得它的構(gòu)造函數(shù)、方法和屬性。
java.corba 包、java.corba.orb 包
這兩個(gè)包將 CORBA(Common Object Request Broker Architecture,一種標(biāo)準(zhǔn)化接口體系)嵌入到 Java 環(huán)境中,使得 Java 程序可以存取、調(diào)用 CORBA 對(duì)象,并與 CORBA 對(duì)象共同工作。
這樣,Java 程序就可以方便、動(dòng)態(tài)地使用已經(jīng)存在的由 Java 或其他面向?qū)ο笳Z言開發(fā)的部件,簡(jiǎn)化軟件的開發(fā)。
7. 創(chuàng)建對(duì)象
7.1 聲明對(duì)象
聲明對(duì)象就是確定對(duì)象的名稱,并指明該對(duì)象所屬的類。
聲明格式如下:
類名 對(duì)象名表;
類名是指對(duì)象所屬類的名字,它是在聲明類時(shí)定義的;
對(duì)象名表是指一個(gè)或多個(gè)對(duì)象名,若為多個(gè)對(duì)象名時(shí),用逗號(hào)進(jìn)行分隔。
聲明對(duì)象的作用是為將來的編譯過程提供必要的信息。
7.2 建立對(duì)象
建立對(duì)象,實(shí)際上就是用 Java 提供的 new 關(guān)鍵字為對(duì)象分配存儲(chǔ)空間。
在聲明對(duì)象時(shí),只確定了對(duì)象的名稱和它所屬的類,并沒有為對(duì)象分配存儲(chǔ)空間,此時(shí)對(duì)象還不是類的實(shí)例。
只有通過建立對(duì)象這一步,才為對(duì)象分配內(nèi)存,使該對(duì)象成為類的實(shí)例。
建立對(duì)象的格式如下:
對(duì)象名=new 構(gòu)造方法();
也可以在聲明對(duì)象的同時(shí)建立對(duì)象,這稱為創(chuàng)建一個(gè)對(duì)象,其格式如下:
類名 對(duì)象名=new 構(gòu)造方法();
關(guān)鍵字 new 的作用是建立對(duì)象,為對(duì)象分配存儲(chǔ)空間。
7.3 初始化對(duì)象
初始化對(duì)象是指由一個(gè)類生成對(duì)象時(shí),為這個(gè)對(duì)象確定初始狀態(tài),即為它的數(shù)據(jù)成員賦初始值的過程,當(dāng)然,它主要由一些賦值語句組成。
由于初始化操作是最常用的操作之一,為簡(jiǎn)化這一過程,Java 還提供了專用的方法來完成它,這個(gè)方法被稱為構(gòu)造方法。
8 使用對(duì)象
一個(gè)對(duì)象可以有許多屬性和多個(gè)方法。
在面向?qū)ο蟮南到y(tǒng)中,一個(gè)對(duì)象的屬性和方法被緊密地結(jié)合成一個(gè)整體,二者是不可分割的,并且限定一個(gè)對(duì)象的屬性值只能由這個(gè)對(duì)象或它的方法來讀取和修改。
當(dāng)一個(gè)對(duì)象被創(chuàng)建后,這個(gè)對(duì)象就擁有了自己的數(shù)據(jù)成員和成員方法,我們可以通過引用對(duì)象的成員來使用對(duì)象。
對(duì)象的數(shù)據(jù)成員的引用方式如下:
對(duì)象名.數(shù)據(jù)成員名;
對(duì)象的成員方法的引用方式如下:
對(duì)象名.成員方法名(參數(shù)表);
9 對(duì)象的初始化與構(gòu)造方法
構(gòu)造方法是一個(gè)類的方法中方法名與類名相同的類方法。
每當(dāng)使用 new 關(guān)鍵字創(chuàng)建一個(gè)對(duì)象,為新建對(duì)象開辟了內(nèi)存空間之后,Java 系統(tǒng)將自動(dòng)調(diào)用構(gòu)造方法初始化這個(gè)新建對(duì)象。
構(gòu)造方法是類的一種特殊方法,它的特殊性主要體現(xiàn)在以下幾個(gè)方面:
構(gòu)造方法的方法名與類名相同。
構(gòu)造方法是類的方法,它能夠簡(jiǎn)化對(duì)象數(shù)據(jù)成員的初始化操作。
不能對(duì)構(gòu)造方法指定類型,它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。
構(gòu)造方法一般不能由編程人員顯式地直接調(diào)用,在創(chuàng)建一個(gè)類的對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造方法將新對(duì)象初始化。
構(gòu)造方法可以重載,即可定義多個(gè)具有不同參數(shù)的構(gòu)造方法。
構(gòu)造方法可以繼承,即子類可以繼承父類的構(gòu)造方法。
如果用戶在一個(gè)自定義類中未定義該類的構(gòu)造方法,系統(tǒng)將為這個(gè)類定義一個(gè)缺省的空構(gòu)造方法。這個(gè)空構(gòu)造方法沒有形式參數(shù),也沒有具體語句,不能完成任何操作。但在創(chuàng)建一個(gè)類的新對(duì)象時(shí),系統(tǒng)要調(diào)用該類的構(gòu)造方法將新對(duì)象初始化。
特殊情況下,構(gòu)造方法中的參數(shù)名可能與數(shù)據(jù)成員名相同,此時(shí),在構(gòu)造方法中可用下面兩種形式之一來區(qū)分?jǐn)?shù)據(jù)成員名與參數(shù)名:
默認(rèn)法。當(dāng)構(gòu)造方法的參數(shù)名與數(shù)據(jù)成員名相同時(shí),將賦值號(hào)左邊的標(biāo)識(shí)符默認(rèn)為對(duì)象的數(shù)據(jù)成員名,而賦值號(hào)右邊的標(biāo)識(shí)符為參數(shù)。
使用代表本類對(duì)象的關(guān)鍵字 this 指出數(shù)據(jù)成員名之所在。