原文链接:

java中的四种代码块_Munt的博客-CSDN博客_java中代码块

在java中用{}括起来的称为代码块,代码块可分为以下四种:

一.简介

1.普通代码块:

类中方法的方法体

2.构造代码块

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

3.静态代码块:

用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。

4.同步代码块:

使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。

二.静态代码块和构造代码块的异同点

相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多个,一般在代码块中对一些static变量进行赋值。

不同点:静态代码块在非静态代码块之前执行。静态代码块只在第一次new时执行一次,之后不在执行。而非静态代码块每new一次就执行一次。

三.示例

普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般语句的执行顺序由他们在代码中出现的次序决定,先出现先执行。

public class Test { public static void main(String[] args) { { int x = 3; System.out.println("普通代码块内的变量x=" + x); } int x = 1; System.out.println("主方法内的变量x=" + x); { int y = 7; System.out.println("普通代码块内的变量y=" + y); } }
}
/* * 运行结果  普通代码块内的变量x=3 *      主方法内的变量x=1 *      普通代码块内的变量y=7 */

构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。如果存在多个构造代码块,执行顺序由他们在代码中出现的次序决定,先出现先执行。

public class Test1 {{System.out.println("第一构造块");}public Test1(int i) {System.out.println("第" + i + "次调用" + "构造方法");}{System.out.println("第二构造块");}public static void main(String[] args) {new Test1(0);new Test1(1);new Test1(2);}
}
/* * 执行结果 第一构造块 *      第二构造块 *      第0次调用构造方法 *      第一构造块 *      第二构造块 *      第1次调用构造方法 *      第一构造块 *      第二构造块 *      第2次调用构造方法 */

静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。

如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。

注意:

1.静态代码块不能存在于任何方法体内。

2.静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。

public class Test3 {public static String STATIC_FIELD = "静态属性";// 静态块 static {System.out.println(STATIC_FIELD);System.out.println("静态代码块1");}public String field = "非静态属性";// 非静态块 {System.out.println(field);System.out.println("非静态代码块2");}public InitOderTest() {System.out.println("无参构造函数");}public static void main(String[] args) {InitOderTest test = new InitOderTest();}// 非静态块 {System.out.println(field);System.out.println("非静态代码块1");}// 静态块 static {System.out.println(STATIC_FIELD);System.out.println("静态代码块2");}
}
/* * 运行结果 静态属性 *      静态代码块1 *      静态属性 *      静态代码块2 *      非静态属性 *      非静态代码块2 *      非静态属性 *      非静态代码块1 *      无参构造函数 */

以下代码演示了创建一个对象并调用方法各个代码块之间的优先关系:

public class Person {static{System.out.println("1.我是静态块,优先于构造块执行!并且只有创建第一个对象的时候执行一次!");}{System.out.println("2.我是构造块,优先于构造方法执行!每创建一个对象执行一次!");}public Person() {System.out.println("3.我是构造方法,每创建一个对象执行一次");}public void function1(){System.out.println("我是非静态方法中的普通代码块,方法被调用时执行!");}public static void function2(){System.out.println("我是静态方法中的普通代码块,方法被调用时执行,晚于静态块执行!");}
}

测试类:

public class HelloWrold {public static void main(String[] args) {new Person().function1();new Person().function1();System.out.println("=================");Person.function2();Person.function2();}
}

运行结果:

我们可以看出:静态块总是最先执行的,并且只有在创建该类的第一个实例的时候才会执行一次;第二执行的是构造块;第三执行的是构造方法。

java中的四种代码块相关推荐

  1. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  2. 【 史上最坑爹的Java代码系列02 】Java中的三种代码块

    Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题. 三种代码块:静态代码块.方法代码块.普通代码块 其中,普通代码块是比较少见而且比较少使用的. package com. ...

  3. java中你知道这四种代码块吗?

    大家好,我是雄雄,今天给大家分享的是:java中构造代码块的用法. 什么叫代码块?代码块将多行代码封装到一个{}中,形成一个独立的代码区,这就够成了代码块,一般常见的代码块是这样的: Java中,代码 ...

  4. java中你知道的这四种代码块吗?

    点击上方蓝字关注我们 大家好,我是雄雄,今天给大家分享的是:java中的四种代码块 什么叫代码块? 代码块就是将多行代码封装到一个"{}"中,形成一个独立的代码区,这就构成了代码块 ...

  5. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  6. Java基础篇:四种代码块详解

    所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...

  7. java中有几种内部类,Java中的四种内部类

    四种内部类 在Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的 内部类一般来说包括这四种:静态内部类.匿名内部类.成员内部类和局部内部类,下面我们一一介绍 ...

  8. Java中的四种内部类

    Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...

  9. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

最新文章

  1. Oracle的逻辑结构(表空间、段、区间、块)——Oracle数据块(一)
  2. python【蓝桥杯vip练习题库】BASIC-17矩阵乘法(枚举)
  3. Cisco ASA 5500系列防火墙 Series Adaptive Security Appliances
  4. 阿里P8架构师谈:MySQL有哪些存储引擎,各自的优缺点,应用场景
  5. flowable 表结构大全
  6. localStorage sessionStorage
  7. win10下wifi链接成功,qq可以登录,浏览器无法上网的问题处理
  8. Oracle rac 组件reload,亲测Linux 7系列 上安装Oracle RAC 遇到的问题和坑
  9. JS中var与function
  10. linux python指令大全,Linux常用指令
  11. 递归算法及经典例题详解
  12. cad转pdf怎么变成黑白?
  13. laravel 文档
  14. 最适合程序员敲代码用的显示器,包邮送!
  15. Linaro交叉编译链配置
  16. CutefishOS 0.6 Beta 发布
  17. linux 服务器访问限制,Linux中限制用户访问权限的3种方法
  18. MATLAB中round函数的使用
  19. easyUI的基本知识
  20. do-while循环

热门文章

  1. docker配置HTTP/HTTPS代理访问外网
  2. 省选+NOI 第一部分 动态规划DP
  3. 性能测试基础(四)吞吐量
  4. 野火 RT1052 移植网卡功能(LAN8720A)
  5. 达梦数据库的DMAP服务脚本误删怎么恢复
  6. 基因数据处理44之cloud-scale-bwamem安装
  7. 主流部署端深度学习框架
  8. Redis的可视化工具查询内容为 --> “\xac\xed\x00\x05t\x00”乱码
  9. 部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...
  10. 在python中输入数据使用input、该函数返回值的类型是_python3的input函数默认返回值都是str...