Java中的静态块

时间:2020-01-09 10:34:50  来源:igfitidea点击:

Java中的静态块用于初始化静态变量(也称为类变量)。要初始化实例变量,可以使用构造函数,其中可以使用错误处理或者其他逻辑。为了为类变量提供相同的功能,Java中有静态初始化块。

Java静态块的语法

静态初始化块是用大括号{}括起来的常规代码块,并在前面加上static关键字。

static {
    // code for initialization goes here
}

关于Java中的静态块的要点

  • 首次加载类时,Java静态块仅执行一次。
  • 在开始执行main方法之前,将执行静态块。
  • 非静态变量不能在Java静态块中使用。
  • 一个类可以具有任意数量的静态初始化块,并且它们可以出现在类主体中的任何位置。
  • 运行时系统保证静态初始化块按它们在源代码中出现的顺序执行。

Java静态块示例

public class StaticBlock {
	static final int a;
	static int b;
	int c;
	//static blocks
	static {
		System.out.println("in static block-1");
		a = 5;
	}	
	static {
		System.out.println("in static block-2");
		b = a * 5;
		// error non-static variable
		//c = 7;
	}
	//Constructor
	StaticBlock(){
		System.out.println("Calling constructor of the class");
	}
	public static void main(String[] args) {
		System.out.println("Executing main method ");
		StaticBlock sb = new StaticBlock();
		System.out.println("Value of a " + a);
		System.out.println("Value of b " + b);
	}
}

输出:

in static block-1
in static block-2
Executing main method 
Calling constructor of the class
Value of a 5
Value of b 25

这里要注意的几点是

1在代码中有2个静态块,均按顺序执行。
2从输出中可以看到,静态块在main方法之前执行,因此在构造函数之前执行。
3尝试访问静态块中的非静态变量会导致编译时错误。

Java静态块中的异常处理

1我们不能将throws子句与静态块一起使用,因此以下语句将导致编译时错误。

static throws Exception{

}

2尝试从静态块中抛出已检查的异常也是不可能的。我们可以在静态块中有一个try-catch块,在其中可能会从try块中抛出已检查的异常,但是我们必须使用in catch块来解决它。我们不能使用throw关键字进一步传播它。

static {
  try{
    System.out.println("in static block-1");
    new BufferedReader(new java.io.FileReader("D:\test.txt"));
    //a = 5;
  }catch(IOException exp){
    try {
      throw exp; //error
    } catch (IOException e) {
      throw e;
    }
  }
}

如我们所见,每次尝试抛出一个已检查的异常时,我们都会得到一个错误,提示我们将其包装在try-catch块中。
3我们可以从静态块中引发未经检查的异常。如果是受检查的异常,我们也可以将其包装在未经检查的异常中,并按以下代码所示将其抛出:

static {
  try{
    System.out.println("in static block-1");
    new BufferedReader(new java.io.FileReader("F:\test.txt"));
    //a = 5;
  }catch(IOException exp){
    throw new RuntimeException(exp);
  }
}