class NewParent {    static int hoursOfSleep = (int) (Math.random() * 3.0);    static {
        System.out.println("NewParent was initialized.");
    }
}
class NewbornBaby extends NewParent {    static int hoursOfCrying = 6 + (int) (Math.random() * 2.0);    static {
        System.out.println("NewbornBaby was initialized.");
    }
}
class Example2 {    public static void main(String[] args) {
        int hours = NewbornBaby.hoursOfSleep;
        System.out.println(hours);
    static {
        System.out.println("Example2 was initialized.");
    }
}NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,
但是为什么NewbornBaby类没有被初始化

解决方案 »

  1.   

    本身贴的代码直接拷贝到eclipse里面都有编译错误,这里你用NewbornBaby类的一个static变量,所以没有执行输出NewbornBady的静态代码块,如果是对NewbornBaby进行实例化,那么就会执行static代码块
      

  2.   


    System.out.println(hours);后面加个}编译就可以了
      

  3.   

    没有被调用 所以就没有初始化 你要是调用baby中的变量 就初始化了
      

  4.   

    一个类只有在调用static方法或访问static属性或调用构造方法(或者主动调用Class.forName())才会引起类加载器加载类,才会导致static代码块被执行。
    LZ的代码中hoursOfSleep属于父类的属性,所以
    int hours = NewbornBaby.hoursOfSleep;
    的时候,并没有导致NewbornBaby,因为没有满足上述说的调用该类的static方法或访问static属性等前提条件。
    不是因为出现了NewbornBaby就会发生NewbornBaby的加载,要满足上述说的条件,同样的,LZ可以试试
    public static void main(String[] args) {
      //int hours = NewbornBaby.hoursOfSleep;
      //System.out.println(hours);
      NewParent np; //这样定义一个变量看看,看看是不是能调用static代码
      NewbornBaby nb; //所以不是说出现了类名就保证JVM一定会加载该类
    }