Java 空白的最终变量用于创建不可变对象

Java 空白的最终变量用于创建不可变对象,java,final,Java,Final,我知道空白变量用于在java中创建不可变对象,即其成员不能更改的对象 下面几行代码是如何毫无问题地工作的 import java.util.*; class B { int a; } public class BlankFinal { public static void main(String args[]) { final B b; b=new B(); b.a=1; System.out.println(b.a

我知道空白变量用于在java中创建不可变对象,即其成员不能更改的对象 下面几行代码是如何毫无问题地工作的

import java.util.*;

class B
{
    int a;
}    
public class BlankFinal
{
   public static void main(String args[])
   {
      final B b;
      b=new B();
      b.a=1;

      System.out.println(b.a);

      b.a=23;         // b object's a member is changed even though b is 
                      // blank final 

      System.out.println(b.a);

   }     
 }

b
是final这一事实只会阻止您(在初始初始化之后)将新值分配给
b
。它不会阻止您调用
B
的方法来改变
B
引用的对象的状态,或者直接改变
B
引用的对象的实例变量(即
B.a=…
)。

B
的引用是最终的,不能更改。当您尝试更改数据字段
b.a
的值时,它将允许您这样做,因为它不会更改该引用。

几乎正确,但是
final int a
如果不在构造函数中初始化它将不起作用。但是您可以在构造函数外对其进行初始化(在BlankFinal中),但重新分配将不起作用。正确,但就目前情况而言,它无法编译。我的错误,没错,编辑了答案。谢谢如果你的包是最终的,这意味着你不能把它换成另一个包。这并不意味着你不能把东西从袋子里拿出来,也不能把新东西放进去。很好的类比,谢谢