Java知識點梳理

第一章:對象入門

1.1:抽象的進步

所有編程語言的最終目的是提供一種“抽象”:彙編語言是對基礎機器的少量抽象;命令式語言是對彙編語言的抽象;

 

在問題和方案之間,程序員必須建立起聯繫:

    以前的語言例如PROLOG將問題都歸納爲決策鏈,每種方法都有自己特殊的用途,適合解決某一類問題;    面向對象可以利用一些工具表達問題空間內的元素,不必受限於特定類型的問題。

 

對象:將問題空間中的元素以及他們在方案空間的表示物稱爲對象,有自己的特徵和行爲。

有類和實例。

 

1.2:對象的接口

亞里士多德或許是研究“類型”概念的第一人:談及“魚類和鳥類”。

所有對象都屬於某一系列對象的一部分,這些對象具有通用的特徵和行爲,這就是類:Class.

 

接口:向對象發出請求的入口方法,規定了可對一個特定對象發出哪些請求。

 

1.3:實現方案的隱藏

類創建者目標:從頭構建一個類,只開放必要開放的東西,其他所有細節隱藏起來;客戶程序員無法修改,保證安全。

 

爲什麼要隱藏:

    原因1:防止客戶程序員接觸他們不該接觸的東西;

    原因2:允許庫設計人員修改內部結構,不用擔心它會對客戶程序員造成影響,達到解耦的作用。

 

Java三個顯式關鍵字以及一個隱式關鍵字來設置類邊界:public,private,protected;friendly

 

1.4:方案的重複使用:

代碼或設計方案的重複使用是面向對象的程序設計提供的最偉大的一種槓桿。

組織:類的對象可以置入一個新類中,例如一輛車包含一個變速箱。

 

1.5:繼承:重新使用接口

利用現有的數據類型,進行克隆,提高代碼複用,提高效率。

上溯造型:把衍生類型當作它的基本類型處理的過程。

 

1.6:多形對象的互換使用

多形性(polymorphism):將一條消息發送給對象時,如果並不知道對方具體類型是什麼,但採取的行動是正確的,這種情況。

動態綁定:面向對象用來實現多形性,編譯器和運行期系統會負責。

 

抽象的基礎類和接口:abstract;我們希望基礎類只爲自己的衍生類提供一個模版,可以定義一些函數。

interface在抽象類的概念上更延伸一步,禁止所有函數的定義。

 

 

1.7:對象的創建和存在時間

內存池中動態創建對象。

集合:只有在運行的時候知道需要多少對象,所以需要一個容器。

集合遍歷的類:1.1叫Enumeration,1.2叫Iterator.

單根結構:所有的類都應從單獨的一個基礎類繼承:Object類。

可以方便的實現垃圾收集器:與此相關的必要支持可以安裝在基礎類中。

c++並不是單根結構:效率和控制之間的權衡;單根結構會帶來程序設計上的一些限制;加大了與c的兼容;

 

 

1.8:違例控制:解決錯誤

單獨的一套機制,和程序語言結合在一起,不影響業務程序邏輯。

 

1.9:多線程:

java的多線程機制已內建到語言中,且在Object對象這一級支持,也提供鎖。

 

第二章:一切都是對象。

一切都是對象,用句柄操作對象。

所有對象都必須被創建。

數據保存的地方:

    寄存器:位於處理器內部;

    堆棧:ram區域;主要存放對象句柄。

    堆:java對象

    靜態存儲:static;也是位於ram具體區域

 

主要類型:不是用new創建,而是創建一個並非句柄的“自動”變量,置於堆棧中,能夠高效的存取。

boolean:1位

char:16位

byte:8位

short:16位

int:32位

long:64位

float:32位

double:64位

 

高精度數字:

biginteger:任意精度的整數

bigDecimal:任意精度的定點數字

 

靜態stastic/類相關:不與任何對象相關,所以不需要創建對象就能調用。

 

第三章:控制程序流程

==是比較句柄;equals()方法默認是比較句柄,如果有需要需要重寫比較值。

邏輯運算符的短路:這意味着只有明確得出整個表達式真或假的結論,纔會對表達式進行邏輯求值;能提高性能。

 

按位運算符:

移位:https://blog.csdn.net/tonysong111073/article/details/79480495

 

第四章:初始化和清除

方法過載:overload:方法名相同,自變量不同,返回類型可以不同。

static:執行的時候是在首次生成那個類的一個對象時,或者首次訪問屬於那個類的一個static成員時。

 

第五章:隱藏實施過程

面向對象一項基本考慮:變與不變分開。

 

第六章:類再生

