三同:方法名相同,引數列表相同,返回值相同或者子類的返回值是父類的子類(這一點是經過驗證的)
一大: 子類的訪問修飾符比父類開放
一小: 子類丟擲的異常比父類的小(具體,或者說子類丟擲的異常是父類丟擲的異常的子類
通過intellij測試的結果:
在子類中,如果一個方法滿足與父類的方法的方法簽名(方法名稱+引數列表)相同,則一定屬於override,那麼子類中次方法的返回值就必須滿足是父類的子類,且子類方法的修飾符必須比父類更開放
子類中,如果一個方法與父類的方法簽名不同(方法名稱+引數列表),那麼這個方法就是一個子類的新方法,不屬於override,也不屬於overload,與父類的同名方法沒有任何關係
容器的左上角是座標的起點 圖中的演算法是二分查詢,二分查詢的時間複雜度計算:
第一次折半, n/2
第二次折半,n/(2^2)
第k次折半,n/(2^k)
因為k次折半之後,一定會出現只剩下一個數字的情況,也就是找到了要找的元素
那麼也就有 n/(2^k) ==1
所以,k == log2(n),即二分查詢的時間複雜度為log2(n) 抽象類實現介面,可以不實現介面中的任意方法或者所有方法
普通類實現介面,必須實現介面中的所有方法,介面中的欄位field,普通類可以直接使用
普通類繼承了抽象類,子必須實現抽象類中的所有抽象方法,對於抽象類中的非抽象方法,可以Override,也可以不Override
整數型別,預設為int,小數型別,預設為double,而不是float
例如, float result = (float)1.0; //否則報錯
多種不同型別的數字進行運算,結果會是以最高精度的為準(自動向上轉型),題中1/2.0 為int/double,所以結果應該為double型別的0.5; 即
double result = 1/2.0;
或者 float result =(float)(1/2.0); 依賴注入是通過反射實現的,是一種設計思想,與具體的框架無關,別的框架,也可以實現依賴注入
常見的依賴注入方式包括Setter方法和構造方法 Mock,也叫做偽物件,在測試中利用mock來代替真實的物件,方便測試的進行
封裝:將物件的狀態資訊隱藏在物件內部,不允許外部直接訪問
反射機制:在執行狀態下,可以呼叫類的所有屬性和方法,包括private屬性和方法,所以破壞了封裝性
String類的equals方法,只有instanceof之後,發現equal(object)中的object為String型別的物件,才會轉換成String,然後比較char[] 執行過程:
boolean b = true?false:true==true?false:true;
-->
true?false:(true==true)?false:true;
true?false:true?false:true;
true?false:(true?false:true);
true?false:false;
false;
賦值語句= 的優先順序最低
==的優先順序高於三目運算子
為了將左邊的三目運算子算完,必須要現將後面的三目運算子算完,所以需要從右向左計算
Spring是一系列輕量級java EE框架的集合,正確
Spring提供了AOP方式的日誌系統,不正確
Spring提供了AOP,但是沒有提供日誌系統,需要使用log4j等開源框架來利用AOP屬性,實現日誌系統
Arrays.copyOf 呼叫了System.arraycopy方法,所以System.arraycopy > Arrays.copyOf
System.arraycopy是native方法
clone 方法也是native方法
從評論區的反饋來看: 效率: System.arraycopy > clone > Arrays.copyOf 建立泛型的時候,儘可能早的指出泛型的型別,爭取讓編譯器檢查出錯誤,而不是在jvm執行的時候丟擲類不匹配的異常
jvm理解泛型的方法:
1,虛擬機器中沒有泛型,只有普通類和普通方法,所有的泛型類,泛型方法的,在編譯階段就已經被處理成了普通類和普通方法(通過型別擦除進行處理),也就是講泛型擦除成了Object或者邊界型別(extend等)
2,即使是泛型,也可以在執行時,動態的(利用反射機制)動態的獲取到泛型的實際型別 public Type getGenericSuperclass() java集合框架圖: Collection是一個介面
List和Set 介面繼承了Collection介面,但是Map介面沒有繼承Collection介面
List包括ArrayList和Vector,Stack繼承了Vector
Set包括Treeset,HashSet,LinkedHashSet,linkedHashSet繼承了HashSet
Map包括TreeMap,HashMap,LinkedHashMap(繼承了HashMap),WeakHashMap,IdentityHashMap,
其中,WeakHashMap和IdentityHashMap沒有繼承Hashmap,只是繼承了AbstractMap,實現了Map介面,與HashMap一樣(這一點與)
1,父類的靜態程式碼塊,靜態屬性,但不包括靜態方法
即:static{} + static T typeName;
2,子類的靜態程式碼塊,靜態屬性,但是不包括靜態方法
3,父類的非靜態程式碼塊
4,父類的構造方法(構造方法晚於非靜態程式碼塊)
5,子類的非靜態程式碼塊
6,子類的構造方法(構造方法晚於非靜態程式碼塊)
代入到本題中,就是:
先執行Sub方法,然後執行Sub的基類Base的靜態方法(沒有),然後執行Sub的靜態方法(沒有),然後執行父類的非靜態程式碼塊(沒有),然後執行父類的建構函式(裡面有一個callName方法,因為sub中override了callName方法,所以父類的建構函式裡面的callName方法,執行的是Sub類中的override的callName方法),然偶引用sub中callName中的baseName屬性,但是此時還沒有執行到Sub類中的private String basename="basename" ,所以此時baseName還保持在null的狀態,會列印出null的值
synchronize既可以保證原子性,又可以保證修改可見性,而volatile只能保證修改可見性
volatile的本質是告訴jvm,暫存器中的值是不可信的,直接去記憶體中取值 ,synchronized是鎖定當前變數,同一時間只能有一個執行緒訪問變數
volatile不會阻塞執行緒,而synchronized會阻塞執行緒
volatile標記的變數不會被編譯器優化,而synchronized標記的變數會被執行緒優化
反射的主要作用:
執行時判斷一個類所屬的物件:isInstance();
執行時得到一個物件所屬的類: getClass();
執行時構造一個類的物件: Class.forName("ClassName").newInstance();
執行時獲取一個類的任意成員變數和方法,getFields,getMethods等
執行時呼叫任意類的任意方法
生成動態代理(需要特殊記) 集合中各種類的同步性:
List中,常見的LinkedList,ArrayList,都不是同步的
List中,不常見的Vector,以及繼承與Vector的Stack,都是同步的
Set中,常見的HashSet,以及整合與HashSet的linkedHashset,都不是同步的
Set中,不常見的TreeSet,也是不同步的
Map中,常見的HashMap,linkedhashmap,都是不同步的
Map中,不常見的TreeMap,WeakHashMap,IdentityHashMap是不同步的
總結,常見的linkedlist,arraylist,hashset,linkedhashset,hashmap,linkedhashmap都是不同步的
常見的set,map都沒有同步的,只有list中vector是同步的
只有vector和繼承與vector的stack是同步的
StringBuffer是同步的,而StringBuilder是不同步的
HashMap不同步,但是Hashtable同步 (hashtable繼承了Dictionary,實現了Map介面,屬於map)
Properties繼承與Hashtable,Properties也是同步的