这个程序中CountInt类的中的b是final类型的为什么可以赋值一个可变的数。
import java.util.ArrayList;
import java.util.List;
public class FinalTest
{
public static void main(String[] args)
{
FilledList<CoutInt> foo = new FilledList<CoutInt>(CoutInt.class);
System.out.println(foo.create(14));
}
}
 class CoutInt
{
private static int a;
private final int b = a++;
@Override
public String toString()
{
return Integer.toString(b);
}

}
class FilledList<T> 
{
private Class<T> classtype;
public FilledList(Class<T> type)
{
this.classtype = type;
}
public List<T> create(int Elements)
{
List<T> result =  new ArrayList<T>();
    try{
for(int i=0;i<Elements;i++)
{
result.add(classtype.newInstance());
}
       }catch(Exception ex)
       {
        throw new RuntimeException();
       }
    return result;
}


}

解决方案 »

  1.   

    b = a++;
    因为a还没有被赋值呀
      

  2.   

    final 第一次赋值是就可以的。
      

  3.   

    final只要定义的时候赋值,以后都可以用的。也可以改 
      

  4.   

    final声明的是引用,只要确保指向的对象不变,可以在声明时初始化,也可以在构造函数中初始化,之后引用的指向不变就可以,但是指向的对象的成员可以改变,可以用bufferstring测试一下,不知道我说明白了吗
      

  5.   

    final初始化的时候赋了值,以后不能改了吧。
      

  6.   

    final修饰的变量不是不可变的常量么 a的值一直在变 那么b也会跟着变 我觉得和final的定义矛盾了啊 能不能解释下
      

  7.   

    final这里修饰的是原始数据类型而不是引用类型的啊
      

  8.   

    b的值赋值后没有变
    你每次new 不同的CoutInt ,不同的CoutInt的对象的b是不一样的 
    但是CoutInt的对象的b的值赋值后就没有再改变了
      

  9.   

    final 的值是不变的,已第一次赋值的结果为准撒。
      

  10.   

    恩 这个分析不错 还有个问题请教 如果我在final后面加个static的话  a的值一直在改变 为什么b的值就不变了
      

  11.   

    好好研究下static和final的区别