||
物件導向的設計方式是 Java 的核心,即使是最簡單的 Java 程式,它的寫作方式仍然是物件導向的概念。「資料」和「程式碼」是電腦程式的兩大核心。
類別與物件:
「物件」來自於「類別(Class)」。
類別定義了物件的「成員(member)」,成員包含了物件的屬性(物件資料)和方法(物件行為)。
利用「類別」定義的規範產生「物件」的動作稱為「實體化(instantiate)」,每一個由類別產生的物件稱為該類別的「實體(instance)」。
定義出一個新的類別也就是定義了一個新的資料型態。
物件導向的三大特性:
封裝(encapsulation)、繼承(inheritance)、多型(polymorphism)。
定義類別:
類別的定義必須使用關鍵字「Class」來完成。
類別名稱採用「Pascal」的命名方式,第一個字母採用大寫,其餘的字元是小寫。
定義在類別中的變數或是資料稱為「實體變數(instance variable)」,或稱為「資料成員(data member)」。
定義在類別中的函式稱為「方法」,或是「成員方法」。
實體變數和方法的名稱採用「Camel」的命名方式,名稱中第一個單字都會以小寫字母表示,如果該名稱是多個單字組合而成,那第一個單字的第一個字母會採用小寫,其餘單字的第一個字母採用大寫字元。
建構子的使用:
物件導向的程式提供了「建構子(Constructor)」的機制,讓設計者可以在建立物件時立即初始化資料成員。 類別一定會有建構子,但如果在定義類別時,未曾同時定義建構子,則該類別在實體化時 JVM 會自動建立一個不做任何事的建構子。
方法多載(Method Overloading): 方法多載,又可以稱為「重載」、「覆載」,主要目的在於實現物件導向中的「多型」的精神。物件導向程式中允許同一個類別中可以定義相同名稱的方法,這種現象就是「同名異式」。
|
類別的繼承:
繼承的主要目的是在於當我們定義新類別時,可以不需要重覆的定義成員變數或是成員方法。其精神在於可以「重覆」的使用程式碼。當然,它也包含了新類別擴充性的精神。
Java 在繼承的機制上是採用「單一繼承」的方式,也就是說,一個類別作多只能直接繼承自另一個類別。 在 Java 中,如果某個類別要繼承自另一個類別,再宣告衍生類別時,需要使用「extends」關鍵字。 Java 中所有類別都是衍生自「Object」類別。所以,如果類別沒有明確的指定副類別為何,再編譯時,類別都會自動繼承 Object 類別。 |
this 的使用:
「this」只能在類別中使用,它是用來參考物件實體本身,也就是說:「this」儲存的是物件本身的位址。Java 程式在編譯時,會自動將類別中的成員加上「this」。
「this( )」的「( )」中要傳入適當的參數,Compile 會根據傳入的參數型態找到適當的建構子並執行。 使用「this( )」的方式呼叫另一個建構子的語法只能使用於建構子中,不能在一般的方法中使用這樣的敘述。再則,此行敘述必須置放於建構子的第一行中。
|
super 的使用:
「this」用來參考物件實體本身,而「super」則會參考到目前類別的父類別,這裡所謂的父類別是指宣告類別時,「extends」關鍵字之後的類別。 子類別的建構式中可以利用「super( )」來呼叫父類別的建構式。如果子類別中並沒有特別指定需要呼叫父類別中的哪一個建構式時,Compiler 會自動呼叫父類別的預設建構式。
|
修飾字:某些修飾字可以混合使用,不在乎出現順序。
private:
public:
protected:
存取修飾字元的有效範圍:
位置 |
private |
無修飾字元 |
protected |
public |
同一類別 |
● |
● |
● |
● |
同一套件中的子類別 |
|
● |
● |
● |
同一套件,但不是子類別 |
|
● |
● |
● |
不同套件的子類別 |
|
|
● |
● |
不同套件,也不是子類別 |
|
|
|
● |
final:
程式可以在宣告時同時指定「final」變數的值,或者在第一次使用到「final」變數時指定變數的值。但 final 變數的值一但設定後,變數的值就不可以再更改了。
物件變數:程式中也不能在改變該物件變數的參考,但可以改變該物件變數所指到的資料內容。
資料成員:必須於宣告時立即指定該資料成員的值,而且無法再變更。
類別:該類別無法被繼承。
abstract:
只可以套用餘類別以及函式上。
類別:只能用來被繼承,而且不能夠被實體化。
類別成員方法:只有名稱、參數內容和回傳型別的定義,不能有實做的部份。
和「final」相比,「abstract」類別無法被實體化而必須衍生子類別;而「final」類別可以被實體化,但無法衍生子類別。
static:
可以套用於變數、資料成員、函式。
載入(不是實體化)時,即被配置空間。
不管該類別有幾個實體,「static」變數或函式都只有一個。
不需將類別實體化就可以直接使用。
Static initializer:只在類別被載入(不是實體化)時才會被執行,而且只執行一次。
Class Static_Test{ Static int age = 10;
Static{ age += 1; } } |
native:
transient:
synchronized:
volatile: