美文网首页
java之静态代码块与构造方法加载次序

java之静态代码块与构造方法加载次序

作者: 安徒生 | 来源:发表于2018-07-28 16:39 被阅读7次
  • java中的静态代码块,非静态块,构造办法的加载顺序是这样的:
    静态代码块 (程序加载时一次)--->非静态块(每次实例化一次)---> 构造方法(每次实例化一次),废话不多说,上代码。
A类:
public class A {

    static {
        System.out.print("1");
    }
     {
        System.out.print("#");
    }

    public A(){
        System.out.print("a");
    }


}
B类:
/**
 * @Author: Cyy
 * @Description:
 * @Date:Created in 16:08 2018/7/28
 */
public class B extends A {

    static {
        System.out.print("2");
    }
     {
        System.out.print("*");
    }

    public B(){
        System.out.print("b");
    }
    {
        System.out.print("c");
    }

    public static void main(String[] args) {
//        A a=new A();//结果12a,执行一次2个静态区代码,执行非静态代码块,再执行A的构造办法
//        B b=new B();//结果12ab,执行一次2个静态区代码,执行非静态代码块,再依次执行A和B的构造办法
        A ab=new B();//同上

        ab=new B();//此时静态代码块已经加载,只加载一次,执行非静态代码块,是每次实例化都一次,跟构造方法一样,比构造办法先,输出非静态代码和构造办法的部分

    }
}

我们尝试运行,看看结果:


image.png

结果是12#a*b#a*b,来分析下整个流程:

  • 第一步按顺序加载2个类的静态代码块,程序载入时,只会执行一次,输出12;
  • 第二步按顺序分别加载A类和B类的非静态代码块以及构造方法,输出#a*b;
  • 第三步,再次实例化B类的时候,不在静态代码块了,只会加载非静态代码块和构造方法,再次输出结果#a*b;

相关文章

网友评论

      本文标题:java之静态代码块与构造方法加载次序

      本文链接:https://www.haomeiwen.com/subject/wdiomftx.html