子类主动使用却没有被初始化

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类没有被初始化

oo

7个回答

请把《深入java虚拟机》第二版翻到162页:代码上面的那段,有这样说:使用一个非常量的静态字段只有[color=red]当类或者接口的却声明了这个字段[/color]时才是主动使用

[quote]
NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,
但是为什么NewbornBaby类没有被初始化
[/quote]
类变量是不能继承的,实际上是访问父类的类变量,只会导致父类初始化。

static声明的变量是类变量,与对象的加载初始化没太大关系,你可以直接这么调用,而这个类变量其实是父类的,不是自己的。

只有六种活动被认为是主动使用:

1、创建类的新实例
2、调用类中声明的静态方法
3、操作类或者接口中[color=red]声明[/color]的非常量静态字段
4、调用JAVA API中特定的反射方法
5、初始化一个类的子类
6、指定一个类作为虚拟机启动时初始化的类

hoursOfSleep是非常量静态字段,它继承自hoursOfSleep,并不是NewbornBaby类声明的,所以不符合主动使用的要求

hoursOfSleep是非常量静态字段,它继承自NewParent,并不是NewbornBaby类声明的,所以不符合主动使用的要求

首先,因为 hoursOfSleep 是父类的,子类从父类中继承了该字段(这个你是明白的),而之所以
[code="java"]
NewbornBaby.hoursOfSleep;
[/code]
它没有让子类初始化,是因为它相当于

[code="java"]
NewParent.hoursOfSleep;
[/code]

所以,父类被初始化了,而子类并没有被初始化

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