欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(guò)案例了解靜態(tài)修飾符static使用場(chǎng)景

 更新時(shí)間:2020年10月23日 11:54:17   作者:嘿熊  
這篇文章主要介紹了通過(guò)案例了解靜態(tài)修飾符static使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

  今天在csdn上看到一個(gè)關(guān)于static的帖子,里面的某個(gè)人的回復(fù)引起了我的注意?;貜?fù)的大概意思是說(shuō):"面向?qū)ο罄锩娴撵o態(tài)修飾是面向?qū)ο缶幊處?lái)的垃圾產(chǎn)物,應(yīng)盡量避免使用。"這句話(huà)大體能夠體現(xiàn)static在大部分軟件工程師眼里的尷尬地位,有一部分軟件工程師除了在剛開(kāi)始學(xué)習(xí)的時(shí)候,有使用過(guò)static外,就再也沒(méi)有接觸過(guò)static了。對(duì)此,我不得不說(shuō),這是一種遺憾。static是面向?qū)ο筮@個(gè)大家庭里面不可或缺的一員,少了它,面向?qū)ο蟮木幊虒⑸倭嗽S多的樂(lè)趣,多了許多煩擾。

  一、什么是static修飾符

  許多書(shū)和人都喜歡把static稱(chēng)之為靜態(tài),但我不喜歡這樣稱(chēng)呼它,我更喜歡直接叫它static。因?yàn)槲艺J(rèn)為靜態(tài)這兩個(gè)字無(wú)法真正表達(dá)出static的真正作用。在程序中任何變量或者成員都是在編譯時(shí)由系統(tǒng)自動(dòng)分配內(nèi)存來(lái)存儲(chǔ)的,而用static修飾的成員會(huì)存儲(chǔ)在一個(gè)static內(nèi)存區(qū)中并且一直存在,直到程序退出內(nèi)存才會(huì)釋放這個(gè)空間,也就是只要程序在運(yùn)行,那么這塊內(nèi)存就會(huì)一直存在。那么這樣的設(shè)計(jì)有什么意義了?在面向?qū)ο蟮母拍钪校@樣的設(shè)計(jì)可是十分有意義的!因?yàn)檫@樣的設(shè)計(jì),static可以用來(lái)區(qū)分成員變量、方法是屬于類(lèi)本身還是屬于類(lèi)實(shí)例化后的對(duì)象。有static修飾的成員屬于類(lèi)本身,沒(méi)有static修飾的成員屬于類(lèi)的實(shí)例。

  可能很多人還是不能理解,我在這邊快速簡(jiǎn)單的寫(xiě)個(gè)例子吧。

class a{
  public $aa = 1;
  public function aa(){
    $this->aa += 1;
    echo $this->aa;
  }
}
class b{
  public function bb(){
    $aaa = new a();
    $aaa->aa();
  }
}
class c{
  public function cc(){
    $aaa = new a();
    $aaa->aa();
  }
}
$bbb = new b();
$ccc = new c();
$bbb->bb();
echo '*******************';
$ccc->cc();

注:在"this->aa"里面的"->"是php調(diào)用方法的方式類(lèi)似于java里面的"."

上面代碼很簡(jiǎn)單相信大家都能理解,我就不解釋了。運(yùn)行后的結(jié)果是2*******************2。

上面的代碼是沒(méi)用static的情況,下面我就再寫(xiě)一個(gè)用了static的demo。

class a{
  public static $aa = 1;
  public static function aa(){
    self::$aa += 1;
    echo self::$aa;
  }
}
class b{
  public function bb(){
    a::aa();
  }
}
class c{
  public function cc(){
    a::aa();
  }
}
$bbb = new b();
$ccc = new c();
$bbb->bb();
echo '*******************';
$ccc->cc();

注:"self::"和"::"是php中調(diào)用static修飾的成員的方式。里面的差異與本文要探討的內(nèi)容關(guān)系不大,咱不解釋?zhuān)信d趣的可以自行研究。

