看代碼:
1 package pnunu.oa.test; 2 3 public class TestFinal { 4 public static void main(String[] args) { 5 final StringBuilder sb = new StringBuilder("123"); 6 // 同一對象的hashCode值相同 7 System.out.println("sb中的內容是:" + sb); 8 System.out.println(sb + "的哈希編碼是:" + sb.hashCode()); 9 sb.append("我變了"); 10 System.out.println("sb中的內容是:" + sb); 11 System.out.println(sb + "的哈希編碼是:" + sb.hashCode()); 12 System.out.println("-----------------哈希值-------------------"); 13 TestFinal test = new TestFinal(); 14 System.out.println(test.hashCode()); 15 System.out.println(Integer.toHexString(test.hashCode())); 16 System.out.println(test.getClass().getName() + "@" 17 + Integer.toHexString(test.hashCode())); 18 // 在API中這麼定義toString()等同於 getClass().getName() + '@' + 19 // Integer.toHexString(hashCode()) 20 // 返回值是 a string representation of the object. 21 System.out.println(test.toString()); 22 } 23 }
看結果:
1 sb中的內容是:123 2 123的哈希編碼是:14576877 3 sb中的內容是:123我變了 4 123我變了的哈希編碼是:14576877 5 -----------------哈希值------------------- 6 12677476 7 c17164 8 pnunu.oa.test.TestFinal@c17164 9 pnunu.oa.test.TestFinal@c17164
分析結果,兩次的hashCode都是一樣的,表示引用變量沒變,引用變量所指向的對象中的內容還是可以改變的
總得來說對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;
如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象。
------------------------------------------------------------------------------------------------------
例如,對於如下語句:
final StringBuffer a = new StringBuffer("immutable");
執行如下語句將報告編譯期錯誤:
a = new StringBuffer("");
但是,執行如下語句則可以通過編譯:
a.append("broken!");
有人在定義方法的參數時,可能想采用如下形式來阻止方法內部修改傳進來的參數對象:
public void method(final StringBuffer param){}
實際上,這是辦不到的,在該方法內部仍然可以增加如下代碼來修改參數對象:
param.append("a");
這是因為變量param的引用並沒有變化,所以是不會出錯的。
但是下面的就會出錯了,因為int類型的數據是直接放在了棧內存當中的,它不需要想對象一樣需要有一個引用,
如果修改了x就是修改了引用,所以如果修改了x那麼就會出錯。
public int addOne(final int x) {
return x++;
}
又比如如下的例子:
public class Something{
public static void main(String[] args) {
Other o = newOther();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
這個在編譯的時候也是不會出錯的,因為這個時候修改的不是對象的引用而是對象的屬性,因為只有對象是final類型的,所以只要不去修改對象就不會出現錯誤的。