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); } }