一、Java資料型別
1.1 基本資料型別
資料型別 | 大小 | 範圍 | 預設值 | |
整型 | byte | 1位元組 | -27—27-1 | 0 |
short | 2位元組 | -215—215-1 | 0 | |
int | 4位元組 | -231—231-1 | 0 | |
long | 8位元組 | -263—263-1 | 0L | |
浮點型 | float | 4位元組 | -3.4E38—3.4E38 | 0.0f |
double | 8位元組 | -1.7E308—1.7E308 | 0.0d | |
字元型 | char | 2位元組 | \u0000—u\ffff | ‘\u0000’ |
布林型 | boolean | true、false | false |
① 浮點數計算會出現誤差,用BigDecimal類
1.2 引用資料型別
類(class) 介面(interface) 陣列(array)
二、運算子
2.1 算數運算子
一元運算子 | ||||
正 | 負 | 自增1 | 自減1 | |
+ | - | ++ | -- | |
二元運算子 | ||||
加 | 減 | 乘 | 除 | 取餘 |
+ | - | * | / | % |
① a++ 先賦值,後自增 ++a 先自增,後賦值
eg. 若a初始值為1 //a=a++ a為1 //a=++a a為2
2.2 位運算子
十進位制轉二進位制
按位與 | & | 兩個數都為1則為1,否則為0 |
按位或 | | | 有一個為則為1,否則為0 |
異或 | ^ | 兩個數字相同則為0,否則為1 |
非 | ~ | 1轉0,0轉1,然後轉補碼(正數補碼為自己,負數補碼符號位不變再按位取反加1) |
帶符號左移 | << | 左移低位補0 |
帶符號右移 | >> | 右移使用符號擴充套件機制,如果正數,則高位補0,如果負數,則高位補1. |
無符號右移 | >>> | 無論正數還是負數,都高位補0 |
2.3 關係運算子
等於 | 不等於 | 小於 | 大於 | 不大於 | 不小於 | |
== | != | < | > | <= | >= |
① == 對於基本資料型別而言是校驗其值是否相等,對於引用型別是判斷引用地址是否相同
2.4 邏輯運算子
與 | 或 | 非 | 短路與 | 短路或 |
& | | | ! | && | || |
① 短路與/或和物理串聯一樣,一個gg,全都gg
&& 與 &的區別:前者只要有一個條件不滿足,後面條件不再判斷,而後者全判斷
|| 與 |的區別:前者只要有一個條件滿足,後面條件不再判斷,而後者全判斷
2.5 三目運算子
布林表示式?表示式1:表示式2
true 返回表示式1值,false返回表示式2值
2.6 賦值運算子
=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=
2.7 instanceof運算子
a instanceof B 若a繼承B或a是B型別,則為true;否則false
注:
a為某個例項,且a必須是可以通過(B)a強轉成B型別的,不然編譯器會報錯。
B不能指定泛型引數
2.8 優先順序:
優先順序 | 運算子 | |
1 | ()、[] | 從左往右 |
2 | !、+(正)、-(負)、~、++、-- | 從右往左 |
3 | *、/、% | 從左往右 |
4 | +(加)、-(減) | 從左往右 |
5 | <<、>>、>>> | 從左往右 |
6 | <、<=、>、>=、instanceof | 從左往右 |
7 | ==、!= | 從左往右 |
8 | &(按位與) | 從左往右 |
9 | ^ | 從左往右 |
10 | | | 從左往右 |
11 | && | 從左往右 |
12 | || | 從左往右 |
13 | ?: | 從左往右 |
14 | =、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^= | 從右往左 |
三、流程控制
3.1 條件語句
1.if-else
if(A)
①
else
②
A為true執行①,否則執行②
2.if-else if-esle if...
if(A)
①
else if(B)
②
else if(C)
③
A為true執行①跳出結構體,下面程式碼不執行
3.2 迴圈語句
1.for
for(initialization;Boolean-expression;step)
statement
2.foreach
for(variable : collection)
statement
3.while
while(A)
①
A為true執行①,直到A為false停止執行①
4.do-while
do{
①
} while(A);
A為true執行①,直到A為false停止執行①,與while的區別,do-while至少執行語句①一次
3.3 中斷流程控制
break、continue、return
注:
①break是跳出當前迴圈,continue是跳出當前當次迴圈
②若迴圈裡巢狀迴圈break只能跳出一個,return可以跳出整個迴圈
3.4 多選擇語句
1.switch
switch(A)
case B:
①;
break;
case C:
②;
break;
注:
①A必須是byte、short、char、int及其包裝類、String(jdk1.7以上)、enum
②若不用break,不會跳出結構體程式碼會繼續執行
四、物件導向
4.1 三大特徵
1.封裝
把物件的屬性、方法結合成一個獨立的整體,並儘可能隱藏物件的內部細節,只需要呼叫不用知道里面的如何實現,就像除錯介面一樣,只要管入參和返回結果即可,這樣做有利於程式的安全以及可以減少耦合度。舉個例子,我想吃碗湯麵,去哪家麵館都行,但是如果我知道有一家麵館湯是藥草精煉特製而成能大補,我會更想去那家依賴大補的功能,倘若我知道那湯是如何做的,我可以把配方拿出去賣,對於那家麵館就失去了核心競爭力。
2.繼承
子類繼承父類,子類可以獲取父類的屬性和行為,並根據自身的需要擴充套件新的屬性和行為,這樣利於程式碼的複用以及程式的擴充套件。舉個例子,先定義一個類湯麵,有屬性:湯、面,而這時我需要給湯麵加塊大肉就可以派生出大肉湯麵或者加塊大排骨就可以派生出排骨湯麵。
注:
①.子類繼承父類,子類會擁有父類所有行為和屬性,但是訪問權(指子類呼叫)不一定都有
修飾符 | 當前類 | 同包內 | 子孫類 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
③.java類不支援多繼承,繼承破壞了封裝性因為子類擁有父類private修飾的屬性或方法並且會擁有父類所有屬性和行為,請謹慎使用繼承,問自己是否需要向上轉型需要則用繼承(is-a),否則使用組合(has-a)(可以看看《敏捷軟體開發:原則、模式與實踐》第十四章)
3.多型
不同類物件對同一行為做出不同響應。
多型必要條件:①繼承;②重寫;③向上引用(父類引用指向子類物件)
## 4.2 抽象類與介面 若父類方法可以沒有方法體且該類物件沒有任何意義,那麼我可以把這個方法定義為抽象方法,並且該類定義為抽象類。
注:抽象類可以沒有抽象方法,有抽象方法的類一定是抽象類。抽象類不能例項化,若父類有抽象方法,子類繼承不重寫那麼子類也是抽象類。抽象類與一般類的區別就是抽象...
因為java不支援多繼承,只能擴充套件一個類,並且若一個類並不想擁有另一類的所有屬性及行為並無本質上的聯絡,相互之間只是一種契約關係,那麼介面應聲而出,介面相對於抽象類而言抽象類是對類抽象,介面是對類區域性行為的抽象,是更純粹的抽象類。
介面與抽象類區別:
①介面沒有構造方法,抽象類可以有
②介面沒有成員屬性,所定義的變數都是static final修飾的,抽象類可以有(1.8因為出了函數語言程式設計,又因為OCP原則,介面可以申明預設方法具有方法體,不要在介面中定義常量)
③介面沒有靜態方法,抽象類有
④多實現,單繼承
4.3 過載與重寫
過載:發生在同一個類,方法名必須相同,引數型別不同,個數不同,方法返回值和訪問修飾符可以不同
重寫:發生在父子類,方法簽名必須相同,返回值型別不大於父類,丟擲異常不大於父類,訪問修飾符不小於父類
4.4 static
static修飾的是屬於這個類,和類物件無關,建議直接用類呼叫即可.
注:
①.執行順序:
父類靜態變數和靜態程式碼塊
子類靜態變數和靜態程式碼塊
父類成員變數和非靜態程式碼塊
父類構造方法
子類成員變數和非靜態程式碼塊
子類構造方法
②靜態方法不會預先執行,非靜態程式碼塊在每申明一個新物件時都會執行一次
③.因為static修飾的最先載入,所以static修飾的方法不能直接呼叫非靜態的方法和屬性,也因此不能使用this、super,不能被重寫
4.5 final
final就是最終的,不可修改的意思。修飾的類不能被繼承,修飾的方法不能被重寫,修飾的變數為常量只能賦值一次
4.6 call by value 與 call by reference
call by value:值傳遞(值指基本資料型別),不會改變實際引數的數值
call by reference:引用傳遞,不能改變實際引數的參考地址, 能改變實際引數的內容
注:
無論哪種傳遞傳參傳遞的都是是引數的拷貝
4.7 Object方法
①clone方法
預設克隆方法是淺複製(物件引用地址不一樣,物件基本資料型別屬性不一樣而引用型別屬性一樣),而深複製物件引用地址不一樣,物件基本資料型別屬性不一樣且引用屬性也不一樣。其次clone是protected的,因為Object類不知道其子類有哪些引用型別,做不到深拷貝,為此必須重新定義clone方法,並將其宣告為public實現深拷貝,防止其他地方呼叫修改了物件引用屬性而影響了此物件。當使用clone方法時類需要實現cloneable給一個標記,這樣就不會丟擲異常
②equals與hashCode方法
equals用於確認兩個物件是否相同,預設equals方法比較的是記憶體地址,而兩個不同物件(記憶體地址不同)具有相同屬性時我們希望這兩個物件相等,所以需要重寫equals方法,而為什麼需要重寫hashCode方法,因為物件呼叫equals方法返回true時,他們的hashCode方法返回值也要相等,所以同時需要重寫hashCode方法。雜湊值相同的物件不一定equals,而equals放回true的兩個物件一定雜湊值相同。
③toString與getClass方法
toString返回物件值的字串,當我們需要檢視物件部分屬性時則重寫toString方法
getClass返回Class物件
④wait()、wait(long)、wait(long, int)、notify、notifyAll()
多執行緒用到(例如生產者消費者),wait方法當前執行緒由執行狀態變為阻塞狀態進入等待佇列,會釋放當前鎖
notify喚醒一個執行緒,notifyAll喚醒所有執行緒,有關多執行緒等我看完併發實踐會具體分析自己感悟..
⑤finalize
gc時用來確定被回收物件時候沒有被引用