在做面試題的時候,發(fā)現(xiàn)經(jīng)常遇到static和final相關(guān)的問題,雖然不是很難,但有時候總是容易搞混,現(xiàn)在再重新記錄一下。
static關(guān)鍵字
在java中,被static修飾的變量叫做靜態(tài)變量(類變量),方法叫做靜態(tài)方法。這些實例和方法被類的所有實例所共享。
常常容易搞混的是靜態(tài)變量和實例變量,那么這兩者的區(qū)別在于:
1.靜態(tài)變量實質(zhì)是一個全局變量,在類加載的時候,在內(nèi)存中分配一個內(nèi)存空間存放該靜態(tài)變量,那么該類的所有實例都可以操作這個內(nèi)存空間,即所有實例共享此靜態(tài)變量。可以直接通過類名來訪問,也可以用類實例來訪問但不推薦。
2.對于實例變量,每創(chuàng)建一個實例,就會為實例變量分配一個內(nèi)存,而這些實例變量在內(nèi)存中是互不影響的。
static方法不能調(diào)用非靜態(tài)成員:在Java中,靜態(tài)方法不能調(diào)用非靜態(tài)方法、以及應(yīng)用非靜態(tài)成員變量,因為在java中,被static修飾的方法和類變量,是先于實例變量存在的,那么當類沒有初始化時,就不存在實例變量,也就沒有分配內(nèi)存了。
非靜態(tài)方法可以調(diào)用靜態(tài)方法:實例化后的方法,通過對象自身可以引用靜態(tài)方法。
在static方法中不能使用this:因為this是類對象的自身引用,需要類初始化類對象之后才能引用,即實例化后分配內(nèi)存之后才可以使用this。
static方法必須是實現(xiàn)的,即不能被abstract修飾。
所有java的main方法必須是static的,這樣在未初始化才能被外部調(diào)用。
Note:類未實例化時,需要訪問類的內(nèi)部方法的時候,可以使用java的反射機制:
final關(guān)鍵字
1.final修飾的方法不能被重寫
2.final修飾的變量不能被修改
3.final變量只能被賦值一次。
對于被static和final同時修飾的變量,可以理解為全局變量,通過類名可以直接訪問,方法則不能被重寫,可以直接訪問。