經(jīng)??吹接腥嗽诙x常量時,比如:
// 使用日志框架定義一個logger時
private static final Logger logger = LoggerFactory.getLogger(BalaService.class);
// 定義常量時
public final static String SUCCESS_CODE = "200";
看別人這樣寫,自己也模仿著這樣寫,有時還記不住final static,其實是自己沒有明白其真正的含義。
引用
http://www.cnblogs.com/dolphin0520/p/3736238.html
這篇講final的博客中的一段代碼:
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
運行這段代碼j的值是不變的,而i的值是變化的。
Java類中使用static修飾的,如static初始化代碼塊,static修飾的變量。Java類在初始化時優(yōu)先初始化靜態(tài)變量,靜態(tài)初始化的變量保存在內(nèi)存的全局區(qū)域,被這個類生成的對象所共享,關(guān)于內(nèi)存的高深細節(jié)我現(xiàn)在也不是很明白,等后續(xù)跟進吧。
由上面的代碼,j是類相關(guān)的變量,i是對象相關(guān)的變量。兩次new MyClass() j 只會初始化一次,被MyClass生成的對象共享。i 會在一次new MyClass()時就初始化一次,所以 i 是變化的。
當使用static final去修飾一個變量時:
- 期望是使用類名去訪問這個變量,訪問方便;
- 使用這個變量時,類裝載進JVM,只初始化一次,保存在內(nèi)存的全局區(qū)域;
- 可被多個對象實例共享;
- final表示這個變量是個常量,不允許被改變。
關(guān)于static和final還有更多的細節(jié),我只撿出工作中遇到的、有疑惑的部分,更多實際有趣的使用,還請你多多分享哦!