java學習(3)構造器和垃圾收集器、數字與靜態
構造器和垃圾收集器
棧與堆
方法的呼叫和區域性變數在棧,所有的物件在堆
棧頂上的方法是目前正在執行的。
物件的引用變數(就是遙控器)存放在棧上,而物件則存放到堆上
例項變數存放在所屬物件的堆空間上。
建構函式
建構函式並不是一個方法
建構函式沒有返回的型別,並且名稱要與類名一致
分辨方法和建構函式的辦法就是是否有返回型別
如果寫了一個帶有引數的建構函式,那麼應該再寫一個沒有引數的建構函式
建構函式過載,編譯器看的是引數的型別和順序,不是引數的名字
例項變數有預設值,區域性變數沒有
建構函式可以是私有的
在建立新物件時,所有繼承下來的建構函式都會執行。
抽象類作為父類,他的建構函式也會在具體子類創建出例項時執行。
呼叫父類的建構函式使用的是:super(); 如果我們在子類的建構函式裡面不寫,那麼編譯器會自動幫我們新增,只不過新增的是沒有引數的版本
使用this()來從某個建構函式呼叫同一個類的另外一個建構函式,this()只能用在建構函式中,且必須是第一行語句。super()和this()不能兼得。
物件的生命週期
當最後一個引用消失的時候,物件就會變成可回收的。
對null引用執行圓點運算子會在執行期遇到NullPointerException這樣的錯誤
數字與靜態
Math方法
最接近全域性的方法。
這個類中的所有方法都不需要例項變數值,因為這些方法是靜態的。
靜態(static)
靜態的方法是以類名來呼叫的,靜態的方法不需要類的例項
可以使用私有的建構函式來限制非抽象類被初始化
靜態的方法不能呼叫非靜態的變數,也不能呼叫非靜態的方法
以引用變數名呼叫靜態方法的程式程式碼可以實現,但是不推薦使用
靜態變數的值對於所有的例項來說都相同,同一類所有的例項共享一份靜態變數
靜態變數會在該類的任何靜態方法執行前就初始化。
final
final的變數代表你不能改變它的值。
final的方法代表你不能覆蓋掉該方法。
final的類代表你不能繼承該類(也就是建立子類)
總結一下(這塊真的有點亂啊)
變數用static代表這是能夠修改的全域性變數,變數用final代表這是不能修改值的變數(可以看成是全域性的),abstract不能修飾變數。
類用abstract修飾表示是類本身不能宣告例項,只能由子類來宣告例項;類用final修飾表示類不能有子類來繼承;static不能修飾類。
方法用abstract修飾那麼該類也是abstract,表示該方法必須由子類覆蓋;方法用final代表子類中不能覆蓋該方法;方法用static表示該方法的呼叫時用類名來實現的,不需要例項。
autoboxing(自動裝箱)
包裝型別(Interger)和primitive主資料(int)可以相互轉換
可以用在很多的地方:方法的引數、返回值、Boolean表示式、數值運算、賦值
包裝也有靜態的實用性方法!(將String轉換成primitive主資料型別:Integer.parseInt)、(將primitive主資料型別轉換為String Double.toString)
數值轉換成String,最簡單的方法是將數字接上現有的String String doubleString = “ ” + d;
數字的格式化
呼叫靜態的String.format()並傳入值與格式設定
格式化說明的格式:%[argument number] [flags] [width] [.precious] type
format()函式不是用的過載實現的,而是使用的java的一項新的功能:可變引數列表
日期
Date Today = new Date();
String.format("%tA, %<tB %<td", Today);
操作日期可以使用:java.util.Calendar
Calendar cal = Calendar.getInstance();
靜態import
可以少打幾行程式碼,但是會使程式碼變得難以閱讀
11、異常處理
使用try/catch塊告訴編譯器呼叫方法有風險的
異常時一種Exception型別的物件
方法可以抓住其他方法所丟擲的異常。異常總是會丟給呼叫方。會丟擲異常的方法必須要宣告他有可能會這麼做
finally:無論如何都要執行的部分
異常時多型的,以異常的父類來宣告會丟擲的異常
如果不想處理異常,可以把它duck掉來避開,但這是在踢皮球
異常處理規則:如果只帶有finally的try必須要宣告異常