局部代码块、构造代码块、静态代码块、同步代码块

一、什么是代码块

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

二、代码块分类

  • 局部代码块

    • 含义:局部代码块就是普通的代码块,
    • 出现位置:类和方法中出现的{}
    • 作用:限定了生命周期,提高内存的利用率
  • 构造代码块
    • 出现位置:在类中方法外{}
  • 静态代码块
    • 出现位置:在类中方法外,加上static{}
    • 作用:一般用于加载
  • 同步代码块
    • 出现位置:synchronized(){}
    • 作用:为了线程安全

举例说明:

public class Person {public static void main(String[] args) {//在主方法类中的静态代码块执行之后执行//创建对象People p1 = new People();People p2 = new People("小明");Thread thread = new Thread(p1);thread.start();}//main方法类中的静态代码块优先于main方法执行static {System.out.println("我是主方法类中的静态代码块");}
}class People implements Runnable{private String name;public People() {System.out.println("这是People的无参构造");}public People(String name) {this.name = name;System.out.println("这是People的有参构造");}{System.out.println("我是People类的构造代码块");  //随着对象的创建而加载,对象创建一次,构造代码块执行一次}static {System.out.println("我是People类中静态代码块");  //静态代码块,随着类的加载而加载,并且只执行一次}@Overridepublic void run() {synchronized (this){System.out.println("我是同步代码块");}}
}

运行结果

我是主方法类中的静态代码块
我是People类中静态代码块  // 优先于类的对象创建
我是People类的构造代码块
这是People的无参构造
我是People类的构造代码块
这是People的有参构造
我是同步代码块

总结:

  • main静态方法的静态代码块优先执行,快于main方法执行
  • 创建对象时,People类中的静态代码块优先执行。随着类的加载而加载,并且只执行一次
  • people类的构造代码块,随着对象创建就会执行一次
  • 这是People的无参构造——以无参的方式创建对象时,就会执行一次
  • 这是People的有参构造——以有参的方式创建对象,就会执行一次
  • 同步代码块,是关于多线程方面。

题目:

public class face_extends_question_2 {public static void main(String [] args) {Zi s=new Zi();}
}class Fu {static {System.out.println("父类  静态构造代码块");}{System.out.println("父类  构造代码块");}public Fu () {System.out.println("父类  构造方法");}
}class Zi extends Fu {static {System.out.println("子类  静态构造代码块");}{System.out.println("子类  构造代码块");}public Zi() {System.out.println("子类  构造方法");}
}

输出结果:

父类  静态构造代码块
子类  静态构造代码块
父类  构造代码块
父类  构造方法
子类  构造代码块
子类  构造方法

解释:

  • 首先调用了main方法,main方法进入栈。
  • 执行Zi s=new Zi();,就会fu.class和zi.class分别加载进内存。
  • 在创建对象的时候,fu.class加载进内存,父类中的静态代码块就会执行(而且只会执行一次),同理,子类的静态代码块也会执行
  • 在走子类的构造方法前,会先执行父类的构造方法,即先有父后有子。
  • 在走父类的代码块时,发现有父类的构造代码块,和父类的构造方法。(构造代码块>构造方法)
  • 走完了父类的代码块,走子类的代码块,同理。

部分内容来自:

代码块(局部代码块、构造代码块、静态代码块)

代码块(局部块、构造块、静态块、同步块)相关推荐

  1. java 同步块的锁是什么,java – 同步块 – 锁定多个对象

    我添加了另一个答案,因为我还没有添加评论给其他人的帖子. >事实上,同步是用于代码,而不是对象或数据.在同步块中用作参数的对象引用表示锁定. 所以如果你有如下代码: class Player { ...

  2. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

  3. java基础提升篇:synchronized同步块和volatile同步变量

    初遇 Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低 ...

  4. java的同步块_Java 同步块

    Java同步块用来标记一个方法或一个代码块为同步的.Java同步块可以用来避免竞态. Java同步关键字 在 Java 中使用 synchronized 来标记同步块.一个同步块是同步在某些对象上.同 ...

  5. synchronized同步块和volatile同步变量

    Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...

  6. 关于list遍历时sychronizedList方法和synchronized同步块的线程安全问题思考

    目录 我的难点 sychronizedList方法无法解决List遍历时线程不安全问题 sychronizd同步块为什么可以解决List遍历时线程不安全问题 我的思考过程 我的难点 sychroniz ...

  7. Java线程同步学习,线程不安全案例讲解,同步方法和同步块 synchronized

    本文主要是自己学习多线程时,所做的笔记,参考的是b站狂神说Java多线程视频讲解. 目录如下: 文章目录 线程同步 一.三大线程不安全案例 1.买票案例 2.不安全取钱 3.线程不安全 二.同步方法及 ...

  8. java 构造块_java中构造方法、普通块、静态代码块、构造块的执行顺序

    静态块.构造块.构造方法.普通块 静态块:在类中用"{}"括号括起来,并在括号前用static修饰的块为静态块;静态块在类加载时候被调用,并且在整个生命中只调用一次 同步块 使用s ...

  9. java同步方法同步块_java 同步代码块与同步方法

    同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——拾遗
  2. 基因结构图绘制-单个基因
  3. 7.2 matlab符号微积分(符号函数的极限、导数和积分)
  4. 分页与无限滚动在评论区的设计差异
  5. 施密特正交化_格拉姆-施密特正交化--QR分解法的来源
  6. JavaScript逻辑运算符
  7. Objective-C Runtime 运行时之六:拾遗
  8. Linux 一句话 命令
  9. Leetcode 133.克隆图
  10. 用Javascript实现Repeater
  11. java预科_java复习预科知识-Markdown学习
  12. HTML计算机代码元素
  13. 使用技巧-输出彩色TIF格式分类结果
  14. php eot,PHP定界符EOT的用法
  15. java robot api_java机器人API学习笔记
  16. win10的一些用法
  17. 如何维持手机电池寿命_教你如何让自己的手机电池寿命多用两年
  18. matlab计算一组数的函数值_2.Matlab数值数组及其运算
  19. VuePress搭建博客教程(六)、vuepress配置head和自定义样式
  20. 利用ECharts在线生成图表

热门文章

  1. 免费开源Odoo系统破解企业数字化转型难题
  2. Prime Time
  3. adreno630gpu参数_苹果自研GPU为何不如高通Adreno 630优秀
  4. 解析WT588F02B-8S语音芯片在开车防瞌睡提醒器的设计应用解决方案
  5. 【JAVA程序设计】基于JAVA的坦克大战小游戏--入门级小游戏
  6. linux nandflash分区,nandflash分区
  7. K3后台修改采购模块(采购订单、收料送检单、外购入库单)供应商信息
  8. 20170117 机房『练习赛』
  9. 有哪些编程后找错误的心得?
  10. 基本初等函数 对数函数