最近无意中翻到Java核心技术·卷一
这本书,发现书中提到一个没有main方法的Hello World
程序,程序如下:
1 2 3 4 5 6 7 8
| public class HelloWorld { static { System.out.println("Hello World!"); System.exit(0); } }
|
其实这段代码关键是在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
| 静态代码块... 普通代码块... 构造函数... 普通方法... -- 普通代码块... 构造函数... 普通方法...
|