總結:
final修飾的引用類型:是在堆內存new出來的;(如對象)可以被賦值一次,引用地址不可變,但對象里面的內容(如屬性值)可以變。
static修飾的引用類型:是在加載類的時候,load到方法區的;是這個類的實例共有的類方法or屬性;引用的地址可以變,里面具體的內容也可以變
static final修飾的引用類型:是在加載類的時候,load到方法區的(同static);可以被賦值一次,引用地址不可變,但對象里面的內容(如屬性值)可以變(同final);
public class test2 {
// final修飾基本類型的變量public static StringBuffer a = new StringBuffer("StringBuffer");// final修飾引用類型的變量public static final StringBuffer b = new StringBuffer("StringBuffer");//public final StringBuffer c = new StringBuffer("StringBuffer");public static void main(String[] args) {// 編譯報錯,引用不能變test2 t = new test2();a = new StringBuffer("hehe");// b = new StringBuffer("hehe");//b和c都是final的,無法被重新賦值// t.c = new StringBuffer("hehe");// 引用變量所指向的對象中的內容還是可以改變的a.append("xxx");System.out.PRintln(a);//得到hehexxx
b.append("lalal");System.out.println(b);//得到StringBufferlalal
}public static int method1(final int i) {// i = i + 1;// 編譯報錯,因為final修飾的是基本類型的變量return i;}// 有人在定義方法的參數(引用變量)時,可能想采用如下的形式來阻止方法內部修改傳進來的參數對象,// 實際上,這是辦不到的,在該方法內部仍然可以增加如下代碼來修改參數對象public static void method2(final StringBuffer buffer) {buffer.append("buffer");// 編譯通過,因為final修飾的是引用類型的變量}}
參考:
1、http://blog.csdn.net/tengdazhang770960436/article/details/25156743
2、http://blog.csdn.net/u012110719/article/details/46334413
新聞熱點
疑難解答