我们可以更改可变类的最终变量的值吗?

时间:2014-03-12 12:14:59

标签: java final

以下是我试图更改最终变量值的代码。首先它打印“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);     
   }
}

6 个答案:

答案 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();