众所周知,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. 'final'关键字的含义是什么?
- 3. 声明列表场final关键字
- 4. Java和使用Final关键字
- 5. 在java中使用“final”关键字
- 6. 如何不使用final关键字
- 7. 实体类和final关键字
- 8. 关于缓存的Java final关键字语义
- 9. 关于Thread类的setName()方法中的final关键字
- 10. 有关ActivityThread中使用的final关键字的疑惑
- 11. 方法参数中有final关键字的用途是什么?
- 12. 何时在课前使用“final”关键字?
- 13. 在方法中使用final关键字的Java
- 14. 关键字'Private'和'Final'有什么区别?
- 15. 如何避免使用final关键字继承我们的类?
- 16. 关于final类
- 17. d和字符串返回类型问题中的final关键字问题
- 18. 非final字段
- 19. 为什么我们对匿名内部类使用final关键字?
- 20. 在'API'中,'final'关键字可以作为C++ 11的条件吗?
- 21. 如何防止Eclipse将'final'关键字添加到成员变量声明中?
- 22. 什么时候应该使用final关键字而不是枚举?
- 23. 如何在不使用final关键字的情况下让类不能扩展?
- 24. 制作一个变量不变,而无需使用final关键字
- 25. 不能在同一行上同时存在两个关键字:private final ...()?
- 26. 的IntelliJ IDEA - 自动final关键字添加到生成的变量
- 27. c#关键字
- 28. static关键字
- 29. Java'this'关键字
- 30. 关键字
'immutable!= final' - 'immutable'意味着一个实例的值不能被改变,而'final'则意味着你不能创建子类。还有其他不可变但非最终的类,如'java.util.Date'等。 – Thomas