想起自己剛入職第一家公司的時候,對靜態這個概念都不是很熟悉,那時候也是初生牛犢不怕虎,抱着僥倖心理就去找工作了,結果可想而知,那肯定是到處碰壁,,近來正好有時間,那就梳理一下,順便重點地去重溫一下static這個修飾符,無論是靜態變量、靜態代碼塊、還是靜態內部類、 參考runnoob https://www.runoob.com/java/java-modifier-types.html ,這裏重點梳理static 和final這兩個,其餘的在菜鳥教程上都有詳細的介紹
static
static可以用來修飾成員變量、代碼塊和方法和類(如靜態內部類)
修飾變量時:static變量也稱作靜態變量,靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。static成員變量的初始化順序按照定義的順序進行初始化。
修飾方法時:java中有this這個概念,指當前對象,而在static方法中是沒有this,常規調用方法的方式都是對象實例.方法名,如factory.product(),而靜態方法中沒有this這個概念,所以它不依賴對象可以直接使用類名調用,而也因爲這個特性導致靜態方法中無法訪問非靜態的成員變量和方法。最典型的例子就是main方法,寫出一個新的class類,在其中寫一個main方法,你會發現main方法無法訪問你定義在類中的非靜態變量,因爲main方法就是一個靜態方法。
靜態代碼塊:static{
XXXXXX......
}
靜態代碼有一個重要特性:只在類加載時執行一次,這個特性使得它非常適合做初始化工作,舉個例子,我希望一個類它的若干屬性在被實例化的時候是有我想要的默認值,而不是爲空或者原本的默認值,就可以在靜態代碼塊裏給這幾個屬性直接賦值。
以上就是static的總結,參考了這個大佬的博客
https://www.cnblogs.com/dolphin0520/p/3799052.html 以及https://www.cnblogs.com/dolphin0520/p/3736238.html
接下來介紹final
final
java中final可以用來修飾類、方法和變量
修飾類:被final修飾的類無法被繼承,這意味該類中的方法無法被重寫,也就是說,被聲明爲final的類,其中的方法也都被隱式地指爲final。一般情況下我們不會將類聲明成final,除非是不想這個類被繼承擴展或者是實在爲了安全考慮
修飾方法:final方法無法被繼承者重寫,這意味着,在類中被private聲明的方法也隱式地被指爲final
修飾變量:修飾常規變量時,表明該變量是一個常量,一旦被賦值就不能再改變,如聲明final int i = 3;當用來修飾引用時,表明該引用指向的對象地址不可再發生變化,比如final Student student= zhansan;該引用一直指向張三不可變,但是zhangsan的屬性是可以變的,比如原本張三的age屬性值爲15;我調用zhangsan.setAge(17);可以修改該對象的屬性。引用指向的對象不可變,但是對象的屬性是可變的。
可以對比一下static和final static是類維度的,final是對象維度的,static在內存中只保存一份,可以直接類名.屬性名獲得,而final不行
舉個例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
運行這段代碼就會發現,每次打印的兩個j值都是一樣的,而i的值卻是不同的。從這裏就可以知道final和static變量的區別了。
static初始化一次,就保存在了固定的位置上(字節碼class文件有記錄),而final聲明的變量在每次新建一個對象的時候被random方法重新賦值,被賦值後在這個對象中成爲一個常量。
在上面給出的連接的博客裏有關於static的面試題,感興趣的可以去看看。
侵刪致歉