-
子类主动使用却没有被初始化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类没有被初始化2011年8月25日 21:02
7个答案 按时间排序 按投票排序
-
采纳的答案
请把《深入java虚拟机》第二版翻到162页:代码上面的那段,有这样说:使用一个非常量的静态字段只有当类或者接口的却声明了这个字段时才是主动使用
2011年8月25日 21:13
-
首先,因为 hoursOfSleep 是父类的,子类从父类中继承了该字段(这个你是明白的),而之所以
NewbornBaby.hoursOfSleep;
它没有让子类初始化,是因为它相当于
NewParent.hoursOfSleep;
所以,父类被初始化了,而子类并没有被初始化2011年8月25日 21:24
-
hoursOfSleep是非常量静态字段,它继承自NewParent,并不是NewbornBaby类声明的,所以不符合主动使用的要求
2011年8月25日 21:21
-
hoursOfSleep是非常量静态字段,它继承自hoursOfSleep,并不是NewbornBaby类声明的,所以不符合主动使用的要求
2011年8月25日 21:20
-
只有六种活动被认为是主动使用:
1、创建类的新实例
2、调用类中声明的静态方法
3、操作类或者接口中声明的非常量静态字段
4、调用JAVA API中特定的反射方法
5、初始化一个类的子类
6、指定一个类作为虚拟机启动时初始化的类2011年8月25日 21:16
-
static声明的变量是类变量,与对象的加载初始化没太大关系,你可以直接这么调用,而这个类变量其实是父类的,不是自己的。
2011年8月25日 21:13
-
引用
NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,
但是为什么NewbornBaby类没有被初始化
类变量是不能继承的,实际上是访问父类的类变量,只会导致父类初始化。2011年8月25日 21:09
相关推荐
在这个例子中,当我们首次主动使用`Singleton`类时,`counter1`和`counter2`会被初始化。由于`singleton`对象的创建,`counter1`会增加1,而`counter2`保持其默认值0。 了解类的初始化对于优化代码性能、避免并发...
这种加载方式主要得益于Java虚拟机(JVM)的设计,JVM在类首次主动使用时进行初始化,具体时机包括创建类的实例、访问类的静态变量或方法以及子类的初始化等。这样的设计有助于支持Java的平台无关性和动态扩展性。 ...
除了上述主动使用的情况外,所有其他情况都被视为被动使用,这时JVM不会对类进行初始化。 ### 总结 通过以上分析,我们可以看到Java虚拟机的类加载初始化过程是一个复杂但有序的过程。理解这些基本概念对于编写...
- 初始化:设置图片框的属性,如大小、位置、初始图片等。 - 子类化:使用`窗口子类化`命令将图片框的窗口类替换为自定义的子类。 - 重绘处理:在`窗口重绘`事件中编写自绘代码,根据需要绘制图片。 - 消息处理...
被动使用类,如通过子类、反射等不会触发初始化。 JVM的启动通常始于一个特定的初始类,这个类由虚拟机实现指定。JVM会首先加载这个初始类,链接其类信息,然后初始化并调用`public static void main(String[])`...
* 子类引用父类的静态常量,实际上是父类的指令,而不是子类的指令,因此不会主动初始化。 * 使用newarray指令创建数组对象,初始化的对象是数组,而不是类。 * 使用final修饰的字段,已经在编译期把结果存放到常量...
* 访问静态字段:在访问静态字段时,只有直接定义这个字段的类才会被初始化,子类不会被初始化。 * 使用数组定义引用类:数组的属性和方法都是在虚拟机自动生成的子类中实现的,该子类继承自 Object 类。 * 访问常量...
只有当类被主动使用时,JVM才会进行初始化。主动使用包括: - 创建类实例 - 访问类的静态变量或对其赋值 - 调用类的静态方法 - 使用反射加载类 - 初始化类的子类 - 启动类 除此之外的使用都视为被动使用,不会触发...
当程序首次主动使用一个类时,如果该类尚未加载到内存中,JVM会执行加载、连接和初始化三个步骤。加载是将类的二进制数据读入内存,连接是将二进制数据转化为运行时的数据结构,包括验证、准备和解析三个子步骤,而...
只有当类被首次主动使用时(如创建类实例、调用静态方法或访问静态字段),才会触发初始化。如果类只被被动引用,比如通过子类,那么父类不会被初始化。 **类的加载与卸载** 类加载是动态的,但卸载则相对复杂。在...
只有当类被首次主动使用时(如创建类实例、访问静态变量或方法),初始化才会发生。 在实际开发中,我们可能需要通过工具来辅助理解和调试类的加载和初始化过程。例如,`jdb`(Java Debugger)和`javap`(Java ...
需要注意的是,除了以上六种主动用法,其他对类的被动用法不会触发初始化。例如,仅通过子类引用父类的静态字段不会导致父类的初始化。 这个过程保证了类的安全性和正确性,避免了非法代码的执行。理解并掌握Java类...
只有当类被首次主动使用时,才会触发初始化。被动使用类(如通过子类、反射等)不会触发初始化。 在实际应用中,类加载器有多种,包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器...
除此之外,还有被动引用,例如通过子类引用父类的静态字段不会触发子类初始化,数组类型创建仅初始化数组的组件类型。 类的生命周期还包括使用(Using)和卸载(Unloading)。使用阶段是类被实际使用的过程,而卸载...
主动引用场景包括new、get static、put static、invoke static指令的使用,反射调用,初始化父类,启动主类,以及JDK 1.7的动态语言支持。而被动引用,如通过子类引用父类静态字段、通过数组引用类、常量池引用,都...
主动使用包括创建类的实例、访问或修改静态变量、调用静态方法、反射操作、子类初始化以及作为启动类。这些情形下,JVM会触发类的初始化过程。相反,所有非上述情形的类使用都被视为被动使用,不会引发类的初始化。 ...
虚拟机规范定义了五种主动引用,其他情况则视为被动引用,不会立即触发初始化。 例如,通过子类引用父类的静态字段只会初始化父类,而不会初始化子类。同样,通过数组定义引用类不会触发类的初始化,但可能会触发类...
只有当类被首次主动使用时,才会触发初始化,被动使用不会导致初始化。 6. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即子类加载器先尝试将加载请求委托给父类加载器,只有父类加载器无法加载时,子类...
当类被首次主动使用时(如创建类的实例、访问静态变量或方法、反射等),会触发类的初始化。被动使用类(如通过子类引用父类的静态变量)不会触发初始化。 4. **自定义类加载器**: 开发者可以自定义类加载器实现...