0 0

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

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 
2011年8月25日 21:02

7个答案 按时间排序 按投票排序

0 0

采纳的答案

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

2011年8月25日 21:13
0 0

首先,因为 hoursOfSleep 是父类的,子类从父类中继承了该字段(这个你是明白的),而之所以

NewbornBaby.hoursOfSleep; 

它没有让子类初始化,是因为它相当于

NewParent.hoursOfSleep; 


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

2011年8月25日 21:24
0 0

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

2011年8月25日 21:21
0 0

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

2011年8月25日 21:20
0 0

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

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

2011年8月25日 21:16
0 0

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

2011年8月25日 21:13
0 0

引用

NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,
但是为什么NewbornBaby类没有被初始化

类变量是不能继承的,实际上是访问父类的类变量,只会导致父类初始化。

2011年8月25日 21:09

相关推荐

    【05-面向对象(下)】

    •对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块中指定初始值。要么在定义时、或构造器中指定初始值。 final修饰局部变量 •使用final修饰...

    java 面试题 总结

    子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。...

    超级有影响力霸气的Java面试题大全文档

    子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。...

    UML和模式应用(架构师必备).part01.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part07.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part02.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part06.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part03.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part04.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part08.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

    UML和模式应用(架构师必备).part05.rar

    38.12 使用模板方法模式的具体化 38.13 使用MapperFactory配置Mapper 38.14 模式:缓存管理 38.15 在类中合并和隐藏SQL语句 38.16 事务状态和状态模式 38.17 使用命令模式设计事务 38.18 使用虚代理实现滞后...

Global site tag (gtag.js) - Google Analytics