發現本身的腦子愈來愈很差使了,不少東西很容易迷糊或者忘掉,因此仍是記起來,免得又迷糊,忘掉了。java
--------------------------start正則表達式
增強否循環其實就是語法糖,對循環的一種包裝。數組
對於擁有迭代器的類,如ArrayList,LinkedList或者其餘集合類,編譯後實際上是轉換成了 迭代器進行的。spa
對於沒有迭代器的,如數組,會被轉換成普通的for循環。.net
class 反編譯後:設計
對於實現了 Iterable 都是能夠迭代的,本接口相似於 可迭代的 一種標識(跟Serializable 差很少吧,不過須要實現裏面的方法)3d
Iterable 跟 Iterator代理
都是接口,不過Iterable 更像是能力標識接口,Iterator 更像是實現功能接口。code
都是要實現方法,能夠經過匿名內部類的方式。對象
TIJ4 P243-P244
單繼承或實現中:
在父類方法中,子類能夠拋出一樣的異常,或者拋出更小的,更細緻的異常。即:子類異常不能比父類異常更大。
在父類方法中,沒有拋出任何異常,子類也沒法拋出異常。即:子類沒法憑空拋出異常。
繼承且實現同時有:
當兩個父類(一個抽象類,一個接口)中同一個方法(方法名,參數列表都全同樣),拋出的兩個異常都是不相同的(兩個異常沒有繼承關係),那麼子類中的方法沒法拋出異常,必須進行捕獲。。。
當父類構造器中有某異常聲明時,子類必須拋出次異常,且能夠拋出其餘異常,(由於子類構造器會調用父類構造器,若是將super()用try catch 捕獲,會顯示,super()必須在第一行)
TIJ4 P270-P271
收穫:看完這個章節之後,對java中的那種繼承貌似更有了一點感觸,之前一直以爲繼承就是爲了抽象出共同的屬性,或者方法,接口更是沒有什麼用。。。僅僅是爲了子類可替換性?可是今天看了異常,以爲繼承、抽象是很重要的,尤爲是你定義好要拋出什麼樣的異常。這樣設計,子類就能夠很規範,何時子類必須捕獲本身的異常,何時子類也能夠拋出更細緻的異常。
總感受那種高深的話在嘴邊,但卻又沒辦法說出來。。。。。。也可能只是有了一丁點感觸,卻又不是很深入,沒能用本身的語言表達出來。
TIJ4中的String 部分中關於正則的都沒有看,看不懂。等先入門了正則表達式在看。
靜態變量
靜態初始化塊
變量
初始化塊
構造器
若是有繼承父類,則 先初始化父類, 在父類中 也是 這個順序
靜態變量
靜態初始化塊
變量
初始化塊
構造器
所以
父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
父類--變量
父類--初始化塊
父類--構造器
子類--變量
子類--初始化塊
子類--構造器
Java基礎知識之初始化——定義時初始化和構造器初始化的差別?
定義時初始化和構造器初始化的差別:
變量定義時初始化的次數是一次,而構造器初始化的次數是兩次。
一個類的準備工做包括三部分:
一、加載。這是由類加載器執行的。該步驟將查找字節碼(一般在classpath所指定的路徑中查找,單這並不是是必須的),而且從這些字節碼中建立一個Class對象。
二、連接。在連接階段將驗證類中的字節碼,爲靜態與分配存儲空間,而且,若是是必須的話,將解析這個類建立的對其餘類的全部引用。
三、初始化。若是該類具備超類,則對其超類初始化,執行靜態初始化器和靜態初始化塊。
初始化被延遲到了對靜態方法(構造器其實也是靜態的)或者很是數靜態域進行首次引用時才執行。(new 或者 使用靜態方法,常量等,都會引發初始化)
Class.forName與Class.class的區別。
Class.forName會致使靜態域的加載 Class.class則不會。即 不會觸發第三步
靜態編常量:static final
當訪問static final 的常量的時候,也不會觸發初始化,且僅僅會連接一次。
普通靜態常量:static
當訪問static的常量時,會觸發初始化,初始化域會被觸發,連接每次都會被觸發。
即:每次都要爲這個靜態常量進行分配空間,初始化該存儲空間。
TIJ4 P319-P320
一直以爲很神奇,動態代理究竟是咋麼個回事,爲何會生成一個這樣子的類,爲何會調用。
參數能夠用在類名後,
也能夠寫在方法的返回參數前。
若是 類中有
那麼方法中,屬性中均可以使用T,使用泛型。
若是隻是想單純的對某個方法使用泛型,就在方法的返回值前添加。
以前,一同窗給我了一個截圖,經過枚舉調用方法。
相似截圖
UriEncoder是枚舉類,FIXING是一個枚舉類型。
打開源碼看了一下:
原來是在枚舉內 實現了方法,而後就本身試着寫了,可是發現怎麼都調用不到。
而後看了整個類,發現,原來枚舉內的方法,在枚舉類內都有抽象定義。
而後在枚舉中進行了具體實現,而後就能夠經過不一樣的枚舉類型,調用具體的不一樣的實現。
真的是秀。。。
List list=new ArrayList<Integer>();
List<Integer> list=new ArrayList<Integer>();
List<Integer> list=new ArrayList();
其中 第一行是沒有泛型的。。。2 3行有。
由於泛型是在編譯時候檢查的,並且是經過引用進行檢查的,new list 只是開闢了一個空間,並無對泛型進行一個約束。
泛型通配符:
當使用通配符
下界通配符
List<? extends zzz>=new ArrayList<xxx> 其中 xxx extends zzz
這是容許的,可是丟失了add的操做能力,沒法添加任何元素。
上屆通配符