class Counter{
    private static long counter;
    private final  long id=counter++;
    private final long id2=50;    public String toString(){
        return "ID ="+id;
    }
    /*
    private void changeFinal(){
        id2=100;
    }*///这里就是测试final用的,fianl就是表示常量,不可改变,注释部分编译会报错
}//end of class Counter
public class MyCounter {
    public static void main(String [] args){
        for(int i=0;i<10;i++){
            Counter c = new Counter();
            System.out.println(c);
        }
         Counter cc = new Counter();
         System.out.println(cc);
    }//end of main
}//end of class MyCounter类变量counter声明后,怎么没有初始化就使用了?

解决方案 »

  1.   


    public class StaticVarible
    {
    private static int counter;
    private final int id=counter++;
    }这样编译没有错
    public class StaticVarible
    {
    private static int counter;
    //private final int id=counter++;
    counter++;
    }这样就有错了
      

  2.   

    还有书上对于final修饰变量的解释:
    final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值。private final  long id=counter++;
    针对这个 ,发现并没有详细解释清楚。
      

  3.   

    static变量是具有默认初始值的。关于第二个问题,应该不是没有初始化的问题,暂时还不清楚  坐等高手解释
      

  4.   

    1.在实例化对象时,会先为该对象开辟一片空间,并将这片空间清零(这就使用实例属性都会有默认值)然后再进行初始化并调用构造器。因为counter是int,所以默认值是0。即类中的变量都会有默认值,即使不初始化。
    2.
    public class StaticVarible
    {
        private static int counter;
        //private final int id=counter++;
        counter++;///这条语句,不能放在类中,应该放一个方法的内部。类中只能进行属性和方法的声明
    }