class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Table {
static Bowl b1 = new Bowl(1);
Table() {
System.out.println("Table()");
b2.f(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl b2 = new Bowl(2);
}
class Cupboard {
Bowl b3 = new Bowl(3);
113
static Bowl b4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl b5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
}
Bowl 允许我们检查一个类的创建过程,而Table 和Cupboard 能创建散布于类定义中的Bowl 的static 成
员。注意在static 定义之前,Cupboard 先创建了一个非static 的Bowl b3。它的输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
static 初始化只有在必要的时候才会进行。如果不创建一个Table 对象,而且永远都不引用Table.b1 或
Table.b2,那么static Bowl b1 和b2 永远都不会创建。然而,只有在创建了第一个Table 对象之后(或者
发生了第一次static 访问),它们才会创建。在那以后,static 对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static 对象。大家
可从输出结果中找到相应的证据。
在这里有必要总结一下对象的创建过程。请考虑一个名为Dog 的类:
(1) 类型为Dog 的一个对象首次创建时,或者Dog 类的static 方法/static 字段首次访问时,Java 解释器
必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class 后(它会创建一个Class 对象,这将在后面学到),它的所有static 初始化模块都会运
行。因此,static 初始化仅发生一次——在Class 对象首次载入的时候。
(3) 创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个Dog 对象分配足够多的存
储空间。
(4) 这种存储空间会清为零,将Dog 中的所有基本类型设为它们的默认值(零用于数字,以及boolean 和
char 的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。正如第6 章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时
候。
继承初始化发生的第一件事情是装载程序到外面找到那个类。(还是先装载父类的static变量和方法)在装载过程中,装载程序注意它有一个基础类(即extends 关键字要表达的意思),所以随之将其载入。无论是否准备生成那个基础类的一个对象,这个过程都会发生,。保证这个顺序是非常关键的,因为衍生类的初始化可能要依赖于对基础类成员的正确初始化。
此时,必要的类已全部装载完毕,所以能够创建对象。首先,这个对象中的所有基本数据类型都会设成它们的默认值,而将对象句柄设为null 。随后会调用基础类构建器。在这种情况下,调用是自动进行的。但也完全可以用super 来自行指定构建器调用。基础类的构建采用
与衍生类构建器完全相同的处理过程。基础顺构建器完成以后,实例变量会按本来的顺序得以初始化。最后,执行构建器剩余的主体部分。
分享到:
相关推荐
Java 静态数据初始化详解 在 Java 中,静态数据初始化是指在类加载过程中对静态变量的初始化。静态变量是在类加载时被初始化的,而不是在实例创建时。静态变量的初始化顺序是按照它们在类中的定义顺序进行的。 在 ...
在Java编程语言中,静态数据初始化是一个重要的概念,它涉及到类级别的变量(也称为静态变量)的设置。静态变量在类加载时初始化,而不是在对象创建时。这使得它们在整个程序运行期间都可供所有对象共享。让我们深入...
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
首先,静态数据成员通常在类声明中被声明,然后在包含类方法实现的源文件中进行初始化。例如: ```cpp class Test { public: static int num; }; int Test::num = 0; ``` 在这个例子中,`Test`类有一个静态成员`...
在编程中,变量是存储数据的容器,而静态变量有别于普通变量,它的特点是生命周期较长且在程序执行期间只被初始化一次。在易语言中,静态变量的使用有以下几个关键点: 1. **声明与初始化**:在易语言中,静态变量...
动态初始化: 手动输入数组的长度,由系统给出默认初始值.(只明确元素的个数,不明确具体的值) ...数组静态初始化: 数据类型[] 数组名=new 数据类型[]{元素1,元素2...} eg: int [] arry=new int[]={11,22,33}
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
在编程中,静态数据成员和静态成员函数是类的一个重要特性,它们与普通的成员变量和成员函数有所不同。静态数据成员属于类,而不是类的每个实例,这意味着所有类的实例共享同一份静态数据成员的副本。这使得静态数据...
这种初始化顺序体现了静态数据初始化的特点——在任何实例方法(包括构造器)执行之前就完成了初始化。 #### 总结 通过上述介绍,我们可以看到静态子句在Java编程中的重要作用。正确理解和运用静态子句可以帮助...
零初始化的变量通常存放在BSS段,而常量初始化的变量则位于数据段,这两个阶段的初始化在程序启动时自动完成。 动态初始化则涉及运行时的动作,比如需要函数调用或类构造函数的初始化。这些变量的初始化在main函数...
类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础...
在本文中,我们将深入探讨如何初始化Bootstrap Table的表格数据,以及与之相关的配置选项和方法。 首先,让我们了解基本的HTML结构。在Bootstrap Table中,表格通常被包含在一个具有`table-responsive`类的`div`...
在易语言中,静态数据成员不能在类的实例化过程中直接初始化,而需要在类的代码段中使用`初始化`过程来设置初始值: ```易语言 .初始化 静态计数 = 0 // 初始化静态计数为0 ``` 访问静态数据成员时,不需要通过类...
Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明、初始化和使用。 一...
在描述中提到的问题,当尝试在头文件(例如`.h`或`.hpp`)中初始化静态数据成员时,如果该头文件被多个源文件(`.cpp`)包含,编译器会为每个包含它的文件分别创建一个静态成员的副本,从而导致“obj重复定义”的...
易语言中,静态数据成员的初始化通常在类的初始化代码块中进行。由于静态数据成员不是每个对象都有独立的副本,所以初始化只执行一次。例如: ```易语言 类 定义 名为 MyClass 静态 整数 变量 名为 staticValue ...
这通常用于初始化静态变量或者执行一些类级别的设置工作,例如设置默认值、计算值或者建立静态数据结构等。 下面是一些关于Java静态初始化块的关键知识点: 1. **执行顺序**:静态初始化块在非静态初始化块之前...
1. **默认初始化**:当类被加载时,静态变量首先会被赋予其数据类型的默认值。例如,`int`类型的静态变量会被初始化为`0`,`boolean`为`false`,引用类型为`null`。 2. **显式初始化**:接着,按照静态变量在源代码...
静态变量的初始化通常在声明时进行,但必须注意的是,它们只能被标量类型(如整型、浮点型、字符串和布尔型)初始化。这意味着你不能直接在声明时将静态变量设置为对象。例如: ```php class A { static public $...