静态代码块、非静态代码块、构造函数的输出顺序

情况一:没有继承父类时

复制代码
 1 class HelloA {
 2     
 3     public HelloA() {
 4         System.out.println("I'm A class");
 5     }
 6 
 7     static {
 8         System.out.println("static A");
 9     }
10     
11     {
12         System.out.println("A");
13     }
14 
15     public static void main(String[] args) {
16         new HelloA();
17         new HelloA();
18     }
19 }
复制代码

输出结果:

  static A
  A
  I'm A class
  A
  I'm A class

分析:输出顺序为: 静态代码块>非静态代码块>构造器,同时无论New多少次class静态代码块只执行一次,所以一般情况把耗内存重量级的连接或者其他放在静态代码块中,访问速度快,并且只访问一次,节约消耗。

 

情况二:继承某个父类时

复制代码
class HelloA extends HelloB{
    
    public HelloA() {
        System.out.println("I'm A class");
    }

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

    public static void main(String[] args) {
        new HelloA();
    }
}

class HelloB {
    public HelloB() {
        System.out.println("I'm B class");
    }

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

    {
        System.out.println("B");
    }
}
复制代码

运行结果:

  static B
  static A
  B
  I'm B class
  A
  I'm A class

分析:输出顺序:父类静态代码块>子类静态代码块>父类非静态代码块>父类构造器>子类非静态代码块>子类构造器;

 

另外:静态代码块和静态变量  按书写顺序执行;

posted @ 2018-12-06 22:26  菜鸡de家  阅读(279)  评论(0编辑  收藏  举报