代码块(局部块、构造块、静态块、同步块)
局部代码块、构造代码块、静态代码块、同步代码块
一、什么是代码块
- 在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加载进内存,父类中的静态代码块就会执行(而且只会执行一次),同理,子类的静态代码块也会执行
- 在走子类的构造方法前,会先执行父类的构造方法,即先有父后有子。
- 在走父类的代码块时,发现有父类的构造代码块,和父类的构造方法。(构造代码块>构造方法)
- 走完了父类的代码块,走子类的代码块,同理。
部分内容来自:
代码块(局部代码块、构造代码块、静态代码块)
代码块(局部块、构造块、静态块、同步块)相关推荐
- java 同步块的锁是什么,java – 同步块 – 锁定多个对象
我添加了另一个答案,因为我还没有添加评论给其他人的帖子. >事实上,同步是用于代码,而不是对象或数据.在同步块中用作参数的对象引用表示锁定. 所以如果你有如下代码: class Player { ...
- java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法
文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...
- java基础提升篇:synchronized同步块和volatile同步变量
初遇 Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低 ...
- java的同步块_Java 同步块
Java同步块用来标记一个方法或一个代码块为同步的.Java同步块可以用来避免竞态. Java同步关键字 在 Java 中使用 synchronized 来标记同步块.一个同步块是同步在某些对象上.同 ...
- synchronized同步块和volatile同步变量
Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...
- 关于list遍历时sychronizedList方法和synchronized同步块的线程安全问题思考
目录 我的难点 sychronizedList方法无法解决List遍历时线程不安全问题 sychronizd同步块为什么可以解决List遍历时线程不安全问题 我的思考过程 我的难点 sychroniz ...
- Java线程同步学习,线程不安全案例讲解,同步方法和同步块 synchronized
本文主要是自己学习多线程时,所做的笔记,参考的是b站狂神说Java多线程视频讲解. 目录如下: 文章目录 线程同步 一.三大线程不安全案例 1.买票案例 2.不安全取钱 3.线程不安全 二.同步方法及 ...
- java 构造块_java中构造方法、普通块、静态代码块、构造块的执行顺序
静态块.构造块.构造方法.普通块 静态块:在类中用"{}"括号括起来,并在括号前用static修饰的块为静态块;静态块在类加载时候被调用,并且在整个生命中只调用一次 同步块 使用s ...
- java同步方法同步块_java 同步代码块与同步方法
同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...
最新文章
- 跨平台PHP调试器设计及使用方法——拾遗
- 基因结构图绘制-单个基因
- 7.2 matlab符号微积分(符号函数的极限、导数和积分)
- 分页与无限滚动在评论区的设计差异
- 施密特正交化_格拉姆-施密特正交化--QR分解法的来源
- JavaScript逻辑运算符
- Objective-C Runtime 运行时之六:拾遗
- Linux 一句话 命令
- Leetcode 133.克隆图
- 用Javascript实现Repeater
- java预科_java复习预科知识-Markdown学习
- HTML计算机代码元素
- 使用技巧-输出彩色TIF格式分类结果
- php eot,PHP定界符EOT的用法
- java robot api_java机器人API学习笔记
- win10的一些用法
- 如何维持手机电池寿命_教你如何让自己的手机电池寿命多用两年
- matlab计算一组数的函数值_2.Matlab数值数组及其运算
- VuePress搭建博客教程(六)、vuepress配置head和自定义样式
- 利用ECharts在线生成图表