静态代码块、构造代码块、构造方法执行顺序

静态代码块、构造代码块、构造方法执行顺序

2.1 小试牛刀
先自己验证,再对答案看看哪里想的不一样。

public class StaticTest {
    public static StaticTest st = new StaticTest();
    public static StaticTest st2 = new StaticTest();

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

    {
        System.out.println("构造代码块");
    }

    public StaticTest() {
        System.out.println("无参构造");
    }

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

执行结果如下 你做对了吗?

构造代码块
无参构造
构造代码块
无参构造
静态代码块
构造代码块
无参构造

擦干伤心的眼泪我们接着看

2.2 理论知识很重要

构造方法语法:

public class Student {
    /**
     * 无参构造方法
     */
    public Student() {
    }
}

什么是构造方法?

构造方法是一种特殊的方法,与其他方法不同的是。
1.构造方法的方法名必须与类名完全相同,没有返回类型,甚至连void也没有。
2.不创建对象,构造方法不会运行。构造方法的作用是初始化对象。
3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。

构造代码块语法:

public class Student {
    /**
     * 构造代码块
     */
    {
    }
}

什么是构造代码块?
直接在类中定义,没有任何的关键字修饰,使用“{}”括起来的代码片段,就是构造代码块

构造方法和构造代码块区别

相同点:

  • 构造代码块和构造函数都是给对象进行初始化的

不同点:

  • 构造代码块在对象一建立就运行,优先于构造方法执行
  • 构造代码块是给所有对象进行统一初始化,而构造方法是给对应的对象初始化,因为构造方法是可以多个的,运行哪个构造方法就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。

静态代码块语法:

public class Student {
    /**
     * 静态代码块
     */
    static {
    }
}

什么是静态代码块?

1.它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。

2.静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。

3.静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。

4.一个类中可以有多个静态代码块

2.3 温故知新
了解完构造方法、构造代码块、静态代码块回头再看刚开始的题。

public class StaticTest {
    public static StaticTest st = new StaticTest();//实例化静态对象
    public static StaticTest st2 = new StaticTest();//实例化静态对象

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

    {
        System.out.println("构造代码块");
    }

    public StaticTest() {
        System.out.println("无参构造");
    }

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

分析:
第一步:实例化静态对象比静态代码块(随着JVM加载类时执行,只执行一次)在类中先出现,因此前者先执行。
第二步:实例化静态对象 构造代码块优先构造方法执行。
第三步:进入main方法,执行实例化对象。

2.4 孰能生巧

public class StaticTest {
    private static int age = 20;//静态变量
    private String name = "西北";//成员变量

    public static StaticTest st = new StaticTest();

    static {
        System.out.println("age="+age);
        System.out.println("静态代码块");
    }

    {
        System.out.println("构造代码块");
    }

    public StaticTest() {
        System.out.println("name=" + name);
        System.out.println("无参构造");
    }

    public static void main(String[] args) {
        System.out.println("这是main方法");
        new StaticTest();
    }
}

执行结果:

构造代码块
name=西北
无参构造
age=20
静态代码块
这是main方法
构造代码块
name=西北
无参构造

2.5 知识拓展(继承关系)

public class Father {
    public Father() {
        System.out.println("Father的构造方法");
    }
    {
        System.out.println("Father的构造代码块");
    }
    static {
        System.out.println("Father的静态代码块");
    }
}
class Son extends Father {
    public Son() {
        System.out.println("Son的构造方法");
    }
    {
        System.out.println("Son的构造代码块");
    }
    static {
        System.out.println("Son的静态代码块");
    }

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

运行结果:

Father的静态代码块
Son的静态代码块
Father的构造代码块
Father的构造方法
Son的构造代码块
Son的构造方法

当涉及到继承关系,按照如下执行:

1.执行父类的静态代码块,初始化父类的静态变量。
2.执行子类的静态代码块,初始化子类的静态变量。
3.执行父类的构造代码块,执行父类的构造方法,初始化父类的成员变量。
4.执行子类的构造代码块,执行子类的构造方法,初始化子类的成员变量。

最后用一张图总结这篇文章。
在这里插入图片描述

以上就是静态代码块、构造方法、构造代码块的执行顺序。如果对你有用记得三连哦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值