衆所周知,java中的不可變類應該由關鍵字「final」修改。但是,爲什麼類BigDecimal.java是一個異常?BigDecimal.java關鍵字「final」
回答
永恆手段,那類不包含會改變它的內部狀態的任何方法。
不可改變類的實例:
class ImmutableInteger {
private final int value;
public ImmutableInteger(int value) {this.value = value;}
public int value() {return value;}
public ImmutableInteger add(int a) {
// instead of changing this state, we will create new instance with result
return new ImmutableInteger(value + a);
}
}
可變類的實例:
class MutableInteger {
private int value;
public MutableInteger(int value) {this.value = value;}
public int value() {return value;}
public MutableInteger add(int a) {
value += a; // mutating internal state
return this;
}
}
修飾符最終裝置,該變量不能被改變。對於變量對象類型這意味着,該變量不能引用其他對象。對於原始類型(byte,short,int,long,float,double)的變量表示該值不能更改。
BigDecimal a = new BigDecimal(1);
BigDecimal b = a.add(new BigDecimal(1)); // returns result in new instance (a is not changed = immutable)
a = new BigDecimal(5); // ok, 'a' is not final = can be change to refer to other BigDecimal instance)
final BigDecimal b = new BigDecimal(1);
BigDecimal c = b.add(new BigDecimal(2)); // // returns result in new instance (a is not changed = immutable)
b = new BigDecimal(5); // NOT OK!!!, 'b' is final = can not be changed to refer to other object
謝謝,現在我明白了。 –
@ValueYouth如果有幫助,隨時將此答案標記爲「接受」:) – matoni
爲什麼類BigDecimal.java是一個異常?
不是,final關鍵字意味着你就不能改變BigDecimal的參考,你仍然可以改變對象的值...
final BigDecimal myDec = BigDecimal.valueOf(1L);
System.out.println(myDec);
myDec = myDec.plus(); //invalid, you cant change the ref
這裏是考慮點塔的BigDecimal是inmutable,讓所有的改變對象的內容的操作將返回的BigDecimal過的新實例....
人數人數人數
final
確實不是表示您不能通過修改通過該引用的對象。
當應用於引用時,final
表示引用不能被改變來引用不同的對象。它是而不是相當於C++的const
限定符。
不可變性意味着沒有提供修改對象狀態的方法。
它不是一個例外。 BigDecimal本身是immutable
,是因爲這個方法沒有修改對象的值。 但是您可以更改變量引用。
BigDecimal bd = new Bigdecimal(10);
bd = bd.add(new BigDecimal(50)); // bd new equals 60
如果你宣佈你的BigDecimal最終,你將不能再更改參考。
final BigDecimal bd = new Bigdecimal(10);
final total = bd.add(new BigDecimal(50)); // Total new equals 60
// bd = bd.add(new BigDecimal(50)); // Will FAIL
- 1. 作弊用java final關鍵字
- 2. 在java中使用「final」關鍵字
- 3. 如何不使用final關鍵字
- 4. Java和使用Final關鍵字
- 5. 關於Thread類的setName()方法中的final關鍵字
- 6. 有關ActivityThread中使用的final關鍵字的疑惑
- 7. 關於緩存的Java final關鍵字語義
- 8. 如何避免使用final關鍵字繼承我們的類?
- 9. d和字符串返回類型問題中的final關鍵字問題
- 10. 的IntelliJ IDEA - 自動final關鍵字添加到生成的變量
- 11. 在'API'中,'final'關鍵字可以作爲C++ 11的條件嗎?
- 12. 如何防止Eclipse將'final'關鍵字添加到成員變量聲明中?
- 13. 什麼時候應該使用final關鍵字而不是枚舉?
- 14. 製作一個變量不變,而無需使用final關鍵字
- 15. 不能在同一行上同時存在兩個關鍵字:private final ...()?
- 16. 在關鍵字
- 17. 關鍵字
- 18. volatile關鍵字
- 19. DbLookup關鍵字
- 20. Static關鍵字
- 21. c#關鍵字
- 22. 關鍵字.NET
- 23. autorelease關鍵字
- 24. 關鍵字
- 25. Java'this'關鍵字
- 26. 按鍵綁定關鍵字
- 27. Aptana:關閉php else關鍵字代碼關鍵字
- 28. 關於帶關鍵字的靜態關鍵字的問題
- 29. 關於該volatile關鍵字
- 30. 關於關鍵字這個
'immutable!= final' - 'immutable'意味着一個實例的值不能被改變,而'final'則意味着你不能創建子類。還有其他不可變但非最終的類,如'java.util.Date'等。 – Thomas