在Java中代码块指的是使用”{}”括起来的代码称为代码块。代码块一共分为4种:局部代码块,静态代码块,同步代码块,构造代码块。

1、局部代码块

局部代码块就是定义在方法体内部的代码块。

public class CodeBlockTest {public static void main(String[] args) {int i;{i=10;System.out.println("局部代码块"+i);int j=20;System.out.println("局部代码块"+j);}System.out.println(i);//Cannot resolve symbol 'j'//System.out.println(j);
    }
}

可以看到,在局部代码块中声明的变量,只能在局部代码块中进行访问。局部代码块可以操作非局部代码块的变量,但是非局部代码块不能访问局部代码块的变量。这就起到了很好的分隔,就可以用来限制局部变量的生命周期,及早释放,提高内存利用率。如果有多个局部代码块,则按照它们定义的先后顺序执行。

2、静态代码块

静态代码块就是在类中用static关键字修饰的代码块,它不能出现在方法体或者代码块内,我在上一篇的Static关键字中也记录了静态代码块的使用,所以就把那里的例子引用过来了。

被static修饰的代码块也叫静态代码块,会随着JVM加载类的时候而加载这些静态代码块,并且会自动执行。它们可以有多个,可以存放在于该类的任何地方(不能放在方法内部)。JVM会按照它们的先后顺序依次执行它们,而且每个静态代码块只会被初始化一次,不会进行多次初始化。

简单示例:

public class Person{static {System.out.println("Person类静态块");}public Person() {System.out.println("Person类构造器");}public static void main(String[] args) {new Son();System.out.println("-------");new Son();}
}class Son extends Person{static {System.out.println("Son类静态块");}public Son() {System.out.println("Son类构造器");}
}

运行结果:

从运行结果分析:首先运行main()方法,然后JVM就会加载类,因为Son类继承了Person类,所以会先加载父类Person类,再去加载子类Son。由于静态代码块会随着类的加载而加载,所以先输出父类中静态代码块内容"Person类静态块",然后输出子类中静态代码块内容"Son类静态块"。加载完类之后执行main()方法内容,先new了第一个Son实例,由于子类构造器中默认调用了super(),所以先输出父类构造器的内容,再输出子类构造器的内容。之后又new了第二个Son实例,却是输出的构造器的内容,说明static静态块只加载了一次。结论:静态代码块是先加载父类的静态代码块,然后再加载子类静态代码块,是随着类的加载而加载,而且只会加载一次。

补充:因为入口main()是个方法,也需要用类去调用,所以类的加载优先级>main()方法。

3、同步代码块

是使用synchronized关键字修饰的普通代码块(其只能用在方法内部)。其作用在多线程的环境下,对共享数据进行加锁, 从而实现线程同步,是一种多线程保护机制。

public void show(){synchronized (obj){System.out.println("同步代码块");}
}

4、构造代码块

直接在类中用"{}"定义且不加任何关键字的代码块成为构造代码块。

public class CodeBlockTest {{System.out.println("构造代码块...");}public CodeBlockTest() {System.out.println("无参构造器...");}public static void main(String[] args) {new CodeBlockTest();new CodeBlockTest();}
}

运行结果:

从运行结果容易看出,在创建对象时,构造代码块才会被执行,而且优先于构造方法执行(这里和构造块写前写后没关系,将构造块写在构造方法后面也是一样的结果)。而且每当有对象被创建的时,都会执行构造代码块。如果存在多个构造代码块,则执行顺序按照定义顺序依次执行。

构造代码块的作用:可以用来初始化实例变量和实例环境(即创建对象的必要条件),这样不仅可以减少代码量,同时也可以增强程序的可读性。

注意:构造代码块并不是真正的在构造方法之前执行的,JVM在编译的时候会把构造代码块插入到每个构造函数的最前面,构造代码块随着构造方法的执行而执行,如果某个构造方法调用了其他的构造方法,那么构造代码块不会插入到该构造方法中以免构造代码块执行多次。我们可以从编译生成的class文件可以看出来。

5、代码块的执行顺序

上面讲述了四种代码块的基本信息,然后我们来看一下四种代码块的执行顺序。

public class CodeBlockTest {static {System.out.println("静态代码块...");}{System.out.println("构造代码块...");}public CodeBlockTest() {System.out.println("无参构造器...");}public void show(){{System.out.println("局部代码块...");}}public static void main(String[] args) {System.out.println("main()方法运行");new CodeBlockTest().show();System.out.println("----------");new CodeBlockTest().show();}
}

打印结果:

执行顺序(优先级从高到低):静态代码块>mian()方法>构造代码块>构造方法>局部代码块。其中静态代码块只执行一次。构造代码块和局部代码块再每次创建对象是都会执行。

转载于:https://www.cnblogs.com/tang-hao-/p/11232339.html

夯实Java基础(八)——代码块相关推荐

  1. Java基础——构造代码块

    为什么80%的码农都做不了架构师?>>>    看一段代码先 <!-- lang: java --> public class Test { // public Test ...

  2. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...

  3. 【零基础学Java】—finally代码块(四十七)

    [零基础学Java]-finally代码块(四十七)

  4. java小基础之代码块的霸道

    java小基础之代码块的霸道 1.介绍: 代码块的分类:{} 1.局部代码块:限制代码的作用域 书写位置:在方法中 霸道理由:比方法中的程序先一步被调用 2.构造代码块:在类中方法外, 霸道理由:如果 ...

  5. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  6. 夯实Java基础系列9:深入理解Class类和Object类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 夯实Java基础系列14:深入理解Java枚举类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. 夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

最新文章

  1. php 删除一周前,linux下删除7天前日志的代码(php+shell)
  2. linux上logbok实时日志_日志lombok插件安装及配置
  3. iOS内存管理编程指南
  4. 举例详细说明javascript作用域、闭包原理以及性能问题(转)
  5. Linq 多表连接查询join
  6. netstat -an中state含义
  7. nginx内存池大小快内存_使用直接内存时可以更快
  8. C++工作笔记-for与foreach之间的初步比较(反汇编初步窥探)
  9. 【服务器】创建docker、运行jupyter相关命令
  10. Eclipse引用的jar有对应的工程,「Maven依存关系」中显示对应的工程
  11. JM8.6之get_block() 1/4亮度像素内插详述
  12. HFSS19 官方中文教程系列 L04
  13. Unity+Android GET和POST方式的简单实现API请求(人像动漫化)
  14. 自己动手做Arduino玩具(二)
  15. Mac安装MongoDB
  16. 计算机考试工作表怎么做表格步骤,计算机考试Excel表格中换行的方法
  17. Navicat 图形化界面工具
  18. wsdl和soap协议详细解析
  19. 逻辑漏洞之密码找回漏洞(semcms)
  20. Kali-WIFI攻防(二)----无线网络分析工具Aircrack-ng

热门文章

  1. linux mysql多实例启动_Mysql实例Linux下启动多个mysql服务器例子
  2. exchange无法收发邮件_MAPI session超过Exchange最大限制,邮件发送失败的终极解决方法...
  3. arp协议属于哪一层_ARP的攻击与防御
  4. MapReduce框架下的FP Growth算法概述
  5. python2.7对DICOM图像的读取
  6. concatenation java,Java:StringBufferConcatenation
  7. pta 是否完全二叉搜索树_23.二叉搜索树的后序遍历序列
  8. 相机模型与标定(十四)--误差分析
  9. C语言:编写程序,打开文本文件stu.txt,读出文件内容,将其中的字符‘s’删除,将修改后的内容存到student.txt文件中。
  10. php中result的值,PHP 返回所取得行中字段的值