java类运行以及static块的执行顺序

一、java类的static块什么时候执行
如果了解JVM原理,我们可以知道,一个类的运行分为以下步骤:
1、装载;2、链接;3、初始化;4、初始化;5,实例化(创建新的实例)
实际上,static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作。
下面我们看看执行static块的几种情况:
1、第一次new A()的过程会打印"";因为这个过程包括了初始化
2、第一次Class.forName("A")的过程会打印"";因为这个过程相当于Class.forName("A",true,this.getClass().getClassLoader());
3、第一次Class.forName("A",false,this.getClass().getClassLoader())的过程则不会打印""。因为false指明了装载类的过程中,不进行初始化。不初始化则不会执行static块。
二、java类中static的执行顺序
方法被定义为static就表示这个方法不需要声明类的实例即可执行;比如main方法。而某个类成员被定义为static的时候,它就几乎完全独立于这个类了。 
根据think   in   java2   还有java参考大全中所述,static方法在类刚刚被加载的时候就执行了。 
因此,可以说,static方法是在对程序进行解释的时候执行。 
比如 
class   UseStatic{ 
        static   int   a   =   3; 
        static   int   b; 


        static   void   meth(int   x) 
        { 
                System.out.println( "x   =   "   +   x); 
                System.out.println( "a   =   "   +   a); 
                System.out.println( "b   =   "   +   b); 
                
        } 
static {
    System.out.println("b = "+b);
    }
        static   { 
                System.out.println( "Static   block   initialized. "); 
                b   =   a*4; 
        } 
        public   static   void   main(String[]   args) 
        { 
                meth(42); 
        } 

一旦UseStatic被装载,所有的static语句被执行。首先,a被设置为3,接着System.out.println("b = "+b);打印出 b=0;注意,可以有多个static代码块,按照顺序执行,同时b被默认初始化为0,接着static块执行(打印一条消息),最后,b初始化为a*4或12。然后调用main(),main()调用meth(),把42传递给x。3 个println()语句引用两个static变量a和b,以及局部变量x。

三、extends 和 static 的执行顺序研究

public class A {
public static final String CONSTANT = "1";
static{
System.out.println("a");
}
public A(){
System.out.println("b");
}
}

public class B extends A{
static{
System.out.println("c");
}
public B(){
System.out.println("d");
}
}


public class Test {

public static void main(String[] args){
System.out.println(A.CONSTANT);
A ab = new B();
ab = new B();
}
}
但是注意执行下边的代码就不会执行static块
System.out.println(A.CONSTANT);
因为这个是类的静态常量,在调用类的静态常量的时候不会导致类被加载(这个是我根据结果推断出来的,网上查了查也没有相关的解释,也许是jvm的规定吧)
1
a
c
b
d
b
d
在ab = new B(); 一句的时候会打印
b
d
这说明在实例化子类的时候,父类同时也会实例化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值