1 class FinalTest
  {
      public static final String staticValue1 = "静态变量1";
      public static final String staticValue2;
      
      static
      {
          staticValue2 = "静态变量2";
      }
     
     public final String value1 = "实例变量1";
     public final String value2;
     public final String value3;
     
     {
         value2 = "实例变量2";
     }
     
     public FinalTest()
     {
         value3 = "实例变量3";
     }
 }上面的代码为什么没有报错,刚才测试了,不是说用final修饰的变量必须赋值的吗。

解决方案 »

  1.   

    static
          {
              staticValue2 = "静态变量2";
          }
    在静态初始化块中赋值了。
      

  2.   

    那这两个呢public final String value2;
         public final String value3;
      

  3.   

    static final field 可以直接复制,或者在 static 块中初始化final field 可以在 构造器中初始化或者 初始化块中初始化
    class FinalTest
      {
      //定义时赋值
          public static final String staticValue1 = "静态变量1";
      //在 static 初始化块 中赋值 所以正确
          public static final String staticValue2;
           
          static
          {
              staticValue2 = "静态变量2";
          }
          
      //在定义时赋值
         public final String value1 = "实例变量1";
     //对象初始化块中被赋值,而且限于,所以正确,但不可再在构造器中复制
         public final String value2;
     //在构造器中初始化,所以正确。
         public final String value3;
          
         {
             value2 = "实例变量2";
         }
          
         public FinalTest()
         {
             value3 = "实例变量3";
         }
     }
      

  4.   

    不是final也必须赋值啊。lz,final与非final的区别是,final变量不能重复赋值。对于实例final变量,最晚在构造方法中赋值。
    对于静态final变量,最晚在静态初始化块中赋值。