程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> final修飾的變量是引用不能改變,還是引用的對象不能改變,final修飾

final修飾的變量是引用不能改變,還是引用的對象不能改變,final修飾

編輯:JAVA綜合教程

final修飾的變量是引用不能改變,還是引用的對象不能改變,final修飾


看代碼:

 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類型的,所以只要不去修改對象就不會出現錯誤的。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved