Java中修饰变量和方法的关键字总结分析
Java關鍵字我們接觸的也都不少了,就以這篇文章收錄下一些特殊使用的關鍵字,作為深入學習的記錄。
一、修飾變量的關鍵字
1.transient
將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會被序列化。
https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc
2.volatile
當一個變量定義為 volatile 之后,將具備兩種特性:
(1)保證此變量對所有的線程的可見性,這里的“可見性”,如本文開頭所述,當一個線程修改了這個變量的值,volatile 保證了新值能立即同步到主內存,以及每次使用前立即從主內存刷新。但普通變量做不到這點,普通變量的值在線程間傳遞均需要通過主內存(詳見:Java內存模型)來完成。
(2)禁止指令重排序優化。有volatile修飾的變量,賦值后多執行了一個“load addl $0x0, (%esp)”操作,這個操作相當于一個內存屏障(指令重排序時不能把后面的指令重排序到內存屏障之前的位置),只有一個CPU訪問內存時,并不需要內存屏障;(什么是指令重排序:是指CPU采用了允許將多條指令不按程序規定的順序分開發送給各相應電路單元處理)。
https://www.cnblogs.com/dolphin0520/p/3920373.html
https://www.cnblogs.com/zhengbin/p/5654805.html
二、修飾方法的關鍵字
1.synchronized
(1)修飾一個代碼塊,被修飾的代碼塊稱為同步語句塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象;
(2)修飾一個方法,被修飾的方法稱為同步方法,其作用的范圍是整個方法,作用的對象是調用這個方法的對象;
public synchronized void method() {// todo }(3)修改一個靜態的方法,其作用的范圍是整個靜態方法,作用的對象是這個類的所有對象;
public synchronized static void method() {// todo }(4)修改一個類,其作用的范圍是synchronized后面括號括起來的部分,作用的對象是這個類的所有對象。
class ClassName {public void method() {synchronized(ClassName.class) {// todo}} }注意:
上面說到的“這個類的所有對象”其實指的就是當前類的Class實例,Class數據存在永久代中,是該類的一個全局鎖。
總結:
(1)無論synchronized關鍵字加在方法上還是對象上,如果它作用的對象是非靜態的,則它取得的鎖是對象;如果synchronized作用的對象是一個靜態方法或一個類,則它取得的鎖是對類,該類所有的對象同一把鎖。
(2)每個對象只有一個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以運行它所控制的那段代碼。
(3)實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。
2.native
native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前文件,而是在用其他語言(如C和C++)實現的文件中。
一個native方法就是一個Java調用非Java代碼的接口。在定義一個native方法時,并不提供實現體(比較像定義一個Java Interface),因為其實現體是由非Java語言在外面實現的。
Java語言本身不能對操作系統底層進行訪問和操作,但是可以通過JNI(Java Native Interface)接口調用其他語言來實現對底層的訪問。
JNI 調用C流程圖:
3.strictfp
Java2新增的關鍵字。strictfp的意思是FP-strict,strict float point (精確浮點),也就是說精確浮點的意思。
strictfp 關鍵字可應用于類、接口或方法;但是不允許對接口中的方法以及構造函數聲明strictfp關鍵字。
在Java虛擬機進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運行環境在對浮點運算的表達式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結果往往無法令你滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那么所聲明的范圍內Java的編譯器以及運行環境會完全依照浮點規范IEEE-754來執行。因此如果你想讓你的浮點運算更加精確,而且不會因為不同的硬件平臺所執行的結果不一致的話,那就請用關鍵字strictfp。
4.abstract
可用于修飾類或方法,表示抽象類和抽象方法。
(1)抽象方法
1)抽象方法跟普通方法是有區別的,它沒有自己的主體(沒有{}包起來的
業務邏輯),跟接口中的方法有點類似。所以我們沒法直接調用抽象方法。
2)抽象方法不能用private修飾,因為抽象方法必須被子類實現(覆寫),而private權限對于子類來說是不能訪問的,所以就會產生矛盾。
3)抽象方法也不能用static修飾,試想一下,如果用static修飾了,那么我們可以直接通過類名調用,而抽象方法壓根就沒有主體,沒有任何業務邏輯,這樣就毫無意義了。
(2)抽象類
1)用abstract關鍵字來表達的類,其表達形式為:(public)abstract class 類名{}
2)抽象類不能被實例化,也就是說我們沒法直接new 一個抽象類。抽象類本身就代表了一個類型,無法確定為一個具體的對象,所以不能實例化就合乎情理了,只能有它的繼承類實例化。
3)抽象類雖然不能被實例化,但有自己的構造方法(這個后面再討論)
4)抽象類與接口(interface)有很大的不同之處,接口中不能有實例方法去實現業務邏輯,而抽象類中可以有實例方法,并實現業務邏輯,比如我們可以在抽象類中創建和銷毀一個線程池。
5)抽象類不能使用final關鍵字修飾,因為final修飾的類是無法被繼承,而對于抽象類來說就是需要通過繼承去實現抽象方法,這又會產生矛盾。
(3)抽象類與抽象方法的關聯
1)如果一個類中至少有一個抽象方法,那么這個類一定是抽象類,但反之則不然。也就是說一個抽象類中可以沒有抽象方法。這樣做的目的是為了此類不能被實例化。
2)如果一個類繼承了一個抽象類,那么它必須全部覆寫抽象類中的抽象方法,當然也可以不全部覆寫,如果不覆寫全部抽象方法則這個子類也必須是抽象類(這樣做就無意義了)
疑問1:為什么抽象方法不能實例化卻有構造器呢?
我們知道調用子類對象的時候,會優先調用父類的構造方法初始化,因為抽象類在有抽象方法的時候,抽象方法的實現是由子類繼承并重寫來實現的,若抽象類沒有構造器,那就也就沒有繼承實現這一說了。
疑問2:抽象類中的非靜態和非抽象方法中的this關鍵字指的是什么?
指的是派生類,而并非抽象類本身,因為抽象類本身不能實例化。如果有多個繼承類,誰調用this就代表誰。
三、公共的(即能修飾變量,也能修飾方法)
1.public
對任何人都是可用的。
2.private
除類型創建者和類型的內部方法之外的任何人都不能訪問的元素。
3.protected
繼承的類可以訪問以及和private一樣的權限。
4.static
static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變量的概念。
被static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內一定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。
用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象時,不生成static變量的副本,而是類的所有實例共享同一個static變量。 static變量前可以有private修飾,private是訪問權限限定,表示這個變量可以在這個唯一類的靜態代碼塊中,或者這個唯一類的其他靜態成員方法中使用,但是不能在其他類中通過類名來直接引用。static表示不要實例化就可以使用。
5.final
final關鍵字可以用來修飾引用、方法和類。
(1)用來修飾一個引用
1) 如果引用為基本數據類型,則該引用為常量,該值無法修改;
2)如果引用為引用數據類型,比如對象、數組,則該對象、數組本身可以修改,但指向該對象或數組的地址的引用不能修改。
3)如果引用時類的成員變量,則必須當場賦值,否則編譯會報錯。
(2)用來修飾一個方法
當使用final修飾方法時,這個方法將成為最終方法,無法被子類重寫。但是,該方法仍然可以被繼承。
(3)用來修飾類
當用final修改類時,該類成為最終類,無法被繼承。簡稱為“斷子絕孫類”。
6.synthetic
編譯器通過生成一些在源代碼中不存在的synthetic方法和類的方式,實現了對private級別的字段和類的訪問,從而繞開了語言限制,這可以算是一種trick。
在實際生產和應用中,基本不存在程序員需要考慮synthetic的地方。
在此提一個的常見的存在synthetic的案例:
如果同時用到了Enum和switch,如先定義一個enum枚舉,然后用switch遍歷這個枚舉,java編譯器會偷偷生成一個synthetic的數組,數組內容是enum的實例。
總結
以上是生活随笔為你收集整理的Java中修饰变量和方法的关键字总结分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度(杭州)创新中心人工智能产业论坛落幕
- 下一篇: 计算机打不开guest用户,win10系