若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
由于static 值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些:
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(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 对象不会重新初始化。
相关推荐
Java 静态数据初始化详解 在 Java 中,静态数据初始化是指在类加载过程中对静态变量的初始化。静态变量是在类加载时被初始化的,而不是在实例创建时。静态变量的初始化顺序是按照它们在类中的定义顺序进行的。 在 ...
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明、初始化和使用。 一...
这通常用于初始化静态变量或者执行一些类级别的设置工作,例如设置默认值、计算值或者建立静态数据结构等。 下面是一些关于Java静态初始化块的关键知识点: 1. **执行顺序**:静态初始化块在非静态初始化块之前...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
1. **默认初始化**:当类被加载时,静态变量首先会被赋予其数据类型的默认值。例如,`int`类型的静态变量会被初始化为`0`,`boolean`为`false`,引用类型为`null`。 2. **显式初始化**:接着,按照静态变量在源代码...
在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...
静态初始化块常用于初始化静态数据结构或一次性设置全局配置。 以上四种方法在不同的场景下各有优劣。直接赋值简单快速,但缺乏灵活性;构造器初始化可以根据对象实例化时的状态来设置初始值;初始化块适合于更...
在Java编程语言中,静态数据初始化是一个重要的概念,它涉及到类级别的变量(也称为静态变量)的设置。静态变量在类加载时初始化,而不是在对象创建时。这使得它们在整个程序运行期间都可供所有对象共享。让我们深入...
Java 变量初始化详解 Java 变量初始化是 Java 语言的基础知识点之一,但也往往被学习者所忽略。 Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 ...
多个类加载的时候,不是依次初始化好每个类的静态数据,再初始化每个类的实例成员,而是初始化好第一个类的静态数据,实例变量,再初始化下一个类的静态数据,实例变量。 static 关键字不能应用于局部变量,因此它...
Java数组的初始化有三种方式:动态初始化、静态初始化和默认初始化。 动态初始化 动态初始化是指数组定义与为数组分配空间和赋值的操作分开进行。例如,`int a[]; a = new int[3];`创建了一个名为`a`的整型数组,...
在上面的代码中,我们首先导入了 ECharts 库和插件,然后使用 `echarts.init` 方法来初始化 ECharts 实例。接下来,我们使用 `setOption` 方法来指定图表的配置项和数据。在 `setOption` 方法中,我们指定了图表的...
静态成员包括静态变量、静态方法和静态初始化块。 1、静态变量 静态变量是指属于类的变量,它们的值是共享的,所有实例都可以访问到同一个静态变量。在上面的代码中,`static int z;`就是一个静态变量。静态变量是...
本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解每种方法的使用和特点。 1. 常规方式 这是最常见的初始化List的方式,通过创建ArrayList实例并逐个添加元素。自JDK 7以后,可以省略泛型类型的...
### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`的角色。简单地说,`Classloader`的主要职责是将编译后的`.class`文件...
动态初始化: 手动输入数组的长度,由系统给出默认初始值.(只明确元素的个数,不明确具体的值) ...数组静态初始化: 数据类型[] 数组名=new 数据类型[]{元素1,元素2...} eg: int [] arry=new int[]={11,22,33}
这个顺序可能会导致一些有趣的现象,例如,在父类的构造器中使用某个还未初始化的子类静态成员变量(如果子类静态成员变量的初始化依赖于父类的某些数据或者执行顺序),就可能产生意料之外的行为,因为按照初始化...