最近在圖書館看書,偶然發現書架子上一本Java的書《Head First Java》。以前看過《Head First 設計模式》,感覺很不錯,令人印象深刻。於是就把這本《Head First Java》借了回來。明天就是五一節了,導師的項目感覺進展比較順利,早上就偷偷看看這本《Head First Java》,並把一些感覺重要的記錄下來,算是拾遺了。
1,接口一定是public的,這一點毋庸置疑。接口的成員變量一定是public static final型的,不管你寫不寫這些關鍵字。就算你在接口中這樣定義變量: int num=0;(注意,IDE一定會提示你對其進行初始化)。實際上編譯器會自動加上public static final。接口的成員方法一定是public abstract的。哪怕你這樣定義方法: void show(); (注意一定要加;)。實際上編譯器會自動加上public abstract。
2,每個構造函數可以選擇調用super()或this(),但是不能同時調用。super()和this()不能兼得。要顯示調用super()或this()的話必須在構造函數的第一行。不顯示調用也可以,編譯器會自動給加上沒有參數的那個super()的。但是要是父類沒有沒有參數的構造函數,而子類又沒有顯示調用父類的帶參數的構造函數,那就壞事了。
3,大家都知道Object是所有類的父類。在子類調用new在堆中創建實例化對象的時候。實際上是先調用其父類的構造函數創建一個父類的實例化對象。這樣一來堆中的子類對象就像是洋蔥結構,父類對象在裏面,子類多餘父類的部分在外邊。一層包一層。
4,如果一個類中有另一個類的實例化對象的引用,這樣的話在堆中另一個類的實例化對象並不存在於這個類的實例化對象中,並不是洋蔥結構的。而是在本類中保持一個引用變量的空間,另一個類獨立的在堆中開闢一塊區域存儲實例化對象,這個引用指向那個新開闢的即可。
5,如果類已經是final的,再標記final的方法就很多餘了。如果一個類不能被繼承,那麼他的所有方法都不能被覆蓋。final方法就沒有必要標記了。
6,如果類只有靜態的方法,你可以將構造函數標記爲private的以避免被初始化。
7,String.format()可以格式化字符串:
public class Format {
public static void main(String args[]){
String str=String.format("%,d",23456);
System.err.println(str);
}
}
//結果:
23,456
public class Format {
public static void main(String args[]){
String str=String.format("%,.2f",23456.6633);
System.err.println(str);
}
}
//結果:
23,456.66
8,String.format還可以格式化日期。
public class Format {
public static void main(String args[]){
Date today=new Date();
System.err.println(String.format("%tc", today));
System.err.println(String.format("%tr", today));
System.err.println(String.format("%tA ,%tB %td",today,today,today ));
}
}
//結果:
星期三 四月 30 09:40:00 CST 2014
09:40:00 上午
星期三 ,四月 30
9,使用斷言:斷言機制允許在測試期間向代碼中插入一些檢查語句。當代碼發佈時,這些插入的檢測語句將會被自動移走。就是說在Debug階段斷言語句是有效的,但是在Release階段是無效的。斷言機制缺省情況下是關閉的,在Eclipse中啓用斷言的方法:Run——Run Configurations——Arguments——VM Arguments中加上-ea即可。
assert的使用有兩種形式:
1,assert 條件;
int x=0;
assert x>0;
//運行結果:
Exception in thread "main" java.lang.AssertionError
at com.wjy.connect.TestLog.main(TestLog.java:42)
2,assert 條件:表達式;
int x=0;
assert x>0:"你想傳給AssertionError的信息。";
//運行結果:
Exception in thread "main" java.lang.AssertionError: 你想傳給AssertionError的信息。
at com.wjy.connect.TestLog.main(TestLog.java:42)