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类没有被初始化
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类没有被初始化
System.out.println(hours);后面加个}编译就可以了
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一定会加载该类
}