如何選擇合成還是繼承:一個簡單的原則是是否需要從新類上溯造型回基礎類,若必須上溯,就需要繼承。

 

final:

    final數據:表示值不能被修改。

    final方法:表示不希望被衍生類重寫。

    final類:不希望被繼承。

 

第七章:多形性

 

第八章:對象的容納

hashTable與hashMap的區別:

    hashTable是線程安全的,因爲有synchronized;但是速度慢。

    hashMap是非線程安全,可以接受key,value都是null的情況。

 

第九章:違例控制

 

第十章:Java IO系統

transient:(臨時的):序列化的時候表示不需要。

基於字節的操作:

 

基於字符的操作:

IO常用類:

文件流:FileInputStream/FileOutputStream, FileReader/FileWriter

包裝流:PrintStream/PrintWriter/Scanner

字符串流:StringReader/StringWriter

轉換流:InputStreamReader/OutputStreamReader

緩衝流:BufferedReader/BufferedWriter,BufferedInputStream/BufferedOutputStream

 

沒有經過Buffered處理的IO, 意味着每一次讀和寫的請求都會由OS底層直接處理,這會導致非常低效的問題。

 

BufferedReader提供一個readLine()可以方便地讀取一行.

 

 

第11章:運行期類型鑑定

反射

 

第14章:多線程

 

用戶線程和守護線程:是指在程序運行的時候在後臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,並且這種線程並不屬於程序中不可或缺的部分。因此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。反過來說,只要任何非守護線程還在運行,程序就不會終止。

 

創建多線程的方法:

    1.繼承Thread類:實現run()方法。

    2.實現Runable接口。

    3.通過Callable(call方法)和Future創建線程:爲了解決任務在執行完了之後無法獲取返回結果。

 

Callable定義的方法是call,Runnable定義的方法是run;

 

Callable定義的方法有返回值,Runnable定義的方法沒有返回值;

 

Callable定義的方法可以拋出異常,Runnable定義的方法不能拋出異常;

 

Future模式:去除主函數的等待時間,並使原本需要等待的時間段可以用於處理其他業務邏輯;

    如果線程A要等待線程B的結果,那麼線程A沒必要等待B,知道B有結果,可以先拿到一個未來的Future,等B有結果了再取真實的值。

    get獲取異步結果,如果沒有結果可用,此方法會阻塞直到異步計算完成。

    Futrue,Callable通常配合ExcutorService配合使用。

 

比較這兩種方式,建議使用第2種:

    java不允許多繼承,因此實現了Runnable接口的類可以再繼承其他類;

    推薦組合而不是繼承;

 

synchronized(同步的):

    任何時刻,只可有一個線程調用特定對象的一個synchronized方法。

    每個對象都包含了一把鎖,自動成爲對象的一部分;

    調用任何synchronized方法時,對象都會被鎖定,不可調用那個對象的其他任何synchronized方法,除非完成操作,釋放對象鎖。

    每個類也有自己的一把鎖,(作爲類Class對象的一部分),所以synchronized static 方法可在一個類的範圍內被相互鎖定起來,防止與static數據的接觸。

 

線程的狀態:

    new:線程對象已創建,但尚未啓動,所以不可運行;

    Runnable:意味着一旦時間分片機制有空閒的cpu週期提供一個線程,那個線程便可立即開始運行;

    Dead:

    Blocked:線程可以運行,但有某種東西阻礙了它。

 

線程Blocked的原因:

    1.調用sleep:屬於Tread的一部分。

    2.用suspend()暫停了線程的執行;除非收到resume(),否者不會進入Runnable狀態:強烈反對,因爲包含了對象鎖,容易造成死鎖;屬於Tread的一部分。

    3.用wait()暫停了線程的執行;除非線程收到notify(),notifyAll()消息:屬於Object基礎類的一部分。

    4.線程正在等候一些io操作完成。

    5.線程試圖調用另外一個對象的同步方法,但那個對象處於鎖定狀態,暫時無法使用;

 

yield():Thread類的一個方法,自動放棄cpu,以便其他線程能夠運行,但是不會進入blocked狀態,還是Runnable狀態。

 

等待和通知:

    sleep(),suspend()都不會在自己被調用的時候解除鎖定,需要用到對象鎖;屬於Thread.

    wait()方法在被調用的時候會解除鎖定,這意味着可在執行wait()期間調用線程對象中的其他同步方法。

    wait,notify,notifyAll屬於Object.

    wait,notify必須在同步方法中使用,必須先獲得對象鎖。

    調用wait之後,會釋放獲得的對象鎖,並放棄cpu,線程進入等待隊列;notify之後,會喚醒等待的線程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章