Java 我们可以更改可变类的最后一个变量的值吗?

Java 我们可以更改可变类的最后一个变量的值吗?,java,final,Java,Final,下面是我试图更改最终变量值的代码。首先打印“a”,然后打印“ab”。那么,如果我们可以更改final变量的值,那么将变量声明为final有什么好处呢?那个么最后一个关键词有什么用呢?求求你,谁能帮我做这个 package test_new; public class FinalVarValueChange { public static void main(String[] args){ final StringBuffer s=new StringBuffer("a");

下面是我试图更改最终变量值的代码。首先打印“a”,然后打印“ab”。那么,如果我们可以更改final变量的值,那么将变量声明为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);     
   }
}

最终变量/引用意味着,您不能将另一个值重新分配给该引用,但可以更改对象的状态


在这里,您正在更改
StringBuffer
对象
s
内部状态

final关键字确保变量持有的
引用不会更改。引用实例的
状态可能会更改。您可能要查找的是引用实例的
不可变性
。这是实例的责任。

final
修饰符意味着您不能更改变量,即对对象的引用,即为同一变量指定其他值。但是,您可以更改对象本身的状态

final是指变量sb,它是对StringBuffer的引用。因为它是final,所以不能让sb引用另一个StringBuffer。但是,您可以(如您所发现的)更改sb当前引用的StringBuffer对象。 请尝试编译此代码

final StringBuffer sb = new StringBuffer();  
sb.append("abc");  
sb.append("xyz");  
sb = new StringBuffer();  

final
不强制引用对象的任何程度的恒定性(它与C++中的
const
相同)

当您将一个变量标记为
final
时,这意味着您不能为该变量指定不同的对象引用

例如,此代码不会编译:

final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/

它在使用可运行、可调用和锁定习惯用法时非常有用。

StringBuffer根据其设计是可变的,方法append只是一种更改其内容的方法

最后一个变量在Java中的含义是:

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

  • 对于基本类型的变量(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.
但如果您使用整数定义它,如下所示

final Integer a = new Integer(123);
您将能够调用对象a的方法,如下所示

a.xxx()

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

是的。我们不能重新分配,不能参考。谢谢大家帮助我……)谢谢劳伦斯的详细描述……这并不完全正确。final和const是相同的,这里的主要区别是Java中的指针对您是隐藏的。也就是说,
final StringBuffer s
StringBuffer*const s
相同(不要与不同的
const StringBuffer*s
混淆。)