最后的運(yùn)行結(jié)果是2*******************3。這說(shuō)明了,在static修飾下的成員變量$aa在第一次調(diào)用后并沒(méi)有被釋放,而是依然存在static內(nèi)存塊中,所有在第二次調(diào)用后輸出的結(jié)果是3。因?yàn)榈谝淮握{(diào)用后的變量$aa從1變成了2,第二次調(diào)用的時(shí)候$aa還是2,所有二次調(diào)用后$aa變成了3。這就是static修飾的變量會(huì)一直存在的體現(xiàn)。同時(shí),要記住在面向?qū)ο蟮木幊讨衧tatic修飾的成員不能直接調(diào)用非static修飾的成員。如果你知道了static的原理這個(gè)就很好理解了。拿java舉例,用static修飾的成員,是專(zhuān)門(mén)存儲(chǔ)在一個(gè)static內(nèi)存區(qū)里面。非static修飾的成員是存儲(chǔ)在堆內(nèi)存里面。兩者是分開(kāi)存儲(chǔ)的,所以要想在static修飾的成員里面調(diào)用非static修飾的成員,就必須跟在外面調(diào)用一樣,先實(shí)例化,在調(diào)用。對(duì)于那為什么可以在非static修飾的成員里面直接調(diào)用static修飾的成員這個(gè)問(wèn)題,我的解釋是,你在類(lèi)外面調(diào)用static成員時(shí)不也是可以不實(shí)例化類(lèi)就直接調(diào)用嗎?更何況在類(lèi)里面了?

  雖然可以在非static修飾的成員里面直接調(diào)用static修飾的成員,但是我強(qiáng)烈建議大家不要這么做!原因后面會(huì)提到。

  二、什么時(shí)候使用static修飾符

  理解了上面說(shuō)的,你只是初步了解了static,要想更近一步的理解static,就要讀懂這句話(huà):"static可以用來(lái)區(qū)分成員變量、方法是屬于類(lèi)本身還是屬于類(lèi)實(shí)例化后的對(duì)象。有static修飾的成員屬于類(lèi)本身,沒(méi)有static修飾的成員屬于類(lèi)的實(shí)例。"很多初學(xué)者會(huì)搞不懂類(lèi)和類(lèi)的實(shí)例有什么不同?類(lèi)是抽象的存在,而類(lèi)的實(shí)例是類(lèi)具體化的存在。兩者是有區(qū)別的,因此就會(huì)發(fā)生一種情況,那就是有些類(lèi)實(shí)例化后沒(méi)有任何意義,也就是說(shuō)沒(méi)有實(shí)例化的必要,只有作為類(lèi)才有意義。這時(shí)候,就必須用static來(lái)修飾成員變量和方法,表明這些變量和方法只屬于類(lèi)本身。比如:在做一個(gè)項(xiàng)目的時(shí)候,一個(gè)合格的軟件工程師都會(huì)封裝一個(gè)公共方法類(lèi),將經(jīng)常用的公共方法放在里面,以便隨時(shí)在項(xiàng)目中調(diào)用。這時(shí)候,你會(huì)發(fā)現(xiàn),這個(gè)公共方法類(lèi),并沒(méi)有一個(gè)合適的具體化的實(shí)例可以來(lái)表示,只有作為類(lèi)的時(shí)候,才有其意義。所以里面的公共方法都可以用static來(lái)修飾,以表示這些方法都屬于類(lèi)本身,就不需要每一次使用一個(gè)公共方法的時(shí)候都要實(shí)例化出一個(gè)具體的對(duì)象了。還有就是像做安全防范(sql注入過(guò)濾、xss過(guò)濾等)的時(shí)候,將其統(tǒng)一封裝成一個(gè)Security類(lèi),里面的方法就需要用到static來(lái)修飾,不然難道每一次過(guò)濾都要實(shí)例化一次嗎?再開(kāi)一個(gè)堆內(nèi)存空間?類(lèi)似的還有語(yǔ)言包、緩存等等。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea使用帶provide修飾依賴(lài)導(dǎo)致ClassNotFound

    idea使用帶provide修飾依賴(lài)導(dǎo)致ClassNotFound

    程序打包到Linux上運(yùn)行時(shí),若Linux上也有這些依賴(lài),為了在Linux上運(yùn)行時(shí)避免依賴(lài)沖突,可以使用provide修飾,本文主要介紹了idea使用帶provide修飾依賴(lài)導(dǎo)致ClassNotFound,下面就來(lái)介紹一下解決方法,感興趣的可以了解一下
    2024-01-01
  • 詳解Spring bean的注解注入之@Autowired的原理及使用

    詳解Spring bean的注解注入之@Autowired的原理及使用

    之前講過(guò)bean注入是什么,也使用了xml的配置文件進(jìn)行bean注入,這也是Spring的最原始的注入方式(xml注入).本文主要講解的注解有以下幾個(gè):@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以參考下
    2021-06-06
  • SpringCloud Config配置加密解密用法解析

    SpringCloud Config配置加密解密用法解析

    這篇文章主要介紹了SpringCloud Config配置加密解密用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 在SpringBoot中更改默認(rèn)端口的方法總結(jié)

    在SpringBoot中更改默認(rèn)端口的方法總結(jié)

    在本文中,小編將帶大家學(xué)習(xí)如何在 Spring Boot 中更改默認(rèn)端口,默認(rèn)情況下,嵌入式 Web 服務(wù)器使用 8080端口來(lái)啟動(dòng) Spring 引導(dǎo)應(yīng)用程序,有幾種方法可以更改該端口,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 詳解SpringBoot緩存的實(shí)例代碼(EhCache 2.x 篇)

    詳解SpringBoot緩存的實(shí)例代碼(EhCache 2.x 篇)

    這篇文章主要介紹了詳解SpringBoot緩存的實(shí)例代碼(EhCache 2.x 篇),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • intellij idea中spring boot properties文件不能自動(dòng)提示問(wèn)題解決

    intellij idea中spring boot properties文件不能自動(dòng)提示問(wèn)題解決

    這篇文章主要介紹了intellij idea中spring boot properties文件不能自動(dòng)提示問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 基于Java編寫(xiě)emoji表情處理工具類(lèi)

    基于Java編寫(xiě)emoji表情處理工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)emoji表情處理工具類(lèi),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java設(shè)計(jì)模式之觀(guān)察者模式

    Java設(shè)計(jì)模式之觀(guān)察者模式

    本文詳細(xì)講解了Java設(shè)計(jì)模式之觀(guān)察者模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能

    java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 如何解決Could not transfer artifact org.springframework.boot問(wèn)題

    如何解決Could not transfer artifact org.spri

    在Maven更新過(guò)程中遇到“Could not transfer artifact org.springframework.boot”錯(cuò)誤通常是由于網(wǎng)絡(luò)問(wèn)題,解決方法是在Maven的設(shè)置中忽略HTTPS,添加特定語(yǔ)句后,可以正常下載依賴(lài),但下載速度可能較慢,這是一種常見(jiàn)的解決方案,希望對(duì)遇到相同問(wèn)題的人有所幫助
    2024-09-09

最新評(píng)論