官术网_书友最值得收藏!

2.3 對象和類的初步知識

對象是Java程序的基本構造元件,因此Java程序設計過程中必須識別所包含的對象。類是對象的定義模板,是對象的抽象描述。類采用包的結構進行組織。對象是在程序運行過程中創建和使用的。

2.3.1 對象概述

在針對程序需要解決的問題的應用程序開發過程中,所有有關的需要概念化或模型化的元素都可以抽象為對象。這些元素可以是問題空間中的有關物理實體,也可以是程序解題過程中人為添加的概念化元素,或是與問題相關聯的任何東西。程序中任何一個設計良好的對象都為解題提供服務,完成一項程序任務。

對象是程序中的一個自包含構件,包含它所表示的元素的內部狀態——該元素有關屬性的當前值,以及對其所表示元素的操作——獲取、使用和修改該元素有關屬性值。對象的狀態改變必須通過該對象的操作完成。其他對象要獲取或改變該對象的狀態,只需向該對象發出請求——發送消息,由該對象自身完成所請求的操作。

采用面向對象程序設計方法開發程序,首先要識別出解題任務中的對象。一般方法是在對問題進行細致分析的基礎上,整理出想讓系統完成的具體任務,并寫出較為細致具體的描述問題和任務的文檔。然后在描述文檔中查找名詞,這些名詞有可能就可以作為程序中的對象。

例如,2.1節中的簡單加法計算器程序中可能的對象包括計算器、加數、被加數、和數。此外,要求程序采用圖形用戶界面,那就可能還有程序窗口對象、顯示和存放運算數據的三個文本字段對象、三個描述性標簽對象及兩個操作按鈕對象。

2.3.2 類概述

面向對象程序設計世界中存在著大量的相似對象。例如,每個程序都至少有一個窗口對象,它們都有位置、大小等屬性,都具有改變大小、移動位置、最大化、最小化和關閉等操作。在2.1節簡單加法計算器程序項目中單擊編輯窗口上部的“設計”按鈕,切換到設計視圖,分別右鍵單擊三個文本字段對象,選擇快捷菜單中的“屬性”菜單項,在彈出的“屬性”窗口中看到它們具有大量的共同屬性(見圖2.14)。在“源”代碼窗口,緊接三個文本字段對象名(jTextFieldNum1、jTextFieldNum2、jTextFieldResult)的后面輸入句點“.”,在彈出的方法提示框中拖動右邊的滾動條,可以看到都有獲取所顯示文字、設置文字等大量的共同操作(見圖2.15)。分類是人們認識世界的一種基本方法,將相似的對象歸為一類可以簡化編程。

在面向對象程序設計中,類是具有共同屬性和操作的一組相似對象的定義,類在程序中用來描述一組對象的共同屬性和操作。在程序設計中,類就是創建對象的模板。

Java語言使用class關鍵字定義一個類,緊接該關鍵字之后為該類取一個類名字,然后在一對大括號(“{}”)中定義類體。即類的定義具有以下形式。

圖2.14 簡單加法計算器程序中的三個文本字段屬性比較

圖2.15 簡單加法計算器程序中的三個文本字段方法比較

     [修飾符] class 類名 [其他限定] {
         // 屬性定義,若干行語句,定義一些變量
         // 方法定義,若干個程序塊,定義程序所能執行的操作
     }

其中:

(1)[修飾符]是可選的,如public,后面章節將介紹具體內容。

(2)[其他限定]是可選的,如extends javax.swing.JFrame(見圖2.12),以后介紹。

(3)類名:是該類的標識文字,在Java語言中屬于標識符,由字母(區分大小寫)、數字、下畫線“_”和美元符號“$”等組合而成,且不能以數字開頭,不能是單獨一個下畫線。習慣上,類名的第一個字母大寫,其余字母小寫,但由多個單詞組成的類名則各單詞的第一個字母大寫。

(4)屬性定義:是對該類所有對象共同具有的各種數據的定義,例如、文本字段類各個對象都需要確定和記錄其中的文字是否可以編輯——editable屬性、背景顏色——background屬性、可以接受的字符個數——columns等;又如圖2.13簡單加法計算器類NumberAddition在窗口中創建的8個組件確定了該計算器顯示的窗口內容,其中,169~176行語句就是定義這些屬性。類中的屬性又稱為域變量,也叫字段,是在類中定義的一些變量。關于變量定義語句的細節將在第3章中介紹。

(5)方法定義:方法(有時也叫函數)是Java程序中完成特定任務的一個程序單元,執行了一些特定的操作。例如2.1節中設計的簡單加法計算器類NumberAddition中,方法calcAdd完成用戶所輸入數據的加法運算,textClear方法完成清除三個文本框中內容的操作。關于方法定義格式等內容后續章節將進行介紹。

當給定了類名,確定了該類的屬性,定義了它的方法后,就給出了這個類的定義。

在Java語言面向對象程序設計中,往往需要使用一些輔助工具幫助建模,最常用的是UML(統一建模語言)。類可以采用UML標示為如下形式:

例如,2.1節中設計的簡單加法計算器項目中NumberAddition類可以繪制為如下UML類圖。

必要時,第二個和第三個方框中的屬性列表和方法列表可以不寫出,而只給出類名。

2.3.3 類的組織

