1.靜態方法什么時候初始化,在main前還是main后
?在main方法后,靜態方法是屬于類的,只有在調用時才初始化(main例外,main的調用是在初始化工作完成后程序進入運行狀態時),但靜態方法在內存中只有一份;

2.構造函數與繼承的關系
子類的構造函數內會包含一個父類構造函數,因為在子類構造函數第一行會默認調用父類構造函數,如果覆寫該行則可以自行控制父類構造函數版本;可見得父類構造函數和子類構造函數得關系是“繼承”不是“覆寫”,(每個)子類構造函數繼承(包含)父類構造函數的一個版本,并可以有自己的部分,類似繼承,子類不完全繼承父類方法并可由自己的方法,父類私有不能繼承。

3.接口沒有構造函數的原因
1.接口里的方法完全抽象構造函數沒有實現體,無意義
2.接口為了實現多繼承,子類構造函數必須調用父類構造函數,如果接口有構造函數子類不知道調用哪個父類構造函數

4.String與StringBuffer

String類用來表示那些創建后就不會再改變的字符串,它是immutable的。
而StringBuffer類用來表示內容可變的字符串,并提供了修改底層字符串的方法。


--當我們進行字符拼接時,請使用StringBuffer類而非String類,因為前者將比后者快上百倍。


的確,在程序的太多場合我們都會進行字符串拼接工作,簡單的代碼示例如下:


String str="You are nice.";
str+="I love you so much.";


如果用StringBuffer類的話,代碼如下:


StringBuffer str= new StringBuffer("You are nice.");
str.append("I love you so much.");


??????? 從表面看來String類只用一個加號(+)便完成了字符串的拼接,
而StringBuffer類卻要調用一個append()方法,是否實現起來更簡潔,更單純呢?其實不然,
讓我們了解一下程序運行內部發生了哪些事情:


??????? 經編譯后程序的bytecode(字節碼)展示出了實質:? 在用String類對象直接拼接時,
JVM會創建一個臨時的StringBuffer類對象,并調用其append()方法完成字符串的拼接,
這是因為String類是不可變的,拼接操作不得不使用StringBuffer類(并且--JVM會將"You are nice."和"I love you so much."
創建為兩個新的String對象)。
之后,再將這個臨時StringBuffer對象轉型為一個String,代價不菲!可見,在這一個簡單的一次拼接過程中,
我們讓程序創建了四個對象:兩個待拼接的String,一個臨時StringBuffer,
和最后將StringBuffer轉型成為的String--它當然不是最初的str了,這個引用的名稱沒變,但它指向了新的String對象。


??????? 而如果直接使用StringBuffer類,程序將只產生兩個對象:
最初的StringBuffer和拼接時的String("I love you so much."),
也不再需要創建臨時的StringBuffer類對象而后還得將其轉換回String對象。


??????? 可以想象,當我們的字符串要被循環拼接若干段時,
用String類直接操作會帶來多少額外的系統開銷,生成多少無用的臨時StringBuffer對象,
并處理多少次無謂的強制類型轉換哪。

5. equals() 和 ==?
???equals() 比對象值,即屬性是否相等?
?? ==比引用,地址
?? 在編譯時期確定的兩個字符串對象引用相等(==)
?? 不在編譯期確定的兩個字符串字符串引用不相等