1,異常處理
jvm提供了記憶體回收機制,記憶體回收機制屬於java記憶體管理的一部分,它只是負責回收堆記憶體中分配出來的記憶體,至於程式中開啟的實體資源,如輸入/出流,記憶體回收機制是無能為力的,要正確關閉。通常結合finally塊
當java程式執行try/catch時遇到return或者throw語句時,return或throw會導致該方法立即結束。系統執行完retrun語句之後(注意,finally中如果沒有return語句最終要返回的值是這裡的,並且已經儲存,不管finally中對資料是否修改了,如果finally有return,則根據finally中的返回),而是去尋找是否有finally塊,如果有,系統立即執行finally塊,只有當finally執行完成後,系統才會再次跳回來根據return或throw異常結束方法,如果finally中有return,則不用返回,直接結束
public class Test {public static int t(){int a=5;try{throw new Exception();}catch(Exception e){return a++;}finally{++a;System.out.println("finally:"+a);}}public static void main(String[] args) {System.out.println(t());//finally:7//5}}//如果在finally最後加上return a; 則t()返回的是7
java語言規定,子類重寫父類方法時不能拋出比父類方法類型更多,範圍更大的異常
2,final關鍵詞
修飾資料:編譯時間常量,對基本類型來說是其值不可變,而對於物件變數來說其引用不可再變,如果是形參,則在函數中不能改變這個參數,對於物件變數,很實用,因為物件變數在傳遞時是傳遞其引用,這樣你在方法中對物件變數的修改也會影響到調用語句中的物件變數,當你在方法中不需要改變作為參數的物件變數時,明確使用final進行聲明,會防止你無意的修改而影響到調用方法。
修飾方法:類中所有private 方法被隱式的聲明為final的不能修改,所以final無法覆蓋,即不能被重載,注意這點在繼承時,被聲明為private 的方法並不能被繼承到子類中
修飾類:不能被繼承
在任何內部類中訪問的局部變數都應該使用final修飾,因為對於普通局部變數而言,它的範圍停留在該方法內,當方法執行結束,該局部變數也消失,但內部類可能產生隱式的“閉包”,將使得局部變數脫離它所在的方法繼續存在,如:
public class Test {public static void main(String[] args) {final int a = 1;new Thread(new Runnable() {public void run() {for (int i = 0; i < 100; i++)System.out.println(a);}});}//------1}
正常情況下,程式執行完1處的代碼後,main方法生命週期結束,a的範圍也就結束了,但新線程沒執行完,匿名內部類執行個體的生命週期就沒有結束,將一直訪問a。
3,java程式允許某個方法通過retrun this;返回調用該方法的java對象,但不允許直接return super;甚至不允許直接將super當成一個引用變數使用
4.當程式需要使用內部類時,就盡量使用靜態內部類,而不是非靜態。當使用靜態內部類時,外部類相當於靜態內部類的一個包,因此使用起來比較方便,但另一方面,靜態內部類不能訪問外部類的非靜態成員。Outer.Inner in=new Outer.Inner();普通內部類對象隱式地儲存了一個引用,指向建立它的外圍類對象,不能有static資料和static欄位,可以有static final。
5.java中有一些native方法,對於這些方法,java程式不會為該方法提供實現體,雖然java語言本身是跨平台的,但這些方法依賴於具體的平台,尤其是jdk提供的方法,包含了大量的native方法
6.數組 初始化方式兩種:靜態初始化數組,動態初始化數組
int[] a={5,4,3};int[] b=new int[]{4,5,3};//不能指定數組大小 int[] c=new int[5];