在看thinking in java的类型信息这一章,碰到这样一个程序,有些不明白,望高手解答:
程序如下: import java.util.* ;class Initable {
          static final int  staticFinal = 47   ;
          static final int staticFinal2 = 
                      ClassInitialization.rand.nextInt(1000) ;
          static {
                    System.out.println("Initializing Initable ");
          }
}
class Initable2  {
          static int staticNonFinal = 147 ;
          static {
                    System.out.println("Initializing Initable2");
          }
}
public class ClassInitialization {
          public static Random rand = new Random(47) ;
          public static void main(String[] args)  throws Exception  {
                    Class initable = Initable.class ;
                    System.out.println("After creating Initable ref");
                    System.out.println(Initable.staticFinal);
                    System.out.println(Initable.staticFinal2);
                    System.out.println(Initable2.staticNonFinal);
          }
}
为什么运行结果是:
After creating Initable ref
47
Initializing Initable 
258
Initializing Initable2
147
为什么在打印System.out.println(Initable.staticFinal2);前要先把Initable类初始化,
书上说调用static final(即编译期常量)时不需先初始化该类啊,
如果把static final int staticFinal2 = ClassInitialization.rand.nextInt(1000) ;
改成static final int staticFinal2 = 20;则Initializing Initable 不会打印,也就是不会初始化Initable类,这是为什么呢?

解决方案 »

  1.   


     static final int staticFinal2 = 
                          ClassInitialization.rand.nextInt(1000) ; 因为这不是编译时常量,在编译的时候怎么能知道  ClassInitialization.rand.nextInt(1000) 是多少呢。。 你改成20那就是编译时常量了。
      

  2.   

    Initable类初始化
    你代码中没有初始化吧,注意看清楚哦。
    应为是static修饰的,在Initable.的时候这个类就加载到内存当中了,不应该叫初始化,然后static修饰的值都会在静态区中产生,而Initable.加载类的时候他会执行一下这个类中的静态块,所以System.out.println("Initializing Initable ");
    System.out.println("Initializing Initable2 ");
    静态块只会在类加载的时候执行一次就不会在执行了,所有你只能看到一次,不是说你改了就不会执行了。
      

  3.   

    1.确实不需要实例化的,请LZ仔细看代码,并且要区分大小写,这里的 
    Class initable = Initable.class ; 是一个类对象,而不是一个类的实例对象。
    2.书上是说了静态的东西不需要实例化可以直接引用,但是你可以试一下,你创建了实例,这个实例也是可以调用静态的东西的。
    3.你改成20和初始化类没什么关系,在你没注释Class initable = Initable.class ;这句语句的时候,依然会打印出"Initializing Initable ",当你没创建实例的时候,你的这个代码,只是进行了打印输出,并没有用到Initable和Initable2这两个类。
    不知道LZ懂没、
      

  4.   

    static 表示静态的意思,表示某个变量或是方法是属于某个类的不是某个对象的,
    static final,某个变量或方法不仅是静态的而且还是final,表示该变量或是方法不能被继承的。
      

  5.   

    一个没有 final ,一个有 final