Java中的静态块\\初始化块及main方法
2011-12-29谭娟
考试周刊 2011年4期
摘 要: Java是纯面向对象的程序设计语言,通常我们在类中定义成员变量和方法,但是在类中除了成员变量和方法外,还有静态块和初始化块。本文主要介绍Java程序中静态块、初始化块及main方法的运行顺序。
关键词: Java程序 静态块 初始化块 main函数
我们在编写Java程序时都知道,Java是由类组成的,类又由成员变量和成员方法组成,Java程序的运行由main方法所在的类开始执行;但是,在Java中除了函数、main函数之外,还包括静态块和初始化块,下面对它们分别进行介绍。
如下面的程序:
public class exam {
static{
System.out.println("static!");
}
public static void main(String[ ] args) {
System.out.println("main function!");
}
}
以上程序包括静态块和main函数,它们的执行顺序是:先执行静态块,然后执行main方法。
结果如下:
static!
main function!
再看下面的程序:
public class exam {
static{
System.out.println("test");
}
{
System.out.println("exam");
}
public static void main(String args[ ]){
new Child();
}
}
class Father{
static{
System.out.println("Father static!");
}
{
System.out.println("Father block!");
}
Father()
{
System.out.println("Father Constructor!");
}
}
class Child extends Father{
static{
System.out.println("Child static!");
}
{
System.out.println("Child block!");
}
Child(){
System.out.println("Child Constructor!");
}
}
以上程序的执行结果是:Static静态块—父类的静态块—子类的静态块—父类的初始化块—父类的构造函数—子类的初始化块—子类的构造函数。
结果如下:
test
Father static!
Child static!
Father block!
Father Constructor!
Child block!
Child Constructor!
通过对以上程序的分析,我们可以发现在整个程序的执行过程中,除了函数之外还有一些静态块和初始化块,以及它们的执行顺序。Static静态块的特点是在类加载的时候就执行,而且只执行一次。
再看如下程序的执行结果,以下程序在上面程序的基础上进行了修改。
public class exam {
static{
System.out.println("test");
//System.exit(0);
}
{
System.out.println("exam");
}
public static void main(String args[ ]){
new Child( );
new exam( );
new Child( );
}
}
class Father{
static{
System.out.println("Father static!");
}
{
System.out.println("Father block!");
}
Father( )
{
System.out.println("Father Constructor!");
}
}
class Child extends Father{
static{
System.out.println("Child static!");
}
{
System.out.println("Child block!");
}
Child(){
System.out.println("Child Constructor!");
}
}
结果如下:
test
Father static!
Child static!
Father block!
Father Constructor!
Child block!
Child Constructor!
exam
Father block!
Father Constructor!
Child block!
Child Constructor!
由以上程序的执行结果可知,当再次创建某一个类的实例的时候,不会再执行类中的静态块,但是初始化块还是会执行。