1. 程式人生 > >【javase複習】## day2 語法 記憶體分析 ##

【javase複習】## day2 語法 記憶體分析 ##

switch for while 的一些點

1、 if -else 和 三目運算子 A?B:C的區別
這裡寫圖片描述

所以不能用 5>3? System.out.println(“asd”):System.out.println(“asd”);
之類的語句

2、 switch的一些注意事項, 很慚愧,一直都記不清楚,這次打死都牢牢記住。

這裡寫圖片描述
一定要注意switch一定判斷的是變數, 而case後面判斷的一定是常量

如果是變數則不會編譯成功 參考下圖:
這裡寫圖片描述

圖中用num變數作為case判斷的依據, 會報錯

另外注意:

case提供一個入口,如果後面的語句沒有break,則不判斷case是否滿足, 語句全部執行,直到break或者花括號結束。
這裡寫圖片描述

但是有一個例外就是 default 並不是按順序判斷的,不管default寫在哪裡,都是先判斷所有的case,如果都不滿足,才進入default入口,這個時候看default在哪裡,執行default以下的所有語句直到break或者花括號結束

這裡寫圖片描述

3、 廢話
java中不允許寫廢話, 會報錯
例如 while(false) {} 就會GG , 因為{}內語句永遠不會執行,所以必須吧false賦給一個boolean變數, 然後用flag 就可以, 因為編譯時候不知道while會不會執行。

類似的continue也有這個情況
這裡寫圖片描述


這裡也會報錯

4、 標號

    這學期才學的彙編, 終於在高階語言中也看到了標號應用的地方,我覺得有標號還是挺方便的。這裡記一個例子

這裡寫圖片描述

5、 return的存在與否

這裡寫圖片描述

之前也清楚return的用處,但是以為void的函式不能有return,覺得這個return會返回一個null。

陣列的記憶體分析

這一次的複習徹底搞清楚java中所有的東西是怎樣分配記憶體的,之前非常的不清楚,也許也是因為沒有計組和操原的知識,所有的東西只能涵蓋的大致瞭解,不能深入理解其中的意思,而且有些課本上寫的是錯誤的。這裡先記一下陣列的記憶體分析,後面會有物件的記憶體分析,然後靜態資料,之類的。會另開文章

受譚浩強影響。 定義陣列習慣用 int a[] , 雖然在java中也可,卻不明究竟意義。

以後定義都要 int[] arr = new int[50]

逐詞分析:

這裡寫圖片描述

這樣int[]作為一個整體, 顯然比int a[]的結構更加清晰,容易理解。

另外要注意的是記憶體的分配問題:
在java中,jvm管理3種記憶體:

1、 棧記憶體 2、堆記憶體 3、共享資料區

這裡寫圖片描述

這裡先暫時不考慮共享資料區的問題,之後複習static時再說。

對於棧和堆,必須明確:

棧記憶體: 儲存區域性變數,一旦出了作用域,就會在記憶體中失效,釋放空間
堆記憶體: 儲存物件資料,物件一旦被用完,不會立刻從記憶體消失,而是等待垃圾回收期回收,才釋放記憶體。

所以這裡的arr 其實上儲存了是物件int[4]的地址,相當於一個指標,但是java中沒有指標這個東西,所以在函式中進行引數傳遞的時候,直接傳陣列變數進去修改,真實值也會改變,因為確實是通過地址進行儲存物件的記憶體中去修改值,這和c語言系列不同,需要注意。

這裡寫圖片描述

要深入理解new 出來的物件 都在堆記憶體, new一個,堆記憶體就出來一個。new多個 出來多個。
如果對變數進行賦值,則是將棧記憶體中的所儲存的地址進行賦值,而原物件依然存在,只是沒有變數指向他,所以再也找不到了。

這裡寫圖片描述

區域性變數:定義在方法中變數

成員變數都可分為 類變數 和 例項變數

類變數 是靜態變數
類變數 即使沒有建立物件,也會分配記憶體,這點之後講static再複習

這裡寫圖片描述

作用域: 即花括號所屬範圍。

二維陣列相比C語言要容易一點。

這裡寫圖片描述

注意這裡一維中儲存的都是地址。

陣列中最常見的問題:

1. NullPointerException 空指標異常
原因: 引用型別變數沒有指向任何物件,而訪問了物件的屬性或者是呼叫了物件的方法。\

2. ArrayIndexOutOfBoundsException 索引值越界。
原因:訪問了不存在的索引值。