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