成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

[轉(zhuǎn)] 再論 java 中的 final 變量

soasme / 1240人閱讀

摘要:的內(nèi)存分配方式修飾變量通常情況下,變量有個(gè)地方可以賦值直接賦值,構(gòu)造函數(shù)中,或是初始化塊中。如就是對(duì)于變量,在聲明時(shí),如果你沒(méi)有賦值,系統(tǒng)默認(rèn)這是一個(gè)空白域,在構(gòu)造函數(shù)進(jìn)行初始化,如果是靜態(tài)的,則可以在初始化塊。

【java中為什么會(huì)有final變量】:

final這個(gè)關(guān)鍵字的含義是“這是無(wú)法改變的”或者“終態(tài)的”;
那么為什么要阻止改變呢?
java語(yǔ)言的發(fā)明者可能由于兩個(gè)目的而阻止改變:
1).效率問(wèn)題:
    jdk中的某些類(lèi)的某些方法,是不允許被用戶覆蓋的,設(shè)計(jì)者可能認(rèn)為,所用方法已經(jīng)是最好的方法,
    用戶私自覆蓋,或是由于疏忽而覆蓋,就會(huì)影響JVM或是系統(tǒng)的系能;
2). 設(shè)計(jì)所需:
    眾所周知,有些情況必須使用final關(guān)鍵字,比如方法中的匿名內(nèi)部類(lèi)的參數(shù)傳遞;

【final關(guān)鍵字的使用方法】:

【修飾變量】:
    final成員變量表示常量,只能被賦值一次,賦值后值不再改變。
【修飾方法】:
    final方法不能被子類(lèi)方法覆蓋,但可以被繼承。
【修飾類(lèi)】:
    final類(lèi)不能被繼承,沒(méi)有子類(lèi),final類(lèi)中所有方法都是final的。

【final的內(nèi)存分配方式】:

【修飾變量】:
    通常情況下,final變量有3個(gè)地方可以賦值:直接賦值,構(gòu)造函數(shù)中,或是初始化塊中。
    【初始化】:
        由于在java的語(yǔ)法中,聲明和初始化是聯(lián)系在一起的,
        也就是說(shuō):如果你不顯示的初始化一個(gè)變量,系統(tǒng)會(huì)自動(dòng)用一個(gè)默認(rèn)值來(lái)對(duì)其進(jìn)行初始化。(如int就是0)
        對(duì)于final變量,在聲明時(shí),如果你沒(méi)有賦值,系統(tǒng)默認(rèn)這是一個(gè)空白域,在構(gòu)造函數(shù)進(jìn)行初始化,
        如果是靜態(tài)的,則可以在初始化塊。
    【內(nèi)存】:
         常量(final變量)和非final變量的處理方式是不一樣的。
         每一個(gè)類(lèi)型在用到一個(gè)常量時(shí),都會(huì)復(fù)制一份到自己的常量池中。
         常量也像類(lèi)變量(static)一樣保存在方法區(qū),只不過(guò)他保存在常量池。
         (可能是,類(lèi)變量被所有實(shí)例共享,而常量池是每個(gè)實(shí)例獨(dú)有的。)
【修飾方法】:
    保存在方法區(qū),并且可以被函數(shù)代碼直接替換,而不用等到執(zhí)行時(shí)再?zèng)Q定具體是那個(gè)函數(shù)。
【修飾類(lèi)】:
    保存在方法區(qū)。

