meifage2211
2011-08-25 21:02 阅读 167
已采纳

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    freishlove freishlove 2011-08-25 21:13

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

    点赞 评论 复制链接分享
  • myali88 myali88 2011-08-25 21:09

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

    点赞 评论 复制链接分享
  • AngelAndAngel AngelAndAngel 2011-08-25 21:13

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

    点赞 评论 复制链接分享
  • freishlove freishlove 2011-08-25 21:16

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

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

    点赞 评论 复制链接分享
  • freishlove freishlove 2011-08-25 21:20

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

    点赞 评论 复制链接分享
  • freishlove freishlove 2011-08-25 21:21

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

    点赞 评论 复制链接分享
  • rainbow702 rainbow702 2011-08-25 21:24

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

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

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

    点赞 评论 复制链接分享

相关推荐