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