天天看點

static在C++和Java中的差別

一.static涉及普通變量、函數:

1.靜态全局變量/靜态函數------隐藏特性

僅在聲明它的檔案中可見,同一工程的其它檔案中不可見,可解決不同檔案的變量/函數重名問題; 

2.靜态局部變量------記憶特性

作為static局部變量在函數内定義,其作用域同普通局部變量,但生存周期為整個源程式,在程式剛開始運作完成唯一的一次初始化;

二.static涉及成員變量、函數:

1.靜态成員變量具有如下特性:

a.依附于類而存在,為所有對象共享,在程式中維持一份拷貝,故可通過類名/對象名兩種方式通路,它的值可修改;

   注:關于this指針的讨論隻存在于非靜态成員函數通路非靜态成員變量的情況;當在類的非靜态成員函數中通路類的非靜态成員的時候,編譯器會自動将對象本身的位址作為一個隐含參數傳遞給函數;

b.靜态成員變量必須在類體外初始化(ISO C++禁止非const靜态成員變量在類體内初始化),靜态成員變量還有const修飾的情況除外;

c.靜态成員變量初始化與一般成員變量的初始化格式不同,<資料類型><類名>::<靜态資料成員名> = <值>(否則對象在堆中将找不到需指派的靜态成員變量);

d.初始化在類體外進行,而前面不加static,不加該成員的通路權限控制符private,public等; 

e.靜态成員變量和普通成員變量一樣遵從public,protected,private通路規則;

2.靜态成員函數具有如下特性:

a.靜态成員函數隻能通路靜态成員變量,非靜态成員函數的通路無限制;

b.靜态成員之間可以互相通路,包括靜态成員函數通路靜态資料成員和通路靜态成員函數; 

c.出現在類體外的函數定義不能指定關鍵字static;

d.由于沒有this指針的額外開銷,是以靜态成員函數與類的全局函數相比速度上會有少許的增長;

Java中static的作用:

1.Java中的static是不允許用來修飾局部變量;

2.與C++中涉及成員變量、函數的作用類似,即不依賴對象而存在;

3.靜态代碼塊的使用,來優化程式性能,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且隻會執行一次;

4.static内部類不可通路外部類的非static成員;

轉載于:https://www.cnblogs.com/1203ljh/p/5239797.html