以下是我试图更改最终变量值的代码。首先它打印“a”然后“ab”。那么,如果我们可以改变最终变量的值那么将变量声明为final是什么好处呢?那么最终关键词的用途是什么?请任何人帮我这个?????
package test_new;
public class FinalVarValueChange {
public static void main(String[] args){
final StringBuffer s=new StringBuffer("a");
System.out.println("s before appending :"+s);
s.append("b");
System.out.println("s after appending :"+s);
}
}
答案 0 :(得分:19)
final
不会强制引用引用的对象的任何程度的持久性(在const
相同)。
将变量标记为final
时,表示您无法为该变量指定其他对象引用。
例如,此代码将无法编译:
final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/
使用Runnables,Callables和锁定惯用法时非常有用。
答案 1 :(得分:5)
StringBuffer根据它的设计是可变的,而append方法只是一种改变它内容的方法。
Java中的最终变量意味着:
对于object,这意味着不能将另一个对象分配给此引用,但它不会阻止您调用此对象的方法。
对于基本类型变量(int,float,boolean等),因为这里没有引用和指针,以及对象方法,所以它只是意味着你不能改变变量的值。
采用以下代码
final ObjectA objA = new ObjectA();
您当然可以调用此对象的方法,如下所示
objA.setXXX() //legal for a final variable objA
setXXX()方法的副作用不受此处的final关键字控制。
但是对于以下代码
final int a = 123;
您将无法为此变量分配任何新值,如下所示
a = 234; //Not legal if a has been defined as a final int variable.
但是如果你使用Integer定义它,如下所示
final Integer a = new Integer(123);
您将能够调用对象a的方法,如下所示
a.xxx()
一般来说,对象和基本变量的最终定义是不同的。
答案 2 :(得分:3)
final
修饰符表示您无法更改变量,即引用您的对象,即为同一变量指定其他值。但是,您可以更改对象本身的状态。
答案 3 :(得分:1)
最终变量/引用意味着,您不能将另一个值重新分配给该引用,但是,您可以更改该对象的状态。
在这里,您要更改StringBuffer
对象s
内部状态
答案 4 :(得分:1)
最终关键字可确保变量保留的reference
不会发生变化。引用实例的state
可能会更改。您可能寻找的是引用实例的immutability
。这是实例的责任。
答案 5 :(得分:0)
' final'是指变量sb,它是对StringBuffer的引用。因为它是最终的,你不能让sb引用另一个StringBuffer。但是,您可以(如您所见)更改sb当前引用的StringBuffer对象。 尝试编译此代码
final StringBuffer sb = new StringBuffer();
sb.append("abc");
sb.append("xyz");
sb = new StringBuffer();