一個Java程序中可能會用到許多類,這些類有一些是開發者自己定義的,還有一些可能是標準類庫中或其他組織開發的庫中的類,還有可能是其他Java程序項目中的類。從表1.3可見,僅JDK 8所提供的Java標準類庫中就有四千多個類和接口(一個接口可以看作一種特殊的類)。為了方便類的命名、開發、查找和管理,Java語言提供了包(package)分類組織各種類。Java語言采用了以句點分隔的層級結構為包命名,類似于Internet域名反順序寫法。例如,w2c組織的域名是w3c.org,那么它開發的一個Java包就取名為org.w3c.dom;又如,本書例題開發的GUI程序使用的是Java標準類庫中的javax.swing包中的組件。Java的類一般都位于某個包中,定義方法是在該類的源程序文件最前面添加一條package語句。例如,1.4.4節中創建的Java程序(見圖1.24)的第一條執行語句“package javaapplication1;”說明Hello類在名為javaapplication1的包中。如果在定義類時沒有為其指定包名,則該類位于項目的默認包中。有了包組織的類的全名是“包名.類名”,例如,1.4.4節中的Java類Hello的全類名是javaapplication1.Hello,又如文本字段類的全類名是javax.swing.JTextField。

帶有包名的類編譯之后會創建與包名層次相同的目錄結構,此時分隔包名各層次的句點就相當于目錄分隔符。例如,1.4.4節中的Java類javaapplication1.Hello在命令提示符窗口中將當前目錄轉到源程序文件Hello.Java所在的目錄下,執行編譯命令“javac –d .Hello.java”,則在當前目錄下自動創建子目錄javaapplication1,并將編譯生成的字節碼文件Hello.class存放于其中。當然,NetBeans IDE編譯時也會生成正確的相應目錄結構。

在程序中要使用某個包中的類,可以采用帶包名的全類名方式,如圖2.12中的169~176行語句。此外,更方便的方法是在定義類的源文件中導入這些包中的類,然后不帶包名而直接引用類名。類的導入語句是非常常用的Java語句,一般格式如下:

     import 包名.類名;

如果需要使用包中的多個類,則可以使用“*”代替類名,語句簡化為:

     import 包名.*;

例如,可以在圖2.12的NumberAddition.java文件的第6行添加語句“import javax.swing.*;”,然后將169~176行的語句修改為以下簡化語句。

     private JButton jButtonCalc;
     private JButton jButtonClear;
     private JLabel jLabel1;
     private JLabel jLabel2;
     private JLabel jLabel3;
     private JTextField jTextFieldNum1;
     private JTextField jTextFieldNum2;
     private JTextField jTextFieldResult;

注意:NetBeans IDE自動生成的一些代碼帶有灰色背景顯示,這些代碼是不能修改的,稱為保護代碼塊。例如,圖2.12程序代碼中的第168~177行語句就位于保護代碼塊中。

2.3.4 創建對象

定義了一個類就是給出了一個創建這種類型對象的模板,使用該類創建的對象都具有類所定義的屬性和方法。類只是描述了它的對象中有什么,可以做什么,而程序運行時會創建每個對象并為其分配存儲空間,此時對象才會存在。

Java語言使用new關鍵字創建對象。

例如,圖2.12程序代碼中第163行的“new NumberAddition()”被執行時會創建一個NumberAddition類的對象。單擊圖2.12“源”代碼窗口26行前面的圖標,如果27行前面還有圖標再單擊它,將會展開保護代碼塊,可以看到29~36行每一行都創建了一個對象。

29行的“new javax.swing.JLabel()”創建了一個javax.swing.JLabel類(標簽組件)的對象,并返回該對象在內存中的引用——指向該對象在內存中存儲塊的鏈接,使用其前面的“=”將該引用“交給”(賦值)NumberAddition類對象的屬性jLabel1(第171行定義)。30~36行同理。

一旦將對象的引用交給一個屬性保存,該屬性就通過引用與具體的對象聯系起來,該屬性也有了一個具體的值——屬性值。更普遍的是使用變量(第3章介紹)保存對象的引用,屬性也是一種變量。可以認為保存對象引用的變量名就是對象名,本書以后就這樣敘述。之后就可以通過該屬性(或變量)請求執行這個對象的操作,具體方法是在對象引用之后輸入句點“.”,緊接著輸入方法名及其他有關的內容。例如,圖2.12“源”代碼窗口163行的“new NumberAddition().setVisible(true);”語句是直接使用對象的引用請求執行其setVisible(true)方法,目的是顯示程序窗口;第40行的“jLabel1.setText("第一個數:");”語句是使用保存第一個標簽對象引用jLabel1的屬性,請求設置該標簽組件的顯示文字為“第一個數:”。

使用“對象名.屬性名”形式也可以直接使用該對象的指定屬性。

主站蜘蛛池模板: 甘谷县| 陈巴尔虎旗| 台中市| 赣州市| 额济纳旗| 镶黄旗| 新河县| 沙河市| 正安县| 诏安县| 锡林浩特市| 和顺县| 梁平县| 石柱| 富平县| 青浦区| 辽宁省| 交城县| 富蕴县| 资溪县| 伽师县| 桂平市| 台北县| 武山县| 封开县| 永寿县| 康平县| 颍上县| 宜兴市| 鄱阳县| 莱芜市| 百色市| 新丰县| 隆回县| 南部县| 红河县| 同仁县| 喀什市| 济阳县| 于都县| 塔河县|