在Beetle上运行Java时,所发生的第一件事情就是你试图访问Beetle.main( )(一个static方法),于是加载器开始启动并找出Beetle类被编译的程序代码(它被编译到了一个名为Beetle .class的文件之中)。在对它进行加载的过程中,编译器注意到它有一个基类(这是由关键字extends告知的),于是它继续进行加载。不管你是否打算产生一个该基类的对象,这都要发生。(请尝试将对象创建注释掉,以证明这一点。)
如果该基类还有其自身的基类,那么第二个基类就会被加载,如此类推。接下来,根基类中的静态初始化(在此例中为Insect)即会被执行,然后是下一个导出类,以此类推。这种方式很重要,因为导出类的静态初始化可能会依赖于基类成员能否被正确初始化的。
至此为止,必要的类都已加载完毕,对象就可以被创建了。首先,对象中所有的原始类型都会被设为缺省值,对象引用被设为零——这是通过将对象内存设为二进制零值而一举生成的。然后,基类的构造器会被调用。在本例中,它是被自动调用的。但你也可以用super来指定对基类构造器的调用(正如在Beetle( )构造器中的第一步操作。)基类构造器和导出类的构造器一样,以相同的顺序来经历相同的过程。在基类构造器完成之后,实例变量(instance variables)按其次序被初始化。最后,构造器的其余部分被执行。
//: c06:Beetle.java
// The full process of initialization.
import com.bruceeckel.simpletest.*;
class Insect {
protected static Test monitor = new Test();
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 = print("static Insect.x1 initialized");
static int print(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = print("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = print("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
monitor.expect(new String[] {
"static Insect.x1 initialized",
"static Beetle.x2 initialized",
"Beetle constructor",
"i = 9, j = 0",
"Beetle.k initialized",
"k = 47", "j = 39" });}
} // /:~
分享到:
相关推荐
为了更好地理解类继承初始化顺序的概念,下面通过一段示例代码来进行详细分析: ```java class Base { public Base() { System.out.println("Base constructor"); } } class Derived extends Base { public ...
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
3. **继承与初始化** `Father.java`可能涉及到继承的概念。在Java中,子类会继承父类的所有非私有字段和方法。当创建子类对象时,首先会执行父类的构造函数,然后是子类的构造函数。这确保了父类的状态在子类对象...
`init`文件可能包含了各种构造函数的实现,展示它们如何被调用以及与初始化块交互的方式。 5. **成员变量初始化**: Java允许我们在变量声明时进行初始化。这种初始化发生在构造函数之前,因此在实例初始化块之前...
6. **类初始化与类加载器**: - 类的初始化是由对应的类加载器触发的,当且仅当以下条件之一满足时: - 遇到new关键字实例化对象; - 遇到静态字段(非final)并对其进行访问; - 遇到静态方法的调用; - 使用...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...
3. **静态成员变量与实例成员变量的初始化顺序** ```java public class TestOrder { // 静态成员变量初始化 public static TestA a = new TestA(); // 静态初始化块 static { System.out.println("静态初始...
2. **继承关系中的初始化顺序**:在继承关系中,父类的成员变量与初始化块会在子类的对应部分之前执行。 3. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员...
在本文中,我们将详细介绍Java类继承关系中的初始化顺序,并通过实例形式对比分析Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧。 首先,让我们来了解Java类继承关系中的初始化顺序。在Java中,...
本文将深入探讨Virtio_blk初始化流程及其在qemu-kvm中的实现机制。 首先,我们要理解在qemu-kvm中创建一个对象所涉及的三个关键组成部分:类型(type)、类(class)和实例(instance)。类型将类与实例关联起来,类定义...
【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 ) https://hanshuliang.blog.csdn.net/article/details/113735644 博客源码快照
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。...通过学习这些知识点,开发者可以更好地优化代码、设计更健壮的系统,并解决与类加载和初始化相关的复杂问题。
### 成员的初始化顺序 #### 实验背景与目标 在Java编程语言中,理解成员变量的初始化顺序对于正确地设计和实现类结构至关重要。通过本实验,我们将深入了解成员变量的初始化顺序,以及如何通过实际代码示例来验证...
Java关于含有继承类的成员初始化过程讲解 titre1:Java中的继承类成员初始化过程 在Java中,继承类的成员初始化过程是一个复杂且容易让人困惑的地方。今天,我们将通过一个具体的实例来讲解这个过程,以帮助读者...
全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...
Java的初始化与清理是编程过程中至关重要的环节,它关乎到程序的正确运行和资源的有效管理。本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即...
5. **继承与初始化列表**: - 在继承关系中,只有初始化列表能用于初始化基类的私有成员。如果基类的某个成员需要初始化,必须在派生类的构造函数初始化列表中显式指定。 6. **示例**: ```cpp class MyClass { ...