【Java】看看关于代码块的这些知识,你掌握了多少?

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 【Java】看看关于代码块的这些知识,你掌握了多少?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述

  • 作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Java岛冒险记【从小白到大佬之路】;该专栏专注于Java相关知识,持续更新,每一篇内容优质,浅显易懂,不失深度!
  • 近期目标:写好专栏的每一篇文章

🙆‍♀️前言

一个类是由很多成员所构成,大致分为以下成员。在前面的学习中,我们学习了成员变量和成员方法。今天我们学习类中的另一个成员:代码块
在这里插入图片描述

🌸一、基本介绍

简单来说,代码块就是用花括号{ }包围起来的一块代码。

语法格式

[修饰符] {
	代码
}

我们看到,就格式而言,代码块和方法(method)有点类似。

代码块vs方法

首先,代码块没有方法名,没有参数列表,没有返回值。这是肉眼可见,与方法不同的点。

其次,在调用上,既然都是数据和操作数据组成的代码,那么都是写来被执行的。对于方法而言,必须要被调用,方法体中的代码才可被执行。那对于静态代码块呢?静态代码块中的代码何时被执行?要弄清楚这个,以及代码块执行的作用,我们先学习代码块的分类,因为不同的代码块有区别,不可一概而论。

🌺二、代码块分类&作用

首先我们可以根据修饰符的不同,即有无static修饰。分为以下两种:

  • 静态代码块
  • 构造代码块

Tips:这里我们讨论的代码块,位置都是位于类中的,不去考虑位于方法中的代码块。

2.1:静态代码块

所谓静态代码块,就是被static所修饰的代码块
eg:

class Person {
    //实例成员变量
    private String name;
    private int age;
    private String sex;
    //静态成员变量
    private static int countNum;

    static {
        countNum = 0;
        System.out.println("countNum初始化完毕");
    }
}
  • 作用:初始化静态成员属性
  • 执行时机:随着类的加载而执行

2.2:构造代码块

构造代码块,是指没有被static修饰的代码块,也叫作实例代码块
eg:

class Person {
    //实例成员变量
    private String name;
    private int age;
    private String sex;
    //静态成员变量
    private static int countNum;

    //静态代码块
    static {
        countNum = 0;
        System.out.println("countNum初始化完毕");
    }

    //构造代码块
    {
        this.name = "yaoyao";
        this.age = 18;
        this.sex = "female";
    }
}
  • 作用:初始化实例成员变量
  • 执行时机:对象创建后,调用本类构造器前
  • 和构造器的关系:
 public Person(String name, int age, String sex) {
        //super()
        //调用本类的构造代码块
        
        //以下是本类构造器的实现
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

可以看到,当创建对象时,会调用构造器,但构造器中其实还有隐藏的:super()(即调用父类构造器,进行初始化),调用本类构造代码块,最后再执行本类构造器中的初始化代码。

如果对于代码块的执行顺序,还是不是很清晰,那么下面这一Part,会带你清晰的掌握,什么样的代码块在什么时候执行。

💐三:执行顺序再深入

当我们创建一个有继承关系的子类时,内存中,代码执行情况是怎样的呢?

Inheritance

Inheritance

classA

classB

classC

public class A {    static {        System.out.println("A类静态代码块被执行");    }    {        System.out.println("A类构造代码块被执行");    }    public A() {        //super();        //调用A类普通代码块        System.out.println("A类构造方法被调用");    }}
public class B extends A{    static {        System.out.println("B类静态代码块被执行");    }    {        System.out.println("B类构造代码块被执行");    }    public B() {        //super();        //调用A类普通代码块        System.out.println("B类构造方法被调用");    }}
public class C extends B{    static {        System.out.println("C类静态代码块被执行");    }    {        System.out.println("C类构造代码块被执行");    }    public C() {        //super();        //调用A类普通代码块        System.out.println("C类构造方法被调用");    }}

以下是测试类,用来测试子类C被创建时,代码块、构造方法执行顺序

public class Test {
    public static void main(String[] args) {
        C c = new C();
        //A类静态代码块被执行
        //B类静态代码块被执行
        //C类静态代码块被执行
        //A类构造代码块被执行
        //A类构造方法被调用
        //B类构造代码块被执行
        //B的构造方法被调用
        //C类构造代码块被执行
        //C类构造方法被调用
    }
}

总结

  • 继承查找关系,从顶级父类开始,从上往下逐级加载
    • 父类静态代码块执行
    • 子类静态代码块执行
  • 调用子类构造器
    • 执行子类构造器方法体之前隐含的super()(初始化父类,调用父类构造器)
    • 执行子类构造代码块
    • 执行子类构造器方法体

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142447.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!