浅谈Java中static代码块和普通代码块和构造器的执行顺序以及存在继承关系时它们的执行顺序

Java代码块的概念

代码块就两种:就看是否有static修饰。
代码块不能有那四种访问修饰符,不能有final,没有参数列表,没有返回值

//第一种 修饰符是static
static{
    
}
//第二种 修饰符是没有static
{
    
};

没办法,如果读者不知道一些概念,后面可能看的不懂,如果知道这些就直接去后面找结果吧!
再补充一点概念。

static代码块和普通代码块何时会被调用????

static代码块会在类加载的时候调用!因为类加载就一次,所以static代码块就只执行一次

  • 问:何时会类加载
  • 答:
    1、创建对象的时候。new
    2、没有创建对象,但是直接用类名去调用静态方法或者静态属性。
    3、如果存在继承关系,那么类加载的顺序又是怎么样的???
    答:从最顶层的父类开始类加载,向下加载到子类。也就是最顶层的static代码块会最先开始调用,子类的static代码块会是最后调用的。

普通代码块会在创建对象的时候调用!只要你创建对象普通代码块就会执行,创一次,执行一次

  • 问:何时会创建对象?
  • 答:问你自己什么创建,你什么时候创建就什么时候调用。

最后执行顺序是怎么样的

没有任何继承关系,就单独一个类
首先执行static代码块,若有多个static代码块,则按照它们在类中从上到下的顺序依次执行完,其次执行普通代码块,如有多个普通代码块,则按照它们在类中从上到下的顺序依次执行完,最次是构造器。
static > 普通 > 构造器
当创建一个对象的时候,类中的static代码块和普通代码块运行效果如下:

public class Person {


    // 构造器
    Person(){
        System.out.println("我是构造器");

    }
    // 普通代码块
    {
        System.out.println("我是普通代码块1");
    }
    {
        System.out.println("我是普通代码块2");
    }
    // static 代码块
    static {
        System.out.println("我是static代码块1");
    }
    static {
        System.out.println("我是static代码块2");
    }

    public static void main(String[] args) {
            Person person = new Person();
    }

}

结果图
结果图
存在继承关系
假设我们现在设置两个类一个Animal类,还有一个Cat类,Cat类继承Animal类。(大家要知道所有的类都默认继承Object类,也就是基类,也叫超类,但这里我们讨论不到,了解就好)
当两个类中都有static代码块和普通代码块的时候,创建一个子类对象的代码块的执行顺序是这样的。
首先最顶层的父类Animal中的static代码块最先执行,然后你可能会想,接下来就是父类中的普通代码块,但是并不是,接下来应该执行应该是子类Cat中的static代码块,然后再是最顶层父类中的普通代码块执行,接着就是父类Animal中的构造器执行,最后才是子类Cat普通代码块执行,接着就是子类Cat中的构造器执行。
这里有点绕,我举个例子:假设把继承想像成一层高楼,从下到上是子类一层一层继承上去。最高层是顶层父类,最低层就是子类。当子类创建对象的时候,从最高层的static代码块开始执行,一直从上到下,把所有层的static代码块执行完,然后再从最高层开始执行普通代码块并且把该层的构造器也执行了,然后才去执行下一层的普通代码块和构造器,一直到执行完最底层的子类就结束了。

import java.util.*;

public class LeetcodeTest {
    public static void main(String[] args) {
        Cat cat = new Cat();
    }

}
class Animal {
    //静态代码块
      static {
        System.out.println(
                "父类的静态代码块"
        );
    }
    // 普通代码块
    {
        System.out.println("父类的普通代码块");
    }
    // 构造器
    Animal(){
        System.out.println("父类的构造器");
    }
    
}
class Cat extends Animal {
    // 构造器
    Cat(){
        System.out.println("子类的构造器");
    }
    //静态代码块
    static {
        System.out.println("子类的静态代码块");
    }
    // 普通代码块
    {
        System.out.println("子类的普通代码块");
    }
}

结果
在这里插入图片描述
多个静态代码块或多个普通代码块的优先级在同类面前是一样的,执行的顺序按谁写在前就谁先执行。(同类:同种代码块)
否则一般static{} > 普通{} > 构造器,有继承又有一点区别。希望读者自己好好分辨。

有问题评论区或者私信,因为忙不一定及时回复,但会回复。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值