在一個檔案中可以定義數個類,但只能有一個類被設定為public,檔案名稱主檔案名必須與這個public的類同名。
在定義類時,有一個基本原則是:信最小化公開。就是盡量通過方法來操作對象,而不直接存取對象內部的域成員。
靜態方法中沒有this參考名稱。
Java在使用到類時才會載入類至程式中。如果在載入類時,希望先執行一些類的初始化動作,可以使用static定義一個靜態區塊,並在當中編寫載入時的初始化動作。
傳回值類型不可用做方法重載的區別根據。
編譯器在處理重載方法、裝箱問題和不定長度參數時,會一句下面的順序尋找符合的方法:
1. 尋找在還沒有裝箱動作前可以符合參數個數與類型的方法
2. 嘗試裝箱動作後可以符合參數個數與類型的方法
3. 嘗試設有不定長度參數並可以符合的方法
4. 編譯器找不到合適的方法,報告編譯器錯誤
不定長度參數:
publc class mathtool
{
public static int sum(int ... nums)
{
int sum=0;
for(int num :nums)
{
sum += sum;
}
return sum;
}
}
實際上nums是一個數組。(即int[] nums)
在方法上使用不定長度參數時,記得必須聲明參數必須設定在參數行的最後一個。
例如:
public void someMethod(int arg1 , int arg2 , int... vargs);
public void someMethod(int... vargs,int arg1,int arg2); //不合法
無法使用兩個以上不定長度參數。
垃圾收集:
在Java中並沒有解構函式,但有finalize()方法,它被聲明為protected,finalize()會在對象被回收時執行,但不可以將它當做解構函式使用,因為不知道對象資源何時被回收。
如果確定不再使用某個對象,可以在參考至對象的名稱上指定null,表示這個名稱不再參考至任何對象。不被任何名稱參考的對象會被回收資源。
可以使用System.gc()建議程式進行垃圾收集,如果建議被採納,則對象資源會被回收,回收前會執行finalize()方法。
繼承
在Java中,所有的類都直接或間接地繼承了java.lang.Object類。
在擴充某個類之後,可以一併初始化父類的建構函式,已完成響應的初始化動作,這可以使用super()方法來達到,它表示調用基底類的建構函式。super()必須再建構函式一開始就調用,在子類的建構函式中,如果不用super()指定使用父類中的哪個建構函式來初始,則預設會調用父類中無參數的建構函式。
重寫方法
可以使用super()方法在衍生類別中調用基類的建構函式,使用super.methodName()調用父類的方法。
重寫方法時需要注意的是,可以增大父類中的方法許可權,但不可以縮寫父類中的方法許可權。也就是若原來成員時public,不可以在父類中重寫它為private或protected。
Object類
在Java中,每個類都直接或間接繼承自Object類。
Object類定義了幾個方法,包括protected許可權的clone()、finalize()以及public許可權的equals()、toString()、hashCode()、notify()、notifyAll()、wait()、getClass()等。除了getClass()、notify()、notifyAll()、wait()等方法之外其他都可以在繼承後加以重寫,因為這些方法都被聲明為final,無法重寫。
方法 |
說明 |
toString() |
對對象的文字描述 |
getClass() |
返回對象於執行期間的Class執行個體 |
getName() |
取得類名稱 |
hashCode() |
返回改物件的雜湊碼(Hash Code) |
equals() |
比較對象的記憶體位址是否相同 |
Clone() |
複製對象本身 |
要支援複製自身的對象,定義類時必須實現Cloneable介面。如果不實現這個介面的類,其執行個體的clone()方法被調用時,會出現CloneNotSupportedException異常。Java中的Clone()方法是繼承自Object,為了方便直接調用,將其存取許可權從protected改為public。
如:
public class Table implements Cloneable //要實現Cloneable
{
...
public Object clone() throws CloneNotSupportedException
{
Table table = (Table) super.clone(); //調用父類的clone()來複製
}
...
}
改變複製對象的內容,對原來內容不會有影響。
final關鍵詞
final關鍵詞可以使用在變數聲明時,表示改變數一旦設定之後,就不可以再改變改變數的值。
如:
final double PI = 3.14159;
public final double getRadius() {....}
如果在定義方法成員時使用final,則表示該方法成員無法再被子類重寫。
多態
多態實現指的是使用同一個實現介面,以實現不同的對象執行個體。多態實現在物件導向上是為了降低對實現介面的依賴程度,進而增加程式架構的彈性與可維護性。
要實現對象上的方法必須使用對應類型的實現介面,而如果使用不正確的類型來轉換對象的實現介面,則會發生java.lang.ClassCastException異常。
抽象類別:
在Java中定義類時,可以僅聲明方法名稱而不操作其中的邏輯,這樣的方法稱為抽象方法。如果一個類中包括了抽象方法,則該類稱為抽象類別。抽象類別是擁有未實現方法的類,所以它不能被用來產生對象,它只能被繼承擴充,並於繼承後實現未完成的抽象方法。在Java中聲明抽象方法與抽象類別,要使用abstract關鍵詞。
介面:
實現某介面的類並不屬於某一個類,一個對象上可以實現多個介面。
介面的目的在於定義一組可實現的方法,實現介面的類必須實現該介面所定義的所有方法。只要對象有實現某個介面,就可以通過該介面來實現對象上對應的方法。
介面的聲明時使用interface關鍵詞,生命方式如下:
[public] interface 介面名稱
{
使用權限設定 傳回型別 方法(參數列);
。。。
}
在聲明介面時方法上的使用權限設定如果省略的話,預設的是public。
在定義類時,可以使用implements關鍵詞來指定要實現哪個介面,介面中所有定義的方法都要實現。