class Value
{
  static int c=0;
  Value()
  {
    c=15;
  }
  Value(int i)
  {
    c=i;
  }
  static void inc()
  {
    c++;
  }
}
class Count
{
  public static void prt(String s)
  {
    System.out.println(s);
  }
    Value v=new Value(10);
    static Value v1,v2;
    static
    {
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v1=new Value(27);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v2=new Value(15);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
    }
  public static void main(String[] args)
  {
    Count ct=new Count();
    prt("ct.c="+ct.v.c);
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    v1.inc();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    prt("ct.c="+ct.v.c);
  }
}运行结果:
v1.c=0  v2.c=0
v1.c=27  v2.c=27
v1.c=15  v2.c=15
ct.c=10
v1.c=10  v2.c=10
v1.c=11  v2.c=11
ct.c=11为什么?

解决方案 »

  1.   

        static
        {
          prt("v1.c="+v1.c+"  v2.c="+v2.c);
          v1=new Value(27);
          prt("v1.c="+v1.c+"  v2.c="+v2.c);
          v2=new Value(15);
          prt("v1.c="+v1.c+"  v2.c="+v2.c);
        }在
    Value v=new Value(10);之前初始化
      

  2.   

    这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。
      

  3.   

    内存先初始化static 域,然后在执行其他的
      

  4.   

    static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。
    prt("ct.c="+ct.v.c);原来对于上面这段代码一直不解,难道ct.v.c的时候,又创建了另一个类变量c,即类变量没有被公用(汗)。现在看来不是这个原因,搞懂了,嘿。今天查看这个未结的贴,结贴距离发贴25天了,有点小进步。加油,坚持。