第3章 物件導向的程式設計基礎

2022-11-02 00:21:04 字數 4677 閱讀 3450

物件導向程式設計(object oriented programming)是目前主流的程式設計方法,它已經基本替代了2023年代初期發展的「結構化的」、基於過程的程式設計技術。j**a語言是一種完全的物件導向的程式語言,它全面支援物件導向的程式設計方法。

所謂物件導向(object-oriented 簡稱: oo),就是一種一切從物件出發的思維方式,其主要思想為:現實世界是由乙個個的物件組成的,並由此建立基於物件的概念模型,通過物件導向的理念使計算機軟體系統能與現實世界中的系統一一對應。

物件導向程式設計可以被視作一種在程式中包含各種獨立而又互相呼叫的單位和物件的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對電腦下達的指令。物件導向程式設計中的每乙個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件,因此它們都可以被看作乙個獨立的、負有特定責任的角色。

與面向過程的程式設計方法不同:物件導向的程式設計方法更符合人們認識客觀世界的思維習慣,降低了問題難度和分解問題的複雜度;提高了程式**的重用性,簡化了程式設計過程。

目前已經被證實,物件導向程式設計推廣了程式的靈活性和可維護性,並且在大型專案設計中廣為應用。

物件導向的程式設計方法主要涉及類、物件、封裝、繼承和多型等基本概念。

面向過程的程式設計是以研究和實現解題過程為主體,而物件導向的程式設計是以研究各種物件為主體。

物件是物件導向程式設計的核心,物件導向的程式是由若干物件組成的,通過物件的相互作用來實現整個程式的功能。

類是物件導向程式設計的關鍵,類是同種型別的物件的抽象。

1、物件

物件是對問題領域中事物的抽象。物件具有三個要素,分別是狀態、行為和標識。

物件的狀態是物件的靜態屬性,通常用變數來表示該物件的內部的各種資訊。每個物件有其自己的內部變數,這些變數的值表示了該物件所處的狀態。當物件的變數值發生了改變,則表示該物件狀態發生了變化。

例如,一部手機:品牌是諾基亞,**是1500元, 顏色為銀灰色,這些資訊用物件中的內部變數儲存,為物件的靜態屬性。

物件的行為是物件的動態屬性,也稱為物件的功能。物件的行為在程式中用方法來表示,方法便是一種函式,物件的行為或功能被定義在乙個個函式中。物件導向的程式設計方法中,物件內部包含了描述狀態的各種屬性和對其屬性進行操作的若干方法。

此外,還有物件與其它物件進行通訊的介面,以便和其它物件協作完成某些功能。

物件的標識是用來區分不同物件的識別符號。每個物件都是惟一的,每個物件都具有乙個僅屬於它的惟一的標識,物件的標識是用物件名來表示的。

物件的三個要素:狀態、行為和標識,在計算機實現中分別用物件的變數、方法和物件名來表示。

2、類類是一組具有相同屬性和行為的物件的抽象。類是對現實世界中的實體的高度抽象,是對客觀世界中某些實體的共性的提取。從程式設計角度來說,類是一種自定義的資料型別,通常稱為類型別,類的某乙個具體的物件被稱為類的乙個例項。

類和物件是一般與個別的關係,或者說是抽象與具體的關係。類是乙個模板,由它可以產生具有共同特性的不同的物件。類及類的關係構成了物件模型的主要內容,物件導向程式設計的主要任務就是定義物件模型中的各個類,最後將類例項化為物件。

封裝(encapsulation)就是把物件的屬性和行為結合成乙個獨立的單位,並盡可能隱蔽物件的內部細節。封裝有兩個含義:一是把物件的全部屬性和行為結合在一起,形成乙個不可分割的獨立單位。

物件的屬性值(除了公有的屬性值)只能由這個物件的行為來讀取和修改;二是盡可能隱蔽物件的內部細節,對外形成一道屏障,與外部的聯絡只能通過外部介面實現。

