论坛首页 入门技术论坛

变量初始化的第三种方式

浏览 1745 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-24  
大家都知道常用的变量初始化方式有如下两种:

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),我们将得到一个最优先执行的代码-在建立新对象之前就执行,而且只被执行一次。这在有些时候是很有用的。相信大家也常看到用到这种静态初始化板快。

谢谢各位!

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics