大家都知道常用的变量初始化方式有如下两种:
1. 在宣告变量时初始化
2. 在构造函数里初始化
举例如下:
public class VarTest {
private int a=1; // 在宣告变量时初始化
private int b;
public VarTest(){
b=1; //在构造函数里初始化
}
}
但有一种很少用的变量初始化方式,这就是初始化板块(initialization block)举例如下:
package com.torontohydro.test.lang;
public class BlockInitVarTest {
private int a=1;
private int b;
private int c;
public BlockInitVarTest(){
b=1;
System.out.println("b="+b);
}
//初始化板块
{
c=1;
System.out.println("a="+a);
System.out.println("c="+c);
}
public static void main(String[] args){
new BlockInitVarTest();
new BlockInitVarTest();//再来一次,好吗
}
}
输出结果如下:
a=1
c=1
b=1
a=1
c=1
b=1
从这个结果可以看出变量初始化的顺序,宣告变量赋值最优先,然后是初始化板块,最后才是构造函数。这个结果还说明初始化板块在每次建立新的对象是都会被执行。
各位看官也许要问了,这个初始化板块怎么看着象脱裤子放屁啊?它能做的放在构建函数不是一样做吗?问得有理。确实没什么作用。不过且慢,让我们再看一下这个例子的变种:
public class BlockInitVarTest {
private int a=1;
private int b;
public static int c;
public BlockInitVarTest(){
b=1;
System.out.println("b="+b);
}
//初始化板块
{
System.out.println("a="+a);
}
//静态初始化板块
static
{
c=1;
System.out.println("c="+c);
}
public static void main(String[] args){
System.out.println("in main: c="+BlockInitVarTest.c);
new BlockInitVarTest();
new BlockInitVarTest();
}
}
输出结果如下:
c=1
in main: c=1
a=1
b=1
a=1
b=1
通过将初始化板块静态化(static),我们将得到一个最优先执行的代码-在建立新对象之前就执行,而且只被执行一次。这在有些时候是很有用的。相信大家也常看到用到这种静态初始化板快。
谢谢各位!
分享到:
相关推荐
3. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员变量的初始化;同理,对于非静态成员变量也是如此。 掌握这些原则可以帮助开发者更准确地控制类的初始化...
3. C初始化代码:在汇编语言初始化之后,C语言代码接手进一步的初始化任务,包括堆栈设置、全局变量初始化等。 4. Board-specific初始化:针对特定硬件板卡的初始化,如板级外设的初始化。 5. System Initialization...
6. **常量数组**的问题在于,由于第3和第5条的约束,C++不支持在类中定义常量大小的数组并进行初始化。 关于`const`的用法,我们可以区分两种情况: - `const`在星号左侧,如`const int *ptr`,表示`ptr`指向的内容...
需要注意的是,第2、3、6种方式创建的List都是不可变的,一旦初始化,就不能修改其内容。如果需要可变的List,通常需要通过构造函数或者包装已有的不可变List来实现。 总的来说,这些初始化List的方法各有优缺点,...
Es8P 定义非初始化变量办法 在单片机初始化中,Es8P5086 定义非初始化变量办法是非常重要的。它可以在系统复位后保持住复位前的 RAM 中的数据,以快速恢复现场,不会因为瞬间复位而重启现场设备。Keil MDK 在默认...
2. **变量初始化**:在创建变量时,可以设置初始值,这样每次程序运行时,变量都会自动被赋予这个值。 3. **块的“初始化”属性**:对于DB块,可以设置“初始化”属性,使得在第一次运行或重启时,DB块中的所有变量...
调试DLL也是一项关键技能,可以使用易语言的内置调试工具或第三方调试器进行。 8. **性能优化**:初始化函数应尽可能高效,因为它的执行可能影响到整个应用程序的启动时间。优化初始化代码可以减少不必要的资源消耗...
- **初始化头变量hdr**: hdr包含了一些重要的系统初始化参数。 - **准备实模式下C语言环境**: 实现C语言环境的基本设置,如栈和堆的初始化。 - **实模式代码main函数**: - **复制初始化头变量**: 将初始化信息...
4. **第三方库集成**:许多Android应用会集成各种第三方库,如推送服务、广告SDK、统计分析工具等。这些库的初始化可能会有特定的顺序和条件,工具能帮助统一管理和协调。 5. **服务注册**:应用可能需要注册一些...
在WinForm应用中,初始化过程通常是程序启动时执行的第一部分代码,它负责设置窗口、控件以及应用的其他关键组件。以下是一些关于WinForm初始化器源码的关键知识点: 1. **主窗体的构造函数**:这是WinForm应用的...
首先,我们来看第一种情况:类内的变量初始化。当声明一个类的成员变量(即实例变量)时,即使你没有显式地为它们赋值,Java编译器会自动为这些变量提供一个默认值。这些默认值是根据变量的数据类型来设定的: 1. ...
下面将详细介绍单链表的结构,以及两种在C++中初始化单链表的方法。 一、单链表的基本结构 1. 节点定义:在C++中,我们首先需要定义一个节点结构体,包含数据域和指针域。例如: ```cpp struct ListNode { int ...
本篇文章将详细讲解Java中数组的三种初始化方法:静态初始化、动态初始化和默认初始化。 一、静态初始化 静态初始化是指在声明数组的同时为其分配空间并赋予初始值。这种方式允许我们在定义数组时就明确给出每个...
在C++编程中,初始化结构体是一个常见的任务,它确保结构体的所有成员变量都被赋予了合适的初始值。这里我们探讨两种不同的初始化结构体的方法,并分析它们的优缺点。 首先,让我们看看传统的方法,也就是在结构体...
3. 当创建对象时,JVM会调用`<init>`方法来初始化实例变量和实例初始化块。 4. 构造函数(如果有的话)在`<init>`方法中调用,用于完成特定对象的初始化。 JVM的初始化过程是高度内化的,程序员通常不需要直接操作...
`rc.sysinit`是Linux系统初始化的核心脚本,通常位于/etc目录下,它是系统引导过程中的第一步。这个脚本主要负责进行一些系统级别的设置和初始化工作,例如: 1. **硬件检测**:对系统硬件进行检测,包括磁盘、内存...
第四初始化,通常指的是在对象创建过程中的第四种初始化方式,而清除则涉及到对象使用完毕后的资源释放。以下是对这两个概念的详细阐述。 首先,让我们探讨C++中的初始化。初始化在C++中是一个至关重要的步骤,因为...
3. **安装MySQL服务**: 以管理员身份打开命令提示符,输入`mysqld --install`,这将安装MySQL服务。如果成功,您应该能在Windows服务中看到MySQL服务。 4. **初始化数据目录和设置随机密码**: 输入`mysqld --...
2. 静态初始化块:当类第一次被加载时执行,按块的顺序执行。 3. 实例字段:在构造器内部,按照声明的顺序初始化。 4. 实例初始化块:在构造器执行之前,按块的顺序执行。 例如: ```java public class MyClass { ...
2. **实例变量和初始化块**:当创建子类对象时,先执行父类的实例变量初始化和初始化块,接着执行子类的实例变量初始化和初始化块。这是因为在创建子类对象时,首先会创建父类的部分,然后再创建子类的部分。 3. **...