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());
  }
}INPUT:
First object:
scf=SelfCounter 1
scsf = SelfCounter 0
Second object:
scf=SelfCounter 2
scsf = SelfCounter 0麻烦给祥解下2个对象的ID值是如何得出的,多谢。。

解决方案 »

  1.   

    一个对象的初始化顺序为: 静态 域** ---> 非静态 域 ---> 静态初始化语句** --->非静态初始化语句 ---> 构造函数
    静态初始化语句是static{ /*---codes---*/ }
    非静态初始化语句就是去掉static
    **:只在第一次初始这个类的对象,或者第一次访问这个类的静态域或静态方法的时候才发生
      

  2.   

    new WithFinalFields()放在 System.out.println()中 那么会自动调用toString()方法的
      

  3.   

    在一个类中定义一个变量为static,那就是说,无需本类的对象即可调用此变量。
    也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。
    你把count 开放成 public就知道了
      

  4.   

    这个问题跟final 没有太多的关系。
    主要是static 和 count++的问题。
    System.out.println("First object:");
    System.out.println(new WithFinalFields());
    初始化WithFinalFields中的static final SelfCounter scsf =  new SelfCounter();
    初始化SelfCounter 中的private static int count = 0;
    然后初始化SelfCounter 中的 private int id = count++;这个时候的id还是等于0。(请注意区别++count)
    这个时候count的值=1
    这个时候scsf的值就有了0接着初始化WithFinalFields中的final SelfCounter scf = new SelfCounter();
    因为count这个时候的值是1了(count在内存中只有一份)
    所以id=1。做完这个操作以后count=2以后的你就自己推算吧
      

  5.   

    System.out.println("First object:");
        System.out.println(new WithFinalFields());
               1、   new SelfCounter();
                      ------>private static int count = 0;然后跳出new SelfCounter只一次
              
                      ------>在进入new SelfCounter 执行private int id = count++;
                       static final SelfCounter scsf =……;赋值给scsf
        System.out.println("Second object:");
        System.out.println(new WithFinalFields());
               2、执行private int id = count++;
      

  6.   

    自己可以通过eclipse的debug功能来看看是怎么工作的
    最好是自己有个环境自己来测试一下
    形象的看看就非常好啦
      

  7.   

    是不是static final SelfCounter scsf =new SelfCounter();这个static对象只加载1次,所以他的对象id值一直是0?