黑马程序员技术交流社区
标题:
静态代码块的执行问题
[打印本页]
作者:
adamjy
时间:
2014-4-22 00:29
标题:
静态代码块的执行问题
本帖最后由 adamjy 于 2014-4-22 12:36 编辑
代码如下,为什么Test01类中的静态代码块没有执行?
public class Demo{
public static void main(String[] args){
System.out.println(Test01.serialVersion);
}
}
class Test01
{
public static final long serialVersion=1L;
static
{
//此代码没有打印
System.out.println("Static code block invoked.");
}
}
复制代码
作者:
a3330682
时间:
2014-4-22 00:35
要new对象它才会执行吧!
作者:
jsjchenlong
时间:
2014-4-22 00:53
静态代码块作用:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。
特别要注意:静态代码块随着类的加载而执行,而且只执行一次
看我下面的代码:
public class Test3 {
public static void main(String[] args) {
System.out.println(Test01.serialVersion);
Test01 t1 = new Test01();
Test01 t2 = new Test01();
}
}
class Test01
{
public static final long serialVersion=1L;
static
{
//此代码没有打印:是因为你没有new看主函数中的代码
System.out.println("Static code block invoked.");
}
}
作者:
四川男人
时间:
2014-4-22 01:03
静态代码块儿优先于构造函数执行,在类加载的时候就加载了。
你的代码中,没有声明并加载类,需要Test01 t = new Test01(); 就可以显示了
作者:
创造命运
时间:
2014-4-22 08:36
四川男人 发表于 2014-4-22 01:03
静态代码块儿优先于构造函数执行,在类加载的时候就加载了。
你的代码中,没有声明并加载类,需要Test01 t ...
没有Test01 t = new Test01();该语句,就表示Test类没有加载吗?
如果是这样,那么在new之前的语句 System.out.println(Test01.serialVersion);执行了,且输出结果1。在执行该语句时,Test01类同样还没有加载吧,那么是如何访问到serialVersion这个静态变量的呢?
既然在main方法里能够访问到Test01类里面的serialVersion这个静态变量,那么应该说明该类已经加载过了。可是静态语句块static{System.out.println(Static code block invoked.);}又没有执行,这究竟是怎么一回事呢?
请详细解答。感谢!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2