封裝性具有以下優點:

(1)封裝的資訊隱蔽作用反映了事物的相對獨立性,可以只關心它對外所提供的介面,即能做什麼,而不注意其內部細節,即怎麼提供這些服務。

(2)封裝的結果使物件以外的部分不能隨意訪問物件的內部屬性,從而有效地避免了外部錯誤對它的影響,大大減小了查錯和排錯的難度。另一方面,當物件內部進行修改時,由於它只通過少量的外部介面對外提供服務,因此同樣減小了內部的修改對外部的影響。

(3)封裝機制將物件的使用者與設計者分開,使用者不必知道物件行為實現的細節,只需要用設計者提供的外部介面讓物件去做。封裝的結果實際上隱蔽了複雜性,並提供了**重用性,從而降低了軟體開發的難度。

繼承性是物件導向方法中的重要特性。繼承(inheritance)反映了兩個類之間的一種關係:乙個類擁有了另乙個類的所有資料和方法時,稱該類繼承了另乙個類,這兩個類具有繼承關係。

被繼承的類稱為父類或基類,繼承父類所有成員的類稱為子類或派生類。

繼承意味著「自動地擁有」,即子類中不必重新定義已在父類中定義過的屬性和行為,而它卻自動地、隱含地擁有其父類的屬性與行為。繼承允許和鼓勵類的重用,提供了一種明確表述共性的方法。乙個子類既有自己新定義的屬性和行為,又有繼承下來的屬性和行為。

儘管繼承下來的屬性和行為是隱式的,但無論在概念上還是在實際效果上,都是這個類的屬性和行為。當這個特殊類又被它更下層的特殊類繼承時,它繼承來的和自己定義的屬性和行為又被下一層的特殊類繼承下去。因此,繼承是傳遞的。

繼承可分為兩種:單重繼承和多重繼承。單重繼承是指只有乙個父類的繼承;多重繼承是指有乙個以上父類的繼承。

單重繼承的程式結構比較簡單,繼承層次為樹狀結構;多重繼承的程式結構相對複雜,其結構為網狀。j**a語言只支援單重繼承,不支援多重繼承,但j**a語言可通過介面(inte***ce)方式彌補由於不支援多重繼承而帶來的子類不可使用多個父類成員的不足。

在軟體開發過程中,繼承性實現了軟體模組的可重用性、獨立性,縮短了開發周期,提高了軟體開發的效率,同時使軟體易於維護和修改。這是因為要修改或增加某一屬性或行為,只需在相應的類中進行改動,而它派生的所有類都自動地、隱含地作了相應的改動。

多型性(polymorphism)也是物件導向方法的乙個重要特性。多型是指程式中定義的引用變數所指向的物件的具體型別和通過該引用變數呼叫的實際方法在程式設計時並不確定,而是在程式執行期間才確定,即乙個引用變數到底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式**,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式**就可以改變程式執行時所繫結的具體**,讓程式可以選擇多個執行狀態,這就是多型性。

在j**a語言中,多型性主要體現在以下方面:

(1)方法過載。通常指在同乙個類中,相同的方法名對應著不同的方法實現,但是方法的引數構型不同。在編譯時根據實際呼叫方法的引數確定哪個方法被呼叫到。這種稱為靜態繫結。

(2)成員覆蓋。通常是指在子類中和父類中,有相同的變數名或方法名,但變數名的值、方法體的內容不同。當用超類型別的引用變數引用子類物件時,被引用物件的實際型別而不是引用變數的型別決定了呼叫哪個類的成員方法。

這是在執行時動態確定的,稱為動態繫結。

j**a中的多型性是通過綜合運用向上轉型、繼承、覆蓋,過載等實現的。

多型性增強了軟體的靈活性和擴充套件性,在物件導向程式設計中,為了提高程式的抽象程度和簡潔程度,多型應用相當普遍。

