从Java的Hello,World!说到Static Block

一般最常见的HelloWorld是这样的

public class Hello {
public static void main(String[] args) {
System.out.println(
"Hello, World!");
}
}
使用了静态块的HelloWorld
public class Hello {
static {
System.out.println(
"Hello, World!");
}

public static void main(String[] args) {
}
}

上述两个的运行结果都是

Hello, World!

静态块会在main函数运行前被执行, 从下面的例子, 我们可以看出他们的执行顺序

public class Hello {
static {
System.out.println(
"Hello, World from static block!");
}

public static void main(String[] args) {
System.out.println(
"Hello, World from main!");
}
}

执行结果如下:

Hello, World from static block!
Hello, World from main
!

我们可以看到, 是static块在类加载的时候就执行了.

你也可以在static块输出了HelloWorld之后就退出, 不会执行main方法

public class Hello {
static {
System.out.println(
"Hello, World from static block!");
System.exit(
0);
}
public static void main(String[] args) {
System.out.println(
"Hello, World from main!");
}
}

输出结果为

Hello, World from static block!

深入static block

这个static block是在类第一次加载的时候运行, 请看下面的例子, Hello和Hello2两个类, Hello2中引用了Hello的main方法.

public class Hello {
static {
System.out.println(
"Hello, World from static block!");
}
public static void main(String[] args) {
System.out.println(
"Hello, World from main!");
}
}

static和main中分别输出一句话

public class Hello2 {
public static void main(String[] args) {
Hello.main(args);
Hello.main(args);
}
}

我们来运行Hello2的main方法, 输出结果如下

Hello, World from static block!
Hello, World from main
!
Hello, World from main
!

我们可以看到在第一次运行Hello.main的时候, static block运行了, 第二次运行Hello.main的时候, static block没有执行

我们修改一下Hello2

public class Hello2 {
public static void main(String[] args) {
try {
Class.forName(
"Hello");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

加载Hello类, 输出如下

Hello, World from static block!

如果在加载Hello类后, 再运行Hello的main方法了

public class Hello2 {
public static void main(String[] args) {
try {
Class.forName(
"Hello");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
Hello.main(args);
Hello.main(args);
}
}

输出结果如下

Hello, World from static block!
Hello, World from main
!
Hello, World from main
!

这说明, static block是在第一次加载类的时候执行的. 在实际开发中, 这经常用来加载数据库的JDBC驱动.

MySQL的JDBC驱动中有这样一段代码

// Register ourselves with the DriverManager
static {
try {
java.sql.DriverManager.registerDriver(
new Driver());
}
catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

原文地址:https://www.cnblogs.com/icejoywoo/p/2041449.html