从一个没有Main方法的Hello World说起

最近无意中翻到Java核心技术·卷一这本书,发现书中提到一个没有main方法的Hello World程序,程序如下:

1
2
3
4
5
6
7
8
public class HelloWorld
{
static
{
System.out.println("Hello World!");
System.exit(0);//加上这一句是为了避免出现main not defined的错误提示
}
}


其实这段代码关键是在static静态初始化块。当用java HelloWorld调用这个程序的时候,这个类就会被加载,静态初始化块将会打印Hello World

在此之后,会得到一个错误信息:

main not defined(没有定义)

不过可以在静态初始化块的尾部调用System.exit(0),在进入main函数前就退出整个程序以避免这一缺陷。

这段代码涉及到Java不同代码块的初始化过程,下面详细说说静态代码块普通代码块构造函数的启动过程和顺序。

静态代码块


静态代码块只在第一次new对象之前(注意是new前)调用,以后不会调用

普通代码块


普通代码块在每次new对象的时候都会调用

构造函数


构造函数在每次new对象的时候都会调用

启动顺序


静态代码块 -> 普通代码块 -> 构造函数 -> 普通方法

测试程序:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class StaticDemo {
/*
* 静态代码块只在第一次new对象前 (注意是new前) 调用,以后不会调用
*/
static{
System.out.println("静态代码块...");
}
/*
* 普通代码块在每次new对象时候都会调用
*/
{
System.out.println("普通代码块...");
}
/*
* 构造函数在每次new对象时候都会调用
*/
public StaticDemo() {
System.out.println("构造函数...");
}
/*
* 普通方法由对象调用
*/
public void test(){
System.out.println("普通方法...");
}
public static void main(String[] args) {
StaticDemo sdemo1=new StaticDemo();
sdemo1.test();
System.out.println("--");
StaticDemo sdemo2=new StaticDemo();
sdemo2.test();
}
}

输出结果:


1
2
3
4
5
6
7
8
静态代码块...
普通代码块...
构造函数...
普通方法...
--
普通代码块...
构造函数...
普通方法...