`
daoshang
  • 浏览: 11669 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

变量初始化的第三种方式

阅读更多
大家都知道常用的变量初始化方式有如下两种:

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. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员变量的初始化;同理,对于非静态成员变量也是如此。 掌握这些原则可以帮助开发者更准确地控制类的初始化...

    ARM初始化文件详解

    3. C初始化代码:在汇编语言初始化之后,C语言代码接手进一步的初始化任务,包括堆栈设置、全局变量初始化等。 4. Board-specific初始化:针对特定硬件板卡的初始化,如板级外设的初始化。 5. System Initialization...

    C++类成员和数据成员初始化总结

    6. **常量数组**的问题在于,由于第3和第5条的约束,C++不支持在类中定义常量大小的数组并进行初始化。 关于`const`的用法,我们可以区分两种情况: - `const`在星号左侧,如`const int *ptr`,表示`ptr`指向的内容...

    6种方法初始化JAVA中的list集合

    需要注意的是,第2、3、6种方式创建的List都是不可变的,一旦初始化,就不能修改其内容。如果需要可变的List,通常需要通过构造函数或者包装已有的不可变List来实现。 总的来说,这些初始化List的方法各有优缺点,...

    es8p定义非初始化变量办法.docx

    Es8P 定义非初始化变量办法 在单片机初始化中,Es8P5086 定义非初始化变量办法是非常重要的。它可以在系统复位后保持住复位前的 RAM 中的数据,以快速恢复现场,不会因为瞬间复位而重启现场设备。Keil MDK 在默认...

    TIA博途_数据的保持型与初始化的具体方法和相关问题汇总.rar

    2. **变量初始化**:在创建变量时,可以设置初始值,这样每次程序运行时,变量都会自动被赋予这个值。 3. **块的“初始化”属性**:对于DB块,可以设置“初始化”属性,使得在第一次运行或重启时,DB块中的所有变量...

    易语言DLL初始化

    调试DLL也是一项关键技能,可以使用易语言的内置调试工具或第三方调试器进行。 8. **性能优化**:初始化函数应尽可能高效,因为它的执行可能影响到整个应用程序的启动时间。优化初始化代码可以减少不必要的资源消耗...

    疯狂内核之——内核初始化

    - **初始化头变量hdr**: hdr包含了一些重要的系统初始化参数。 - **准备实模式下C语言环境**: 实现C语言环境的基本设置,如栈和堆的初始化。 - **实模式代码main函数**: - **复制初始化头变量**: 将初始化信息...

    Android-Android应用初始化工具

    4. **第三方库集成**:许多Android应用会集成各种第三方库,如推送服务、广告SDK、统计分析工具等。这些库的初始化可能会有特定的顺序和条件,工具能帮助统一管理和协调。 5. **服务注册**:应用可能需要注册一些...

    winform 初始化器源码

    在WinForm应用中,初始化过程通常是程序启动时执行的第一部分代码,它负责设置窗口、控件以及应用的其他关键组件。以下是一些关于WinForm初始化器源码的关键知识点: 1. **主窗体的构造函数**:这是WinForm应用的...

    Java 成员初始化要注意的两种不同的情况

    首先,我们来看第一种情况:类内的变量初始化。当声明一个类的成员变量(即实例变量)时,即使你没有显式地为它们赋值,Java编译器会自动为这些变量提供一个默认值。这些默认值是根据变量的数据类型来设定的: 1. ...

    数据结构单链表初始化c/c++语言代码实现

    下面将详细介绍单链表的结构,以及两种在C++中初始化单链表的方法。 一、单链表的基本结构 1. 节点定义:在C++中,我们首先需要定义一个节点结构体,包含数据域和指针域。例如: ```cpp struct ListNode { int ...

    大数据必学Java基础(二十五):数组的三种初始化方式

    本篇文章将详细讲解Java中数组的三种初始化方法:静态初始化、动态初始化和默认初始化。 一、静态初始化 静态初始化是指在声明数组的同时为其分配空间并赋予初始值。这种方式允许我们在定义数组时就明确给出每个...

    c++里初始化结构体的一个比较的简单方法

    在C++编程中,初始化结构体是一个常见的任务,它确保结构体的所有成员变量都被赋予了合适的初始值。这里我们探讨两种不同的初始化结构体的方法,并分析它们的优缺点。 首先,让我们看看传统的方法,也就是在结构体...

    深入Java初始化.pdf

    3. 当创建对象时,JVM会调用`<init>`方法来初始化实例变量和实例初始化块。 4. 构造函数(如果有的话)在`<init>`方法中调用,用于完成特定对象的初始化。 JVM的初始化过程是高度内化的,程序员通常不需要直接操作...

    Linux系统初始化相关脚本分析

    `rc.sysinit`是Linux系统初始化的核心脚本,通常位于/etc目录下,它是系统引导过程中的第一步。这个脚本主要负责进行一些系统级别的设置和初始化工作,例如: 1. **硬件检测**:对系统硬件进行检测,包括磁盘、内存...

    c++之第四初始化与清除

    第四初始化,通常指的是在对象创建过程中的第四种初始化方式,而清除则涉及到对象使用完毕后的资源释放。以下是对这两个概念的详细阐述。 首先,让我们探讨C++中的初始化。初始化在C++中是一个至关重要的步骤,因为...

    mysql第一次安装成功后初始化密码操作步骤

    3. **安装MySQL服务**: 以管理员身份打开命令提示符,输入`mysqld --install`,这将安装MySQL服务。如果成功,您应该能在Windows服务中看到MySQL服务。 4. **初始化数据目录和设置随机密码**: 输入`mysqld --...

    C++和Java初始化顺序的比较代码

    2. 静态初始化块:当类第一次被加载时执行,按块的顺序执行。 3. 实例字段:在构造器内部,按照声明的顺序初始化。 4. 实例初始化块:在构造器执行之前,按块的顺序执行。 例如: ```java public class MyClass { ...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    2. **实例变量和初始化块**:当创建子类对象时,先执行父类的实例变量初始化和初始化块,接着执行子类的实例变量初始化和初始化块。这是因为在创建子类对象时,首先会创建父类的部分,然后再创建子类的部分。 3. **...

Global site tag (gtag.js) - Google Analytics