所谓代码块是指用{}括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。如果在代码块前加上synchronized关键字,则此代码块就成为同步代码块
什么是代码块
java中被 {} 括起来的代码这部分被称为代码块
代码块的分类
普通代码块(本地代码块)
构造块(实例代码块)
静态块
同步代码块
本片文章就先讲普通代码块,构造快和静态块。而同步代码块一般在多线程种用到,后面写到多线程的时候会说同步代码块,在这就不多说了。代码块还是很简答的,但是有一些要注意的点希望大家记住,接下来我会通过普通代码块,构造快和静态块一起对比来讲解。
普通代码块
普通代码块就是用{}括起来的代码,这部分就是普通代码块,也称本地代码块。举个例子,看下面这段代码:
public class Test {
public static void main(String[] args) {
{
System.out.println("这是普通代码块");
}
}
}
主函数中,输出 “这是普通代码块”这个部分是被{}括起来的部分,并且它的前面没有任何限制条件,这部分就是 普通代码块。当然这种代码块没什么太大的意义,因为没有限制条件,加不加{}它都会执行,所以平时不加{}也可以。
构造块(实例代码块)
实例代码块一般定义在类的内部,方法的外部。看下面这段代码:
class blocks{
public int a;
{
this.a = 1;
System.out.println("这是实例代码块");
}
public class Test {
public static void main(String[] args) {
}
}
而实例代码块和普通代码块非常像,只是位置不同而已,还有一点,实例代码块可以为普通的成员变量进行赋值。
静态代码块
静态成员变量也就是被static修饰的变量的初始化分为两种:就地初始化 和 静态代码块初始化。
就地初始化就是在创建变量的时候就给它进行了赋值。接下来我们来看一下静态代码块初始化,
先来了解一下什么是静态代码块,看一下下面的代码:
class blocks{
static int a ;
static {
a = 1;//对静态的成员变量进行赋值
System.out.println("这是静态代码块");
}
}
public class Test {
public static void main(String[] args) {
}
}
静态代码块就是在普通代码块的前面加了一个static,这就是静态代码块。而我可以在静态代码块里面对静态成员变量进行赋值,静态代码块只能为静态的成员变量进行赋值。
代码块的一些特性
静态代码块不管生成多少个对象,其只会执行一次
如果有多个静态或实例代码块,看定义的顺序
如果没有实例化对象,只会执行静态的
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并
实例代码块只有在创建对象时才会执行
在这给大家讲解一下代码块的特性,看一下下面这段代码:
class Blocks {
public int a;
static int b;
public double c;
public Blocks(){
System.out.println("这是一个不带参数的构造方法");
}
{
this.a = 1;
System.out.println("这是实例代码块");
}
static {
b = 1;
System.out.println("这是静态代码块");
}
}
public class Test {
public static void main(String[] args) {
Blocks blocks = new Blocks();
}
}
我们都知道我们在主函数中创建对象的时候,编译器会调用构造方法,也就是public Blocks这个函数会被执行。那么这段代码的运行结果是什么?是只执行构造方法?还 是从上到下顺序执行?
答案是**静态代码块先执行,然后是实例代码块,最后是构造方法。**运行结果如图所示:
不只是这样,静态代码块在整个程序中,运行且只运行一次。看下面这张图:
这里我在上面代码的基础上又创建了一个对象,除了静态代码块,其它都是执行了两次。剩下的还有一些结论,大家记一下就可以了。
到此这篇关于Java简明解读代码块的应用的文章就介绍到这了,更多相关Java代码块内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Java简明解读代码块的应用
基础教程推荐
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现线程插队的示例代码 2022-09-03
- java基础知识之FileInputStream流的使用 2023-08-11
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- Java并发编程进阶之线程控制篇 2023-03-07
- java实现多人聊天系统 2023-05-19
- Java文件管理操作的知识点整理 2023-05-19
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02