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) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態
的情況下佔用資源。因此,對資源的分配要給予合理的規劃。