专栏首页麦洛的历劫之路普通代码块 静态代码块 构造代码块......傻傻分不清

普通代码块 静态代码块 构造代码块......傻傻分不清

代码块的定义

在Java中,使用{ }括起来的代码被称为代码块。

代码块的分类

根据其位置和声明方式不同:

图片来自网络

面试题: 构造块和静态块执行顺序

在上面分类描述中,我们已经给出了答案;接下来我们跑一跑测试代码,根据代码执行结果来验证这些答案

无继承关系

package com.milo.java7.codeblock;

/**
 * @author Milo Lee
 * @date 2021-04-23 15:43
 */
public class People {

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

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

    public People() {
        System.out.println("父类构造无参构造方法");
    }
    public People(String str){
        System.out.println("父类含参构造方法");
    }

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

}

执行结果:

现在我们改动一下代码,来看看有参情况下,执行结果会有什么变化?

 public static void main(String[] args) {
        new People("麦洛");
    }

执行结果:

我们发现无参构造构造方法变为含参构造方法,这个很好理解

接下来我们来看看多个对象的情况下,执行结果会有什么变化?

我们发现静态代码块只执行了一次,这一点要特别注意;

有继承关系

我们新建Student类来继承People类,来看看有继承关系情况下,执行结果如何

package com.milo.java7.codeblock;

/**
 * @author Milo Lee
 * @date 2021-04-23 15:44
 */
public class Student extends People {
    {
        System.out.println("子类构造代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }

    public Student() {
        //super(null);
        System.out.println("子类构造代码块");
    }

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

}

执行结果:

如果我们换成有参的,我们来看看执行结果:

接下来我们来看看多个对象的情况下,执行结果会有什么变化?

image-20210423160628333

在上面例子中,我们发现调用的都是父类无参构造方法,那么什么情况下调用父类有参构造方法呢?

首先我们改造下代码

Student

//无参构造方法
public Student() {
        super(null);
        System.out.println("子类无参构造方法");
    }
    
  //测试方法
  public static void main(String[] args) {
        new Student();
    }

看到了吧,就这样操作

代码块的作用

认识了这么多代码块,你是不是也和我一样在好奇它们的适用场景都是什么那?

普通代码块

public void show(){
    {
        System.out.println("普通代码块运行!");
    }
}

有的地方也叫局部代码块,在程序中当我们定义完成一个局部变量x之后,并且在接下来的代码中,不想再用到它时,那么就没必要让x在内存中继续占用空间。因此就有了局部代码块

构造代码块

作用在类的定义Body中,作用是给类的部分字段统一初始化:

public class Apple {
    private String size;

    //构造代码块  
    {
        System.out.println("构造代码块运行!");
        size = "E";
    }
}  

构造代码块与构造函数的区别是:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。所以理所当然的,构造代码块在构造函数之前执行。

静态代码块

作用有两个:(1)给类的静态变量赋值;(2)声明静态变量;

作用在类的Body中,对类中的静态变量初始化:

public class APP {
    static int x, y; // 静态变量

    static {
        x = 5; // 给静态变量x赋值
    }

    public static void myMethod() {
        y = x++ + ++x; // x++ 先使用x的值再加1;++x先加1再使用x的值
    }

    public static void main(String[] args) {
        x--;
        myMethod();
        System.out.println(x + y + ++x);
    }
}

输出:23

注意,如果静态代码块中的代码改为:

static {
    int x = 5; // 声明一个静态变量
}

则只是在声明静态变量,而且这个静态变量的作用域只在这个代码块中,而不是进行初始化,最后的输出结果是3。

同步代码块

我们把有synchronized修饰符修饰的语句块,称为同步代码块,主要用于解决多线程下的安全问题

synchronized(Object o ){}

现在,你明白它们的作用和使用场景了吧

本文分享自微信公众号 - 今日Java(JavaToday),作者:李晓斌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中静态代码块、构造代码块、构造函数、普通代码块

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Fisherman渔夫
  • Java——代码块(普通块、构造块、静态块)

    代码编写中,使用{}声明的程序块就属于代码块,而根据其出现的位置,及声明关键字的不同,分为四种:普通代码块、构造块、静态块、同步代码块(多线程中涉及)

    Winter_world
  • 关于java中普通代码块、构造代码块与静态代码块

    public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现”{普通代码的执行语...

    指尖改变世界
  • Java中类的静态代码块、构造代码块、构造方法、普通代码块

    Java中静态代码块、构造代码块、构造方法、普通代码块的执行顺序是一个比较常见的笔试题,合理利用其执行顺序也能方便实现项目中的某些功能需求 。

    小诸葛
  • Java中静态代码块和构造代码块

        构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

    緣來
  • 【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析

    //执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。 其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。 1 普通代码...

    Angel_Kitty
  • 构造代码块、构造函数、静态代码块 学习笔记

    qubianzhong
  • 静态代码块、非静态代码块、构造函数三者执行顺序

    主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序。 如有错误,欢迎指出。

    HaC
  • 静态代码块、构造代码块以及构造函数的加载顺序

    首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。

    week

扫码关注云+社区

领取腾讯云代金券