【java中變量的初始化順序】:

 變量的初始化次序優(yōu)于任何方法,甚至在構(gòu)造方法的前面。對(duì)于static變量也是一樣,
 如果變量是原始類(lèi)型,那么它得到一個(gè)標(biāo)準(zhǔn)的原始類(lèi)型的初始值,
 如果是一個(gè)對(duì)象的引用,除非你創(chuàng)建了一個(gè)新的對(duì)象給這個(gè)引用,否則就是null。
 static變量在需要的時(shí)候才會(huì)初始化,并且在這個(gè)類(lèi)的構(gòu)造函數(shù)和所有其他普通變量之前調(diào)用,static之后就不再進(jìn)行初始化了,
 static變量在類(lèi)初始化時(shí)(注意不是實(shí)例),就必須分配內(nèi)存空間,
 static變量多帶帶劃分一塊存儲(chǔ)空間。

 java類(lèi)首次裝入時(shí),會(huì)對(duì)靜態(tài)成員變量或方法進(jìn)行一次初始化,
 先初始化父類(lèi)的靜態(tài)代碼-->初始化子類(lèi)的靜態(tài)代碼-->
 (創(chuàng)建使歷史,如果不創(chuàng)建實(shí)例,則后面的不執(zhí)行)初始化父類(lèi)的非靜態(tài)代碼-->初始化父類(lèi)的構(gòu)造
     -->初始化子類(lèi)的非靜態(tài)代碼-->初始化子類(lèi)的構(gòu)造

 類(lèi)只有在使用new調(diào)用創(chuàng)建的時(shí)候才會(huì)被java類(lèi)裝載器裝入。

【final方法為何會(huì)高效】:

final方法會(huì)在編譯的過(guò)程中利用內(nèi)嵌機(jī)制進(jìn)行inline優(yōu)化。
inline優(yōu)化是指:在編譯的時(shí)候直接調(diào)用函數(shù)代碼替換,而不是在運(yùn)行時(shí)調(diào)用函數(shù)。
inline需要在編譯的時(shí)候就知道最后要用哪個(gè)函數(shù),    
顯然,非final是不行的。
非final方法可能在子類(lèi)中被重寫(xiě),由于可能出現(xiàn)多態(tài)的情況,編譯器在編譯階段
并不能確定將來(lái)調(diào)用方法的對(duì)象的真正類(lèi)型,也就無(wú)法確定到底調(diào)用哪個(gè)方法。

【什么是多態(tài)】:

按字面的意思是“多種狀態(tài)”。在面向?qū)ο笳Z(yǔ)言中,接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。
簡(jiǎn)單的說(shuō),就是一句話:允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針。

【非final方法為什么會(huì)出現(xiàn)多態(tài)】:

顯然,如果派生出一個(gè)子類(lèi),覆蓋非final方法,就會(huì)出現(xiàn)2個(gè)這樣的方法可供調(diào)用,這就是多態(tài)。

【final變量的變與不變】:

有人說(shuō)final變量在賦值后就不可變,
那么這個(gè)不變到底指的是什么呢?
這個(gè)不變指的是引用,是地址,而所引用的對(duì)象的內(nèi)容仍然是可變的。
就是說(shuō),這個(gè)final變量永遠(yuǎn)指向某個(gè)對(duì)象,是一個(gè)常量指針,而不是指向常量的指針。

===========================================================================================

【final關(guān)鍵字的具體應(yīng)用】:

【final+變量】:
    在實(shí)際應(yīng)用中,這種形式是非常少見(jiàn)的。
    比如logger是可以的,但是貌似并不是非常實(shí)用,或許用戶仍然希望通過(guò)setter來(lái)改變logger變量。
【static+final+變量】:
    常量。經(jīng)常使用。
【final+方法】:
    JDK中常用,但是自己并未常用。
【final+類(lèi)】:
    helper類(lèi)經(jīng)常使用。
【final用于匿名內(nèi)部類(lèi)的參數(shù)傳遞】:
    在多線程測(cè)試時(shí),經(jīng)常使用。
【final用于方法的參數(shù)】:
    并不常用。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65327.html

