Java中静态代码块、构造代码块、构造函数

497

对于该问题的关注,来自一道笔试题:


public class HelloB extends HelloA
{
    //构造函数B
    public HelloB() {
        System.out.println("+++++++");
    }

    //构造代码块B
    {
        System.out.println("I’m B class");
    }

    //静态代码块B
    static
    {
        System.out.println("static B");
    }

    public static void main(String[] args)
    {
        new HelloB();
    }
}
class HelloA
{
    //构造函数A
    public HelloA() { }

    //构造代码块A
    {
        System.out.println("I’m A class");
    }

    //静态代码块A
    static
    {
        System.out.println("static A");
    }
}

执行结果

static A
static B
I’m A class
I’m B class
+++++++

反编译代码

class HelloA {
    public HelloA() {
        System.out.println("I’m A class");
    }

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

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("I’m B class");
        System.out.println("+++++++");
    }

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

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

静态代码块

1、作用

“静态”的代码、不管是类还是方法、变量,最大的特点就是在类加载时就被初始化。所以,静态代码块用来执行一些在项目启动时就需要执行的代码。例如,加载配置文件等资源。

2、执行时机

  1. 类加载时就执行,且仅执行一次,先于一切函数,这很好理解,因为是静态代码。需要注意的是,构造函数也是“普通函数”,所以静态代码块也是先于构造函数执行的。
  2. 静态块之间按顺序执行
public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

输出

构造块 构造块 静态块 构造块

也是由于静态的原因:

3、静态代码块不能存在于方法体中

4、静态代码块不能访问非静态变量

构造代码块

1、作用

构造代码块在编译后会合并到该类的所有构造函数中,且在构造函数代码之前,也就是说在初始化该类的新对象时,不论使用的是哪个构造函数,都会执行构造代码块中的代码。

2、执行时机

对象初始化时执行

构造函数

  1. 构造函数的命名必须和类名完全相同且没有返回值。在java中普通函数也可以和构造函数同名,但是必须带有返回值;
  2. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用
  3. Java编译器会提供一个默认的不带参构造函数,当自定义构造函数之后就不再提供。