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

麦洛 等级 1057 1 0

代码块的定义

在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("麦洛");
    }

执行结果:

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

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

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

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

我们发现静态代码块只执行了一次,这一点要特别注意;微信搜一搜"爱写Bug的麦洛",关注我,一起努力写Bug

有继承关系

我们新建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();
    }

}

执行结果:

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

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

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

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

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

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

首先我们改造下代码

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 ){}

现在,你明白它们的作用和使用场景了吧,今天的分享就到这里,谢谢大家

收藏
评论区

相关推荐

js 理解模块化
经常在面试或者其他文章看到关于模块化的问题,之前也只是寥寥看了几次,对于 CommonJS,AMD,ES6也说不出个所以然,于是今天抽空好好看了 红宝书第4版关于模块化的介绍,这里记录一下。 理解模块模式 初衷在开发中肯定有设计大量三方库或者业务逻辑代码,较好的方式是将其分割为多个小模块,最后以一定的方式连接起来
普通代码块 静态代码块 构造代码块......傻傻分不清
代码块的定义 在Java中,使用 括起来的代码被称为代码块。 代码块的分类根据其位置和声明方式不同: 面试题: 构造块和静态块执行顺序在上面分类描述中,我们已经给出了答案;接下来我们跑一跑测试代码,根据代码执行结果来验证这些答案 无继承关系javapackage com.milo.java7.codeblock;/ @author Milo Lee @d
ES6模块与CommonJS模块有什么区别?
ES6 Module和CommonJS模块的区别: CommonJS是对模块的浅拷贝,ES6 Module是对模块的引用,即ES6 Module只存只读,不能改变其值,具体点就是指针指向不能变,类似const import的接口是read-only(只读状态),不能修改其变量值。 即不能修改其变量的指针指向,但可以改变变量内部指针指向,可以对comm
ES6模块
默认情况下,你在模块中的所有声明相对于模块而言都是寄存在本地的。如果你希望公开在模块中声明的内容,并让其它模块加以使用,你一定要_导出_这些功能。 // kittydar.js - 找到一幅图像中所有猫的位置 // (事实上是Heather Arthur写的这个库) // (但是她没有使用ES6中新的模块特性
JAVAWEB应用模块(一)登录模块
java后台代码(MD5加密+token验证): import com.smart.ssai.admin.domain.User; import com.smart.ssai.admin.service.UserService; import com.smart.ssai.VO.Response; import com.sm
Java中静态代码块、构造代码块、构造函数、普通代码块
### 转载来源[http://www.cnblogs.com/ysocean/](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.cnblogs.com%2Fysocean%2F) ### 1、静态代码块 #### ①、格式   在java类中(方法中不能存在静态代码块)使用s
python的stat模块
#!/usr/bin/env python #-*- encoding:UTF-8 -*- # import os,time,stat # fileStats = os.stat ( 'test.txt' ) #获取文件/目录的状态 fileInfo =
4. Nginx模块
### Nginx官方模块 #### 1.ngx\_http\_stub\_status\_module > [http://nginx.org/en/docs/http/ngx\_http\_stub\_status\_module.html。](https://www.oschina.net/action/GoToLink?url=http%3A%2
Creator模块介绍—领略模块化的力量
从Cocos2d-js到Creator,一直以来都有模块裁剪的能力,可以将游戏中没有用到的功能代码,在编译输时移除,从而减少包体大小,这对H5游戏来说影响比较明显。Creator比Cocos2d-js做的更好,通过主菜单->项目设置->模块设置有一个图形化的界面,可以方便模块配置。 ![](https://oscimg.oschina.net/oscnet
JavaScript模块化
前言:模块化开发需求 ---------- 在JS早期,使用script标签引入JS,会造成以下问题: 1. 加载的时候阻塞网页渲染,引入JS越多,阻塞时间越长。 2. 容易污染全局变量。 3. js文件存在依赖关系,加载必须有顺序。项目较大时,依赖会错综复杂。 4. 引入的JS文件过多,不美观,且不易于管理。 一、CommonJS规范 ---
Javascript模块化编程:模块的写法
随着网站逐渐变成"[互联网应用程序](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWeb_application)",嵌入网页的Javascript代码越来越庞大,越来越复杂。 ![](https://static.oschina.ne
Python常用模块os & sys & shutil模块
### OS模块 import os ''' os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取
Python模块
目录 * pyecharts模块 * 简介 * 安装pyecharts * 测试pyecharts模块 * pyecharts实战:绘制新冠肺炎疫情地图 * 需求分析 * 请求数据 * 提取数据 * 处理数据 * 制作可视化地图 * 设置可视
TypeScript Modules(模块)
本文概述了TypeScript中如何使用模块以各种方式来组织代码。我们将涵括内部和外部的模块,并且讨论他们在适合在何时使用和怎么使用。我们也会学习一些如何使用外部模块的高级技巧,并且解决一些当我们使用TypeScript的模块时遇到的陷阱。 **案例的基础** 接下来开始写程序,我们将会在这里写上使用案例。我们来写个小型的简单字符串验证器,在我们检查网页