静态代码块、构造代码块、构造函数、普通代码块作用和调用顺序

静态代码块

1、格式

public class Book{
  static{
      System.out.println("我是静态代码块")
  }
}

2、执行时间

静态代码块在类被加载的时候运行,且只执行一次,优先于任何代码块及构造函数。多个静态代码块之间按照书写顺序执行

3、作用

有些代码需要在项目启动的时候就执行,就会用到静态代码块,比如加载配置文件,我们就可以放入静态代码块。

4、注意

  • 静态代码块不能存在于任何方法体中
  • 静态代码块不能访问普通变量
  • 普通方法和静态方法的区别

构造代码块

1、格式

两者的区别在于少了static关键字

public class Book{
  static{
      System.out.println("我是静态代码块");
  }
  {
      System.out.println("我是构造代码块");
  }
}

2、执行时间

构造代码块在创建对象时调用,每次创建都会调用一次,在构造函数之前执行,它依托于构造函数,如果不实例化对象,构造代码块也不执行

public class Book{
  {
    System.out.println("我是构造代码块");
  }
  public Book(){
    System.out.println("无参构造函数");
  }
  public Book(String name){
    System.out.println("有参构造函数");
  }
}

反编译之后的class文件:


3、作用

可以用于对象的初始化,且只要创建一个对象,构造代码块都会执行一次。
利用每次创建对象都会调用一次构造代码块的特性,我们可以统计创建对象的次数

构造函数

1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;

2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;

普通代码块

普通代码块和构造代码块的区别在于,构造代码块在类中定义,而普通代码块在方法体中定义。按书写顺序执行

public void read(){
  {
    System.out.println("我是普通代码块");
  }
}

执行顺序

静态代码块>构造代码块>构造函数>普通代码块

public class Book{
    static{
      System.out.println("我是静态代码块");
    }
    {
      System.out.println("我是构造代码块");
    }
    public Book(){
       System.out.println("我是无参构造函数");
    }
    public read(){
        {
            System.out.println("我是普通代码块");
        }
    }
    public static void main(String[] args){
        System.out.println("执行了main方法");
        new Book().read();
        System.out.println("------------------");
        new Book().read();
    }

}

反编译之后的class文件


执行结果:


父类和子类的执行顺序

  • 执行父类的静态代码块
  • 执行子类的静态代码块
  • 执行父类的构造代码块
  • 执行父类的构造方法
  • 执行子类的构造代码块
  • 执行子类的构造方法
    父类:SuperClass
public class SuperClass{
    static{
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类构造代码块");
    }
    public SuperClass(){
        System.out.println("父类构造函数");
    }
}

子类:SubClass

public class SubClass extends SuperClass{
    static{
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类构造代码块");
    }
    public SubClass(){
        System.out.println("子类构造函数");
    }
}

测试:

public static void main(String[] args){
    SubClass sb = new SubClass();
    System.out.println("----------------");
     SubClass sb1 = new SubClass();
}

打印结果:
父类静态代码块
子类静态代码块
父类构造代码块
父类构造函数
子类构造代码块
子类构造函数


父类构造代码块
父类构造函数
子类构造代码块
子类构造函数

参考原文:http://www.cnblogs.com/ysocean/p/8194428.html

你可能感兴趣的:(静态代码块、构造代码块、构造函数、普通代码块作用和调用顺序)