您的位置:首页 > 编程语言 > Java开发

[JAVA]静态代码块及执行顺序

2013-11-17 02:26 232 查看
据说这个知识点实际开发并不多见,主要做掌握使用。

但因为练习的时候顺带复习了构造函数,所以还是一并写写。

知识点:静态代码块以及类被加载之后内部的执行顺序。

先吐槽一下,我有个不知道算不算毛病的毛病,就是虽然现在这些代码只是练习,但依然不喜欢在里面用注释写太多笔记。

虽然老师讲课的时候会这么做,但我却更倾向于把它们整理到博客里。

先来看代码:

class StaticCode
{
int num= 9;
StaticCode()
{
System.out.println("two");
}

{
System.out.println("three"+num);
}

static
{
System.out.println("one");
}

StaticCode(int y)
{
System.out.println("four");
}
}

class StaticCodeDemo
{

public static void main(String[] args)
{

new StaticCode(7);// one three four

System.out.println("The End");
}

}


试题为:

请给出这段代码执行之后,屏幕上的打印内容。

分析如下:

new StaticCode(7);// one three four

主函数里新建了一个匿名对象,并往里传入了参数7

这个对象通过StaticCode进行了加载。

而静态代码块会随着类的加载而加载,所以第一条执行的语句会是:

static
{
System.out.println("one");
}


屏幕上第一个打印的会是“one”。

随后,类在堆内存中开辟了空间,之后会加载构造代码块。所以第二条执行语句会是:

{
System.out.println("three"+num);
}


再之后,会启动用类名直接调用的,带了一个整数类型参数的构造函数,即第三条执行语句为:

StaticCode(int y)
{
System.out.println("four");
}


最后再打印主函数内的执行语句,打印出 The End
所以屏幕上将显示:

one

three7

four

The End

静态代码块的特点:

1)随着类的加载而加载;

2)只执行一次,类加载完毕后,当类存在于内存中之后,重复使用该类都不会再次进行加载。所以静态代码块只执行一次;

3)作用:用于给类进行初始化,当类中没有建立对象之前,如果有需要该类做的事情,可以使用静态代码块来进行初始化;

4)优先于主函数运行;

5)不需要对象也可以直接运行;

6)静态代码块只能访问静态成员*;

*:以上代码中,如果将

{
System.out.println("three"+num);
}


这里的num写在静态代码块当中,编译时会提示无法访问非静态成员。

因为,num被定义在类当中,没有设置静态属性,所以如果没有建立对象的话,num是不会建立的。

但如果将num定义在构造代码块当中,由于构造代码块用于给所有对象统一初始化,所以这时可以编译通过。

因为构造代码块会优先于构造函数运行。

当一个类加载之后的执行顺序:

1)静态代码块;

2)构造代码块;

3)构造函数;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: