物件導向程式設計(Object-Oriented Programming),是目前相當熱門的一種程式設計概念,而Java 本身就是一個物件導向式的語言,物件導向式的設計可以讓你的程式不在是只能用在一個程式之中,而是可以一再的被利用到其他的程式之中,這將讓程式設計更加的有彈性與擴充性。Java 本質上提供了一個良好的物件導向設計程式撰寫平台,但是要設計一個具有良好架構的物件導向程式,讀者還是必須先了解物件導向的設計觀念與基本精神,在這個章節中筆者將會用一些生活化的範例來協助讀者了解物件導向的觀念。
※ 何謂物件(Object)與類別(Class)
在物件導向的觀念中最容易讓人產生疑惑的就是類別(Class)與物件(Object),到底何謂類別何謂物件,此兩者之間有具有何種關係?雖然常常聽到這兩個名詞,但大部份的解釋都相當的抽像,所以還是有部份的人沒有辦法弄清濋。在Java 程式語言中類別的宣告使用了class這個關鍵字:
存取修飾字 修飾語 class 類別名稱 { //屬性與方法敘述 } |
存取修飾 | 同一類別 | 同一套件 | 子類別 | 全域 |
private | OK | | | |
default | OK | OK | | |
protected | OK | OK | OK | |
public | OK | OK | OK | OK |
接著讓我們先看一個簡單的類別範例:
public class Dot{//宣告一個名稱為Dot的類別 char style='*'; //設定點的圖樣 public void setStyle(char type){ style=type; } //畫出一個點於螢幕上 public void drawDot(){ System.out.println(style); } } |
這個範例中,我們使用class 關鍵字宣告了一個類別名為Dot,而在這個類別裡包含了一個char 型態style 的變數用來儲存點的圖樣,若外還有二個方法,一個是設定點的圖樣,另一個是畫出一個點於螢幕上,接著讓我們將這個類別進行編譯:
編釋成功後會產生Dot.class 檔,這個檔案就代表著Dot 類別,我們可以把Dot 類別當成一個程式的設計圖,我們可以將許多不同功能的程式寫成許多個不同的類別存放在電腦之中。當我們需要用到該功能的類別時,必須利用Java VM 將類別實體化(instance)或是實作,並載入到記憶體當中,一但類別被載入至記憶體中,便成為物件,也就是說同一份的類別,其實可以產生許多個獨立的物件,各別存放於記憶體之中,就如利用同一份房屋設計圖,可以蓋出許多類型相同的房子,但每個房子卻又是獨立個體。
接著讓我們撰寫另一隻程式將Dot 實作成多個獨立的Dot 物件:
public class Draw { public static void main(String args[]){ Dot dot1=new Dot();//實作Dot物件並存放於dot1物件中 Dot dot2=new Dot();//實作Dot物件並存放於dot2物件中 dot1.setStyle('&');//設定dot1的圖樣為 & dot2.setStyle('#');//設定dot2的圖樣為# System.out.println("dot1物件的圖樣為 :"); dot1.drawDot();//印出dot1物件的圖樣 System.out.println("dot2物件的圖樣為:"); dot2.drawDot();//印出dot2物件的圖樣 } } |
【執行結果】:
在這個範例裡Draw.class 本身其實也是一個類別,只是我們執行java 命令由Java VM 將Draw 實作成物件並載入記憶體之中,由於Draw 程式中含有main 程式進入點,因此Java VM會自動為我們呼叫main 方法。一開始首先利用new 關鍵字將先前建立的Dot 類別分別實作成兩個物件並指派至dot1 與dot2 變數中(讀者可以想成我們己經利用Dot 設計圖於記憶體之中蓋了兩座獨立的房子),接著我們將dot1 物件的圖樣設定為 &,dot2 物件圖樣設定為 #,接著我們分別呼叫兩個物件的drawDot()方法,將圖樣印出於螢幕中。由輸出結果可以得此兩個物件皆是由同一個Dot 類別所產生出來,同樣都擁有一個style 字元變數,與二個分別為設定與繪出圖樣的方法,但是卻各自是獨立的,當我們設定dot2 中的style 變數時,並不會影響到dot1 的sytle 變數值,這就是物件與類別的差別。
物件特性,讓我們可以只撰寫一個類別,在執行時在依我們的需求產生不同行為的物件,可以讓程式撰寫更簡化更具有結構性。
※ 物件導向的2個精神與3個特徵
2個精神 |
Abstraction(抽像化):物件抽像化能物件被良好定義與描述,並保持中立性. |
Inheritance(繼承):繼承給序程式更高的延展性與拓展性. |
3個等徵 |
Inheritance(繼承): |
Encapsulation(封裝): |
Polymorphism(多型): |