j**a程式的基本單位是類,j**a所有的**都是包含在乙個個的類裡面的。類可以認為是一種自定義的資料型別,是構造物件的模板,或者說物件是類定義的的資料型別的變數。乙個類可以包含有成員變數、方法、初始化**塊,甚至還可以包含其它的類(內部類)。

定義類的形式如下所示:

[《修飾符》] class 《類名》 [extends 《父類名》][implements 《介面名》[,《介面名》]]

其中,class,extends和implements是定義類時用到的關鍵字。

關鍵字class用於定義乙個新類,其後是所定義的類的類名。類名的命名方法同識別符號,通常採用有意義的單詞或者單詞組合,首字母通常大寫,如:student,dbconn等。

關鍵字extends用於說明定義的新類是某個已存在的類的子類,即指出新類的父類。這個已存在的父類可以是j**a語言類庫中已有的類,也可以是程式設計者已定義好的類。extends關鍵字體現了類之間的繼承關係。

關鍵字implements用於說明當前定義的新類實現了哪些介面(乙個類可以實現多個介面)。介面是j**a語言實現多重繼承的一種特殊機制,將在4.3節中講述。

修飾符是用來說明類的作用域和其它性質的。修飾符分為以下兩類:

● 訪問修飾符:public、預設訪問。

● 非訪問修飾符:abstract、final、strictfp。

(1) public:說明該類為公共類,可以被所有包中的所有類所使用(不在同一包中時需要先導入)。

(2) 預設訪問:具有預設訪問的類在定義時其前面沒有任何訪問修飾符,其只能被同乙個包中的類所使用,而不能被其它包中的類所訪問。

(3) abstract:使用該修飾符的類被稱為抽象類。抽象類是不能例項化的類,其存在的目的是用於擴充套件(即被子類繼承)。

通常抽象類是它的所有子類的屬性的高度抽象。比如:如果我們進行乙個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣乙個概念,形狀這個概念在問題領域是不存在的,它就是乙個抽象概念,這樣我們可以設計乙個抽象類:

形狀類。

(4) final:說明該類不能有子類,即任何其他類不能繼承自(擴充套件)final類,故稱為最終類。通常這種類的特點是用來完成某種標準功能的類。

final與abstract不能同時修飾乙個類。

(5) strictfp:說明該類中的所有方法**在處理浮點數時將遵守ieee754標準。如果沒有這個修飾符,則方法中所使用的浮點數操作方式可能與平台相關。

【例3-1】下面程式定義了乙個簡單的類。

//檔名:

public class student

public void printstuinfo(){

" "+name+" "+***);

第二章Delphi物件導向的程式設計方法一

delphi的程式語言是以pascal為基礎的。pascal語言具有可讀性好 編寫容易的特點,這使得它很適合作為基礎的開發語言。同時,使用編譯器建立的應用程式只生成單個可執行檔案 exe 正是這種結合,使得pascal成為delphi這種先進開發環境的程式語言。本章中,我們將討論object pas...

結構化程式設計與物件導向程式設計的簡述

二 模組性 每乙個物件都 於乙個單獨的實體,它內部的工作與系統的其他部分是分離的 三 易修改性 在物件導向程式中對資料表現層和工作過程進行小的改動是非常簡單的,類內部的改動不會影響程式的其他部分,因為外邊的程式與這個類的互動是通過乙個公開的介面方法進行的。只要這個方法不改動就不會影響互動。四 可擴充...

第8章程式設計基礎

一 是非題。和loop作用相同,都能終止迴圈。a.對b.錯 2.自定義函式與過程檔案的不同在於自定義函式必須返回乙個值。a.對b.錯 語句只能接收字元型常量。a.對b.錯 4.不管是過程還是函式,接收引數的命令必須出現在被調程式的第一行。a.對b.錯 5.過程檔案可以由若干個過程構成,而過程必須放在...