普通代码块、构造块和静态代码块

普通代码块:

定义在方法中的代码块。

public class Test {
    public static void main(String[] args) {
        {
            // 普通代码块
            int x = 10;
            System.out.println(x);
        }
        int x = 20;
        System.out.println(x);
    }
}

结论:普通代码块主要是用来解决变量重命名问题,并且代码块一定要写在方法变量名前面!

构造块:

定义在类中的代码块,而且代码块前面不加任何修饰符。

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

结论:构造块优先于主方法执行,并且由多少个对象产生就调用多少次构造块!

静态代码块:

定义在类中的代码块,并且前面有static修饰符。

根据静态块所在的类的不同又可分为以下两种类型:

1. 非主类中的构造块

class Person {
    {
        // Person类的构造块
        System.out.println("1.Person类的构造块");
    }
    public Person() {
        System.out.println("2.Person类的构造方法");
    }
    // 非主类中的静态块
    static {
        System.out.println("3.Person类的静态块");
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("===============");
        new Person();
        new Person();
        System.out.println("===============");
    }
}

扫描二维码关注公众号,回复: 5095148 查看本文章

结论:定义在非主类中的静态块优先于构造块执行,并且无论有多少对象产生,静态块只执行一次(在类加载时执行),静态块的主要作用是为static属性进行初始化!

2. 主类中的构造块

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

结论:主类中的构造块优先于主(main)方法执行!

* * * * * 三种代码块的综合题:

class Test {
    public Test() {
        System.out.println("1.Test的构造方法");
    }
    {
        System.out.println("2.Test的构造块");
    }
    static{
        System.out.println("3.Test的静态块");
    }
}
public class DaiMaKuai extends Test {
    public DaiMaKuai() {
        System.out.println("4.DaiMaKuai的构造方法");
    }
    {
        System.out.println("5.DaiMaKuai的构造块");
    }
    static{
        System.out.println("6.DaiMaKuai的静态块");
    }
    public static void main(String[] args) {
        System.out.println("7.main方法开始");
        new DaiMaKuai();
        new DaiMaKuai();
        System.out.println("8.main方法结束");
    }
}

结论:因为 DaiMaKuai 是主类,主类中的静态代码块优先于主方法执行,又因为DaiMaKuai类继承了Test类,Test类是父类,DaiMaKuai是子类,子类对象在进行实例化之前一定会首先实例化父类对象,即先有父类对象才有子类对象,所以先加载父类接着加载子类,加载的过程执行静态块,即先执行Test类的静态块再执行DaiMaKuai类的静态块,接着才是主方法开始,又因为产生了DaiMaKuai类的两个对象,调用父类的构造块、构造方法,接着调用子类的构造块、构造方法,因为构造块优先于构造方法执行,生成两个对象,构造块和构造方法都会执行两次,接着主方法结束。

猜你喜欢

转载自blog.csdn.net/qq_43508801/article/details/86650605
今日推荐