Java散落知識點總結(一)
1.陣列
1.
<span style="white-space:pre"> </span><span style="font-size:18px;">int[] arr=new int[5];
System.out.println(arr[5]);
//編譯通過,發生執行時異常(陣列越界異常) </span>
2.二維陣列:要理解二維陣列的記憶體儲存結構,陣列是引用資料型別,因此是堆中開闢空間
注意!!由於記憶體的地址是不連續的,這也就解釋了為什麼<strong><span style="white-space:pre"> </span><span style="font-size:18px;">int[][] arr=new int[2][3]; //int[2] 這塊空間儲存的是兩個int[3]的記憶體地址 //注意!!兩個int[3] 記憶體的地址是不連續的</span></strong>
int[ ][ ] arr=new int[2][ ]; //編譯通過
int[ ][ ] arr=new int[ ][3]; //編譯不通過
2.靜態程式碼塊
隨著.class的載入執行,優先main函式的執行,且只執行一次
3.構造程式碼塊<strong> class Testw{ static int num; static { System.out.println(num); } } public class Test01 { static { System.out.println("a"); } public static void main(String[] args) { Test f=null; } } /*output*/ a 只輸出a 應為在Test01的main函式中並沒有載入 Testw.class檔案,因此Testw的靜態程式碼塊不會執行</strong>
在建構函式之前執行,每新建一個物件就會執行構造程式碼塊
<strong><span style="white-space:pre"> </span>class Test{
{
System.out.println("first construct");
}
public Test(){
System.out.println("second construct");
}
}
/*output*/
first construct
second construct</strong>
4.物件建立過程
1.首先載入.class檔案建立物件
2.如果有靜態程式碼塊先執行靜態程式碼塊
3.堆中開闢記憶體為成員變數賦預設值
4.堆中開闢記憶體為成員變數賦初始值
5.執行構造程式碼塊
6.執行建構函式
7.物件在堆中的地址傳給棧中的引用
5.super和this的對比
1.this是指向當前的物件的引用,表示當前物件
2.super表示超類意思
3.當成員函式中(非靜態)的區域性變數與成員變數同名時,使用this解決同名問題
eg: public void setName(String name){
this.name=name; }
4.super是為了解決子類覆蓋父類的成員函式或者成員方法,解決被遮蔽的問題使其可見。
5.在子類建構函式中,首先要呼叫建構函式(super() 呼叫可以省略)但是有一點一定要注意!
當父類的建構函式已經被顯示宣告時候(也就是說預設建構函式已經消失),必須要顯示宣告父類的預設建構函式
否則子類在建構函式時候如果不顯示宣告時,就會報錯。
6.System.out.println(this); //輸出的是當前物件的地址
System.out.println(super); //編譯報錯不通過