摘要:的內(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
摘要:在面向?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)行綁...
摘要:多態(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)使用,也可以作為它的...
摘要:前端性能優(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)化...
摘要:初體驗(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ò)誤和理解偏...
摘要:從運(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...
閱讀 3579·2023-04-26 02:05
閱讀 2024·2021-11-19 11:30
閱讀 4236·2021-09-30 09:59
閱讀 3190·2021-09-10 10:51
閱讀 2615·2021-09-01 10:30
閱讀 1501·2021-08-11 11:20
閱讀 2629·2019-08-30 15:54
閱讀 575·2019-08-30 10:49