Java中代码块的加载顺序

1.0 校招笔试题(一道)

我们先来看一道校招笔试题

class A{
    //构造方法
    public A(){
        System.out.println("1.A(父类)的构造方法");
    }
    //非静态代码块
    {
        System.out.println("2.A(父类)的非静态代码块");
    }
    //静态代码块
    static {
        System.out.println("3.A(父类)的静态代码块");
    }
}

public class B extends A{
    //构造方法
    public B(){
        System.out.println("4.B的构造方法");
    }
    //非静态代码块
    {
        System.out.println("5.B的非静态代码块");
    }
    //静态代码块
    static {
        System.out.println("6.B的静态代码块");
    }
    public static void main(String[] args){
        System.out.println("7.----start----");
        new B();
        new B();
        System.out.println("8.----end----");
    }
}

运行结果及分析如下图:
在这里插入图片描述

1.1 前语

定义: 使用"{}"定义的一段代码
根据代码块的定义的位置以及关键字,又分为一下四种:

  1. 普通代码块
  2. 构造块
  3. 静态代码块
  4. 同步代码块(先了解)

1.2 普通代码块

  定义在方法中的代码块。
举例:观察普通代码块

public class Test{
    public static void main(String[] args){
        {
            //直接使用{}定义,普通代码块
            int x = 10;
            System.out.println("x = " + x);
        }
        int x = 100;
        System.out.println("x = " + x);
    }
}

运行结果如下:
在这里插入图片描述
一般如果方法中代码块过长,为避免变量重名,使用普通代码块。(使用较少,了解概念即可)

1.3 构造块(重点)

  定义在中的代码块(不加任何修饰符)
举例:观察构造块

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();
    }
}

运行结果如下所示:
在这里插入图片描述
总结:
 1.在对象产生时,优先于构造方法产生,有几个对象产生,就调用几次构造块。
 2.用于在构造方法执行之前,完成一些属性的初始化操作。

1.4 静态代码块(重点)

  使用static定义的代码块
 根据静态代码块所在的类不同又分为以下两种类型:

  • 在非主类中
  • 在主类中
1.4.1 在非主类中的静态代码块

举例:观察非主类中的静态代码块

class 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("---start---");
        new Person();
        new Person();
        System.out.println("---end---");
    }
}

运行结果如下所示:
在这里插入图片描述
通过以上代码块我们发现:
 1.在类加载时执行(啥时候用到,啥时候加载),优先于构造块执行
 2.无论产生多少实例对象,静态块都只会调用一次

静态代码块的作用是:为static属性进行初始化

1.4.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("---start---");
        new Person();
        new Person();
        System.out.println("---end---");
    }
}

运行结果如下所示:
在这里插入图片描述
在主类中定义的静态代码块,优先于主方法(main)执行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值