本文主要用來記錄一些不容易記住的Java基礎(chǔ)知識點步脓,不定期更新...
- 類的加載順序
(1) 父類靜態(tài)代碼塊(包括靜態(tài)初始化塊罗捎,靜態(tài)屬性观谦,但不包括靜態(tài)方法)
(2) 子類靜態(tài)代碼塊(包括靜態(tài)初始化塊,靜態(tài)屬性宛逗,但不包括靜態(tài)方法 )
(3) 父類非靜態(tài)代碼塊( 包括非靜態(tài)初始化塊坎匿,非靜態(tài)屬性 )
(4) 父類構(gòu)造函數(shù)
(5) 子類非靜態(tài)代碼塊 ( 包括非靜態(tài)初始化塊盾剩,非靜態(tài)屬性 )
(6) 子類構(gòu)造函數(shù)
其中:類中靜態(tài)塊按照聲明順序執(zhí)行雷激,并且(1)和(2)不需要調(diào)用new類實例的時候就執(zhí)行了(意思就是在類加載到方法區(qū)的時候執(zhí)行的)
- Java中無需強制向下轉(zhuǎn)型關(guān)系圖
- 從本質(zhì)解決i++與++i相關(guān)筆試題
需要理解Java指令的執(zhí)行過程替蔬,i++會先將變量i推入棧,再對變量i所在內(nèi)存進行自增屎暇。++i則是先對變量i所在內(nèi)存進行自增承桥,再將該內(nèi)存推入棧。只需記住這兩點根悼,各種圍繞其展開的筆試題就很容易解決了凶异。
public static void main(String[] args){
int i = 0;
//以下注釋中i代表i在內(nèi)存中的真實值,$i代表棧中i副本的值
System.out.println(i++); //i入棧,$i=0挤巡;然后i++,i=1剩彬;執(zhí)行println方法,彈出棧頂$i矿卑,故輸入0
System.out.println(i); //如上分析喉恋,i=1,輸出1
System.out.println(++i); //先i++,i=2母廷;然后i入棧轻黑,$i=2;然后執(zhí)行println方法琴昆,彈出棧頂$i氓鄙,故輸入2
System.out.println(i); //如上分析,i=2业舍,輸出2
i = i++ * 3 + 5; //i入棧,$i=2抖拦;i++,i=3舷暮;棧頂操作3*$i=6蟋座;棧頂操作6+5=11;再將棧頂?shù)闹低迫胱兞縤中覆蓋原先的值3脚牍,故i為11
System.out.println(i); //如上分析向臀,i=11,輸出11
}
- 自動拆箱的空指針錯誤
public class SimpleTest {
static class Value{
public Integer value;
}
@Test
public void test(){
Value value = new Value();
Integer i = true ? value.value : 1;
// System.out.println(true ? value.value : 1);
}
}
由于自動拆箱/裝箱機制诸狭,使用三目運算時券膀,若結(jié)果中同時存在包裝類型和基礎(chǔ)類型,那么Java會將包裝類型轉(zhuǎn)換為基礎(chǔ)類型驯遇。注意芹彬,即使你的代碼要求的是返回包裝類型,Java也會先計算出基礎(chǔ)類型的結(jié)果后叉庐,再將其轉(zhuǎn)換為包裝類型舒帮。