總網頁瀏覽量

2013年1月27日 星期日

物件導向

物件導向是程式設計非常重要的觀念

物件導向是一種寫作風格

物件導向程式設計就是以物件導向的風格寫程式

以個人經驗需要理論跟實作並重才能理解

一邊將物件導向的定義搞懂,一邊寫程式實作

這樣才能記得久



類別:類別是建立物件所參考的藍圖(blueprint)或曰雛形,
多個相同屬性和行為的物件集合在一起,然後寫程式。
在java裡面,類別由欄位(field)與方法(method)所組成。欄位就是變數;方法就是函式(function)。
ps:個人覺得稱method為函式比較貼切,觀念就跟高中數學的f(x)一樣

例如:
假設要寫偵探相關的角色扮演遊戲,
這遊戲不只一個偵探角色,
那麼建立角色以前,我們要有個藍圖讓系統參考。
他才知道所謂的偵探大概有什麼特徵跟功能
首先宣告偵探這個類別告訴電腦偵探有什麼特徵跟功能。
在這遊戲中偵探都有名字、年紀、特殊能力、抓兇手等欄位與方法
宣告如下︰

class detective{

int age;
String name;
String skill;
public void catch_murderer(){

System.out.println("catch murderer");
}

}



物件:是類別的具體實作。
在java裡面,物件就是依照類別的欄位與方法,配置一塊記憶體。
使用類別的變數與方法皆要透過物件。

我們希望在遊戲裡面有叫柯南與平次的偵探
那麼宣告類別變數conan與piengchi
分別建立物件(new)並初始化(detective()),conan與pienchi皆指向detective類別的物件。

detective conan = new detective();
detective piengchi = new detective();

以上宣告,系統透過detective類別建立conan、piengchi物件。
conan與piengchi並非物件的本身,而是參考型態的變數,分別指向物件的記憶體位置。物件變數(conan、piengchi)與detective物件之間建立參照關係。

要使用類別筆須透過物件
透過物件使用類別的欄位與方法
conan.name="conan";
conan.skill="soccer";//conan的能力是足球
piengchi.name="piengchi";
piengchi.skill="kendo";//平次的能力是劍道
conan.catch_murderer();




物件導向的好處

讓程式碼可以重複利用,不用再製造一個輪子(make a wheel)。




三大特徵:

封裝(encapsulation):
設定權限保護資料,使用private來實行封裝。
將類別內部的變數(field)與函式(method)按照私有成員與公有成員劃分清楚,並且包裝在同一類別之中,讓私有成員資料受到保護。
避免直接存取類別的變數,給予不當的值或操作,造成困擾。
通常將變數設定為private
將函式設定為public
類別外部的程式藉由public去存取或設定private的變數




繼承:extends

改寫(overriding):翻譯成"覆載",實在很難懂。翻譯成"改寫"比較貼切。



多型



在java之中:

1.
不宣告名字也可以用類別的函式。
匿名物件(Anonymous):不宣告名字的物件。
new classname().method();
new 類別名稱().函式();
特徵:函式執行完畢即從記憶體中釋放。

2.
一個.java檔案同時有多個類別的話,原始檔案經過編譯之後,會根據原來的類別建立相同數目的類別檔(.class)

3.參數(parameter)與引數(argument):
在函式括號裡所定義的變數稱為參數。
呼叫函式時所傳遞的值或變數稱為引數。
void setAge(int age);//age是參數
setAge(17);//17是引數
setAge(num);//num是引數


4.建構子可以宣告成private,不過如此一來就無法利用new XXX()建立物件。錯誤訊息如下:
error: detective() has private access in detective
detective conan= new detective();


5.可以用陣列儲存物件,稱之為物件陣列。
首要宣告陣列變數,配置記憶體給陣列
宣告方式:
類別名稱[] 陣列名稱 = new 類別名稱[陣列大小];

接著針建立物件並讓每格陣列指向相對的物件
宣告方式:
陣列名稱[index]=new 類別名稱();

沒有留言:

張貼留言