JAVA基礎知識全面總結【新生必看一起學習】

java 基礎知識全面總結

1.什麼是Java虛擬機?爲什麼Java被稱作是“平臺無關的編程語言”? 2

2.“static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法? 3

3.是否可以在static環境中訪問非static變量?

4.Java支持的數據類型有哪些?什麼是自動拆裝箱?

5.Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

6.Java支持多繼承麼?

7.基礎: final修飾基本數據類型變量和引用數據類型變量.

進階: 被final修飾的常量在編譯階段會被放入常量池中

探索: 爲什麼局部/匿名內部類在使用外部局部變量時, 只能使用被final修飾的變量?

8.什麼是值傳遞和引用傳遞?

9.創建線程有幾種不同的方式?你喜歡哪一種?爲什麼?

10.同步方法和同步代碼塊的區別是什麼?

11.什麼是死鎖(deadlock)?

探究final在java中的作用

①被final修飾的變量是不能夠被改變的. 但是這裏的"不能夠被改變"對於不同的數據類型是有不同的含義的.當final修飾的是一個基本數據類型數據時, 這個數據的值在初始化後將不能被改變; 當final修飾的是一個引用類型數據時, 也就是修飾一個對象時, 引用在初始化後將永遠指向一個內存地址, 不可修改. 但是該內存地址中保存的對象信息, 是可以進行修改的.

②進階: 被final修飾的常量在編譯階段會被放入常量池中final是用於定義常量的, 定義常量的好處是: 不需要重複地創建相同的變量. 而常量池是Java的一項重要技術, 由final修飾的變量會在編譯階段放入到調用類的常量池中.

③探索: 爲什麼局部/匿名內部類在使用外部局部變量時, 只能使用被final修飾的變量提示: 在JDK1.8以後, 通過內部類訪問外部局部變量時, 無需顯式把外部局部變量聲明爲final. 不是說不需要聲明爲final了, 而是這件事情在編譯期間系統幫我們做了. 但是我們還是有必要了解爲什麼要用final修飾外部局部變量. 所以當在內部類中使用外部局部變量的時候應該用final修飾局部變量, 這樣局部變量a的值就永遠不會改變, 也避免了數據不一致問題的發生

④ final修飾方法 使用final修飾方法有兩個作用, 首要作用是鎖定方法, 不讓任何繼承類對其進行修改.另外一個作用是在編譯器對方法進行內聯, 提升效率. 但是現在已經很少這麼使用了, 近代的Java版本已經把這部分的優化處理得很好了.

⑤final修飾類,使用final修飾類的目的簡單明確: 表明這個類不能被繼承.,當程序中有永遠不會被繼承的類時, 可以使用final關鍵字修飾,被final修飾的類所有成員方法都將被隱式修飾爲final方法.

深入分析Java中的關鍵字static

①static關鍵字基本概念,方便在沒有創建對象的情況下來進行調用。

也就是說:被static關鍵字修飾的不需要創建對象去調用,直接根據類名就可以去訪問。

②static關鍵字修飾類,但有一種特殊用法是用static修飾內部類,普通類是不允許聲明爲靜態的,只有內部類纔可以。

③static關鍵字修飾方法,修飾方法的時候,其實跟類一樣,可以直接通過類名來進行調用

④static關鍵字修飾變量,被static修飾的成員變量叫做靜態變量,也叫做類變量,說明這個變量是屬於這個類的,而不是屬於是對象,沒有被static修飾的成員變量叫做實例變量,說明這個變量是屬於某個具體的對象的。

⑤static關鍵字修飾代碼塊

靜態代碼塊在類第一次被載入時執行,在這裏主要是想驗證一下,類初始化的順序。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Mdc2vJoe-1592787631486)(https://pics3.baidu.com/feed/8644ebf81a4c510f633a3493cb792028d52aa567.jpeg?token=b0b04912bdd617c95caaf53cd29fe393&s=E4906C32198A444D5C64ACDA0000C0B3)]

下面對static關鍵字進行一個小結:

(1)特點:

1、static是一個修飾符,用於修飾成員。(成員變量,成員函數)static修飾的成員變量 稱之爲靜態變量或類變量。

2、static修飾的成員被所有的對象共享。

3、static優先於對象存在,因爲static的成員隨着類的加載就已經存在。

4、static修飾的成員多了一種調用方式,可以直接被類名所調用,(類名.靜態成員)。

5、static修飾的數據是共享數據,對象中的存儲的是特有的數據。

(2)成員變量和靜態變量的區別:

1、生命週期的不同:

成員變量隨着對象的創建而存在隨着對象的回收而釋放。

靜態變量隨着類的加載而存在隨着類的消失而消失。

2、調用方式不同:

成員變量只能被對象調用。

靜態變量可以被對象調用,也可以用類名調用。(推薦用類名調用)

3、別名不同:

成員變量也稱爲實例變量。

靜態變量稱爲類變量。

4、數據存儲位置不同:

成員變量數據存儲在堆內存的對象中,所以也叫對象的特有數據。

靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據。

(3)靜態使用時需要注意的事項:

1、靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)

2、靜態方法中不可以使用this或者super關鍵字。

3、主函數是靜態的

java的內存結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aPtMCH2D-1592787631489)(https://pics3.baidu.com/feed/024f78f0f736afc33409f1471839eec1b74512b4.jpeg?token=33db0ecbe211c671b69179720b8e41d4&s=ED9CAA528ACE3EC846392E6303003066)]

從上圖我們可以發現,靜態變量存放在方法區中,並且是被所有線程所共享的。這裏要說一下java堆,java堆存放的就是我們創建的一個個實例變量。

堆區:

1、存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)

2、jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身

棧區:

1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中

2、每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。

3、棧分爲3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。、

方法區:

1、又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。

2、方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pi1BBWML-1592787631491)(https://pics2.baidu.com/feed/f3d3572c11dfa9ec028d9199c8f0f206908fc147.jpeg?token=2a78319a30f2dfd3eebeaea669541f68&s=2FA67D228BEF410B12F085D3000090B3)]

什麼是死鎖(deadlock)

死鎖 :是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去
(1) 因爲系統資源不足。
(2) 進程運行推進順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態
的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

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