日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中修饰变量和方法的关键字总结分析

發布時間:2023/12/18 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)修飾一個代碼塊,被修飾的代碼塊稱為同步語句塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象;

public void method() {synchronized(this) {// todo} }

(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。

public strictfp class MyClass{} public strictfp double add(float a, double b){}

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中修饰变量和方法的关键字总结分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费在线成人 | 国产18禁黄网站免费观看 | 奇米网在线观看 | 黄色片在线观看视频 | 天堂а√在线最新版中文在线 | 国产又黄又爽视频 | 激情中文网 | 日韩激情影院 | 国产激情在线视频 | 国产精品国产精品国产专区不卡 | 亚洲天堂av免费在线观看 | 国产超级av | 成人片在线看 | 男人操女人的软件 | 91夜色| 可以在线看黄的网站 | 日韩欧美午夜 | 视频福利在线 | 日本少妇激情视频 | 在线观看欧美一区二区三区 | 精品午夜一区二区三区在线观看 | 亚洲精品女人 | 光明影院手机版在线观看免费 | 精品人妻一区二区免费视频 | 亚洲精品国产一区二区 | 97视频在线观看免费高清完整版在线观看 | 亚洲福利av | 国产一级片在线播放 | 波多野在线 | 波多野结衣久久 | 超碰97免费 | 91精品久久久久久久99蜜桃 | 美女131爽爽爽做爰视频 | 深爱五月激情五月 | 欧美乱码精品一区二区三区 | 久久久久国产精品熟女影院 | 尤物在线视频 | 国产精品视频福利 | 欧美性黄色 | 亚洲无人区小视频 | 成人网在线视频 | 久草免费看 | 成人免费看片 | 97精品一区 | 99热这里只有精品5 国产精品伦子伦免费视频 精品一二三 | 黄色精品视频在线观看 | 国产一级自拍视频 | 欧美午夜久久 | 婷婷九月丁香 | 国产女主播喷水视频在线观看 | 特种兵之深入敌后高清全集免费观看 | 奇米影视四色777 | 无码人妻丰满熟妇精品区 | 欧美 丝袜 自拍 制服 另类 | 女性裸体瑜伽无遮挡 | 成人av免费 | 欧美成人午夜免费视在线看片 | 青青草原成人网 | 日本午夜小视频 | 亚洲黄色三级视频 | 欧美69av| 伊人婷婷久久 | 69中国xxxxxxxxx69| 欧美群妇大交乱 | 特级西西444www大精品视频 | 无码人妻一区二区三区免费n鬼沢 | 久久午夜夜伦鲁鲁一区二区 | 在线观看三级网站 | 日韩在线观看一区 | 亚洲一级av无码毛片精品 | 人人澡人人澡人人澡 | 亚洲自拍av在线 | 超碰人人超 | 欧美男人天堂 | www.youjizz.com久久| 麻豆一二三区 | 亚洲国产精品成人无久久精品 | 按摩害羞主妇中文字幕 | 日本一区二区免费电影 | 天堂俺去俺来也www久久婷婷 | 日日爱影视 | 中文字幕第22页 | 夜夜激情 | 精品国产无码AV | 欧美性极品少妇xxxx | 日本特黄视频 | www国产精品内射老熟女 | 国产美女一区二区 | 日韩成人午夜影院 | 国产精品人人妻人人爽人人牛 | 精品欧美在线观看 | 一个人免费在线观看视频 | 超碰在线国产97 | 九月婷婷丁香 | 亚洲 欧美 日韩 国产综合 在线 | 精品久久久久久国产 | 亚洲欧美综合一区二区 | 91美女网站 | 福利影院在线 |