相關(guān)文章

  • Java 多態(tài)(8)

    摘要:在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,多態(tài)是繼數(shù)據(jù)抽象和繼承之后的第三種基本特征。 在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,多態(tài)是繼數(shù)據(jù)抽象和繼承之后的第三種基本特征。 1.再論向上轉(zhuǎn)型 多態(tài)作用:消除類(lèi)型之間的耦合關(guān)系. 2.轉(zhuǎn)機(jī) 綁定:將一個(gè)方法調(diào)用同一個(gè)方法主體關(guān)聯(lián)起來(lái). 前期綁定:在程序執(zhí)行前就進(jìn)行綁定(面向過(guò)程語(yǔ)言默認(rèn)綁定方式). 后期綁定:也叫動(dòng)態(tài)綁定或運(yùn)行時(shí)綁定,在運(yùn)行時(shí)根據(jù)對(duì)象的類(lèi)型進(jìn)行綁...

    v1 評(píng)論0 收藏0
  • Java編程思想》筆記8.多態(tài)

    摘要:多態(tài)的作用是消除類(lèi)型之間的耦合關(guān)系。編寫(xiě)構(gòu)造器準(zhǔn)則用盡可能簡(jiǎn)單的方法使對(duì)象進(jìn)入正常狀態(tài),如果可以的話,避免調(diào)用其他方法。 點(diǎn)擊進(jìn)入我的博客 在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,多態(tài)是繼數(shù)據(jù)抽象(封裝)和繼承之后的第三種基本特征。多態(tài)通過(guò)分離做什么和怎么做,從另一角度將接口和實(shí)現(xiàn)分離開(kāi)來(lái)。多態(tài)的作用是消除類(lèi)型之間的耦合關(guān)系。 8.1 再論向上轉(zhuǎn)型 對(duì)象既可以作為它自己的本類(lèi)使用,也可以作為它的...

    chinafgj 評(píng)論0 收藏0
  • 鳥(niǎo)瞰前端 , 再論性能優(yōu)化

    摘要:前端性能優(yōu)化的涉及點(diǎn)從服務(wù)器到協(xié)議再到宿主環(huán)境本身都要有比較深刻的認(rèn)識(shí),業(yè)界目前主要還是以雅虎總結(jié)出來(lái)?xiàng)l前端性能優(yōu)化的黃金軍規(guī)為參考。 歡迎大家前往騰訊云技術(shù)社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 導(dǎo)語(yǔ) : 從事前端有6年+的時(shí)間了,從最開(kāi)始的美工到重構(gòu)再到偏向js邏輯開(kāi)發(fā)的前端開(kāi)發(fā),一直在前端這個(gè)行業(yè)里面摸索和學(xué)習(xí),我現(xiàn)在將自己這些年的一個(gè)心得體會(huì)來(lái)個(gè)系統(tǒng)性的梳理寫(xiě)成一篇關(guān)于性能優(yōu)化...

    voidking 評(píng)論0 收藏0
  • 轉(zhuǎn) | Java8初體驗(yàn)(一)lambda表達(dá)式語(yǔ)法

    摘要:初體驗(yàn)下面進(jìn)入本文的正題表達(dá)式。接下來(lái)展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來(lái)方法引用和構(gòu)造器引用進(jìn)一步簡(jiǎn)化了表達(dá)式的書(shū)寫(xiě),但是個(gè)人覺(jué)得這方面沒(méi)有的下劃線語(yǔ)法更加通用。 感謝同事【天錦】的投稿。投稿請(qǐng)聯(lián)系 [email protected] 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因?yàn)楸救艘彩莿倓傞_(kāi)始學(xué)習(xí)Java8,所以文中肯定有錯(cuò)誤和理解偏...

    Lucky_Boy 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]編寫(xiě)類(lèi)之四再論繼承

    摘要:從運(yùn)行結(jié)果可以看出,當(dāng)子類(lèi)繼承多個(gè)父類(lèi)的時(shí)候,對(duì)于構(gòu)造函數(shù),只有第一個(gè)能夠被繼承,第二個(gè)就等掉了。重點(diǎn)看,類(lèi)繼承了,同時(shí),在構(gòu)造函數(shù)中自己做了規(guī)定,也就是的構(gòu)造函數(shù)是按照的意愿執(zhí)行,不執(zhí)行的內(nèi)容,但是,還有一個(gè)方法,則繼承了這個(gè)方法。 在上一講代碼的基礎(chǔ)上,做進(jìn)一步修改,成為了如下程序,請(qǐng)看官研習(xí)這個(gè)程序: #!/usr/bin/env python #coding:utf-8 c...

    BoYang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<