java: java代码块附阿里面试题

定义:使用{ }定义的一段代码
根据代码块定义的位置以及关键字,可分为四种:
普通代码块
构造块
静态块
同步代码块(多线程)
1.1 普通代码块:定义在方法中的代码块

public class Test {
    public static void main(String[] args) {
        {
            int x = 10;
            System.out.println("x = "+x);
        }
        int x = 20;
        System.out.println("x = "+x);
    }
}

 一般如果方法中代码较长时,为避免变量重名时使用。(使用较少)
1.2 构造块:定义在类中的代码块(不加修饰符)

class Person{
    {
        System.out.println("Person类的构造块");
    }
    public Person(){
        System.out.println("Person类的构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        new Person();
        new Person();
    }
}

 运行上述代码发现,构造块优于构造方法执行,且每产生一个新对象就会地搜用一次构造块
1.3 静态块
静态代码块:用static修饰的代码块
1.3.1 非主类中的静态块

class Person{
    {
        System.out.println("Person类的代码块");
    }
    public Person(){
        System.out.println("Person类的构造方法");
    }
    static {
        System.out.println("Person类的静态块");
    }
}
public class Test{
    public static void main(String[] args) {
        System.out.println("start-----------");
        new Person();
        new Person();
        System.out.println("end--------------");
    }
}

运行结果如下:
java: java代码块附阿里面试题
 可发现静态块优于构造块执行,且无论实例化多少对象,静态块都只执行一次。
1.3.2 主类中的代码块

public class Test{
    {
        System.out.println("Test的代码块");
    }
    public Test(){
        System.out.println("Test的构造方法");
    }
    static {
        System.out.println("Test的静态块");
    }
    public static void main(String[] args) {
        System.out.println("start-----------");
        new Test();
        new Test();
        System.out.println("end--------------");
    }
}
 运行结果如下

java: java代码块附阿里面试题
 主类中的静态块优于主方法执行。
 看一道题:

public class Test {
    //构造方法
    public Test() {
        System.out.println("Test父类构造方法");
    }

    //非静态代码块
    {
        System.out.println("父类非静态代码块");
    }

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

class B extends Test{
    public B(){
        System.out.println("子类构造方法");
    }
    {
        System.out.println("子类非静态代码块");
    }
    static{
        System.out.println("子类静态代码块");
    }

    public static void main(String[] args) {
        System.out.println("start-----");
        new B();
        new B();
    }
    }

 可看一下该代码的运行结果。
java: java代码块附阿里面试题