class SelfCounter {
  private static int count = 0;
  private int id = count++;
  public String toString() {
    return "SelfCounter " + id;
  }
}class WithFinalFields {
  final SelfCounter scf = new SelfCounter();
  static final SelfCounter scsf =
    new SelfCounter();
  public String toString() {
    return "scf = " + scf + "\nscsf = " + scsf;
  }
}public class E18_FinalFields {
  public static void main(String args[]) {
    System.out.println("First object:");
    System.out.println(new WithFinalFields());
    System.out.println("Second object:");
    System.out.println(new WithFinalFields());
  }
}迷糊打印SCSF对象时TOSTRING 方法中的ID值为什么时0?哪位给祥解下多谢

解决方案 »

  1.   

    static final SelfCounter scsf =new SelfCounter();
    这行是在main执行前执行的,所以scsf对象的ID是0System.out.println("First object:");
    System.out.println(new WithFinalFields());
    System.out.println("Second object:");
    System.out.println(new WithFinalFields());
    此时又生成了两个SelfCounter对象,ID分别是1和2最后共生成了三个SelfCounter对象
      

  2.   

    关键点是:static 的对象是在系统开始运行是装入的
      

  3.   

    static 只分配一块存储空间,所有此类的对象都可以操控此块存储空间。
    final 不可修改的 
    private static int count = 0;
    就是为count=0分配了一块不可修改的存储空间不变的地方
    无论后面怎么对count赋值 count都等于0
      

  4.   

    class SelfCounter {
      private static int count = 0;
      private int id = count++;
      public String toString() {
        return "SelfCounter " + id;
      }
    }class WithFinalFields {
      如果这里+了 "static" final SelfCounter scf = new SelfCounter();
      static final SelfCounter scsf =
        new SelfCounter();
      public String toString() {
        return "scf = " + scf + "\nscsf = " + scsf;
      }
    }public class E18_FinalFields {
      public static void main(String args[]) {
        System.out.println("First object:");
        System.out.println(new WithFinalFields());
        System.out.println("Second object:");
        System.out.println(new WithFinalFields());
      }
    }INPUT:
    First object:
    scf=SelfCounter 0
    scsf = SelfCounter 1
    Second object:
    scf=SelfCounter 0
    scsf = SelfCounter 1为什么SCSF里的ID值又是1了?
      

  5.   

    Second object:
    scf=SelfCounter 0
    scsf = SelfCounter 1
    这个不可能吧?应该是
    Second object:
    scf=SelfCounter 0
    scsf = SelfCounter 2要是真的是你的结果,呵呵,那你算是找到个JAVA的BUG
    为什么?private static int count = 0;  
    count++;   这个在JAVA里是先赋值,然后自增
      

  6.   

    我把这里多+了一个“static ”final SelfCounter scf = new SelfCounter();
      static final SelfCounter scsf =
        new SelfCounter();
    与1楼的不一样