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

Eag*_*gle 11 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);     
   }
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 19

final不强制引用引用的对象的任何程度的持久性(它与C++中的一样const).

将变量标记为时final,表示您无法为该变量分配不同的对象引用.

例如,此代码将无法编译:

final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/
Run Code Online (Sandbox Code Playgroud)

使用Runnables,Callables和锁定惯用法时它非常有用.


Law*_*Liu 5

StringBuffer根据它的设计是可变的,而方法append只是一种改变它内容的方法.

Java中的最终变量意味着:

  • 对于object,这意味着您不能将另一个对象分配给此引用,但它不会阻止您调用此对象的方法.

  • 对于基本类型变量(int,float,boolean等),因为这里没有引用和指针,以及对象方法,所以它只是意味着你不能改变变量的值.

请遵循以下准则

final ObjectA objA = new ObjectA();
Run Code Online (Sandbox Code Playgroud)

您当然可以调用此对象的方法,如下所示

objA.setXXX() //legal for a final variable objA
Run Code Online (Sandbox Code Playgroud)

setXXX()方法的副作用不受此处的final关键字控制.

但是对于以下代码

final int a = 123;
Run Code Online (Sandbox Code Playgroud)

您将无法为此变量分配任何新值,如下所示

a = 234; //Not legal if a has been defined as a final int variable.
Run Code Online (Sandbox Code Playgroud)

但是如果你使用Integer定义它,如下所示

final Integer a = new Integer(123);
Run Code Online (Sandbox Code Playgroud)

您将能够调用对象a的方法,如下所示

a.xxx()
Run Code Online (Sandbox Code Playgroud)

一般来说,对象和基本变量的最终定义是不同的.