-
Java基礎(chǔ)學(xué)習(xí)總結(jié)
- 每部分內(nèi)容會重點寫一些常見知識點,方便復(fù)習(xí)和記憶,但是并不是全部內(nèi)容,詳細的內(nèi)容請參見具體的文章地址。
面向?qū)ο笕筇匦?/h2> - 繼承:一般類只能單繼承,內(nèi)部類實現(xiàn)多繼承,接口可以多繼承
- 封裝:訪問權(quán)限控制public>protected>包>private內(nèi)部類也是一種封裝
- 多態(tài):編譯時多態(tài),體現(xiàn)在向上轉(zhuǎn)型和向下轉(zhuǎn)型,通過引用類型判斷調(diào)用哪個方法(靜態(tài)分派)。
- 運行時多態(tài),體現(xiàn)在同名函數(shù)通過不同參數(shù)實現(xiàn)多種方法(動態(tài)分派)。
基本數(shù)據(jù)類型
- 基本類型位數(shù),自動裝箱,常量池
- 例如byte類型是1byte也就是8位,可以表示的數(shù)字是-128到127,因為還有一個0,加起來一共是256,也就是2的八次方。
- 32位和64位機器的int是4個字節(jié)也就是32位,char是1個字節(jié)就是8位,float是4個字節(jié),double是8個字節(jié),long是8個字節(jié)。
- 所以它們占有字節(jié)數(shù)是相同的,這樣的話兩個版本才可以更好地兼容。(應(yīng)該)
- 基本數(shù)據(jù)類型的包裝類只在數(shù)字范圍-128到127中用到常量池,會自動拆箱裝箱,其余數(shù)字范圍的包裝類則會新建實例
String及包裝類
-
String類型是final類型,在堆中分配空間后內(nèi)存地址不可變。
- 底層是final修飾的char[]數(shù)組,數(shù)組的內(nèi)存地址同樣不可變。
- 但實際上可以通過修改char[n]='a'來進行修改,不會改變String實例的內(nèi)存值,不過在jdk中,用戶無法直接獲取char[],也沒有方法能操作該數(shù)組。
- 所以String類型的不可變實際上也是理論上的不可變。所以我們在分配String對象以后,如果將其="abc",那也只是改變了引用的指向,實際上沒有改變原來的對象。
- StringBuffer和StringBuilder底層是可變的char[]數(shù)組,繼承父類AbstractStringBuilder的各種成員和方法,實際上的操作都是由父類方法來完成的。
final關(guān)鍵字
-
final修飾基本數(shù)據(jù)類型保證不可變
- final修飾引用保證引用不能指向別的對象,否則會報錯。
- final修飾類,類的實例分配空間后地址不可變,子類不能重寫所有父類方法。因此在cglib動態(tài)代理中,不能為一個類的final修飾的函數(shù)做代理,因為cglib要將被代理的類設(shè)置為父類,然后再生成字節(jié)碼。
- final修飾方法,子類不能重寫該方法。
抽象類和接口
- 抽象類可以有方法實現(xiàn)。
- 抽象類可以有非final成員變量。
- 抽象方法要用abstract修飾。
- 抽象類可以有構(gòu)造方法,但是只能由子類進行實例化。
- 接口可以用extends加多個接口實現(xiàn)多繼承。
- 接口只能有public final類型的成員變量。
- 接口只能有抽象方法,不能有方法體、
- 接口不能實例化,但是可以作為引用類型。
代碼塊和加載順序
-
假設(shè)該類是第一次進行實例化。那么有如下加載順序
- 靜態(tài)總是比非靜態(tài)優(yōu)先,從早到晚的順序是:
- 靜態(tài)代碼塊和靜態(tài)成員變量的順序根據(jù)代碼位置前后來決定。
- 代碼塊和成員變量的順序也根據(jù)代碼位置來決定
- 最后才調(diào)用構(gòu)造方法構(gòu)造方法
多線程
-
這里先不講juc包里的多線程類。juc相關(guān)內(nèi)容會在Java并發(fā)專題講解。
- 線程的實現(xiàn)可以通過繼承Thread類和實現(xiàn)Runable接口
- 也可以使用線程池。callable配合future可以實現(xiàn)線程中的數(shù)據(jù)獲取。
- Java中的線程有7種狀態(tài),new runable running blocked waiting time_waiting terminate
- blocked是線程等待其他線程鎖釋放。
- waiting是wait以后線程無限等待其他線程使用notify喚醒
- time_wating是有限時間地等待被喚醒,也可能是sleep固定時間。
- Thread的join是實例方法,比如a.join(b),則說明a線程要等b線程運行完才會運行。
- o.wait方法會讓持有該對象o的線程釋放鎖并且進入阻塞狀態(tài),notify則是持有o鎖對象的線程通知其他等待鎖的線程獲取鎖。notify方法并不會釋放鎖。注意這兩個方法都只能在synchronized同步方法或同步塊里使用。
- synchronized方法底層使用系統(tǒng)調(diào)用的mutex鎖,開銷較大,jvm會為每個鎖對象維護一個等待隊列,讓等待該對象鎖的線程在這個隊列中等待。當線程獲取不到鎖時則讓線程阻塞,而其他檢查notify以后則會通知任意一個線程,所以這個鎖時非公平鎖。
- Thread.sleep(),Thread.interrupt()等方法都是類方法,表示當前調(diào)用該方法的線程的操作。
- 一個線程實例連續(xù)start兩次會拋異常,這是因為線程start后會設(shè)置標識,如果再次start則判斷為錯誤。
String類型是final類型,在堆中分配空間后內(nèi)存地址不可變。
final修飾基本數(shù)據(jù)類型保證不可變
假設(shè)該類是第一次進行實例化。那么有如下加載順序
這里先不講juc包里的多線程類。juc相關(guān)內(nèi)容會在Java并發(fā)專題講解。
以上就是深圳達內(nèi)教育小編介紹的"Java技術(shù)學(xué)習(xí)核心總結(jié)",希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。