Java 代码块
一.简介
1.普通代码块:
类中方法的方法体
2.构造代码块:
构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。
3.静态代码块:
用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。
4.同步代码块:
使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。
二.静态代码块和构造代码块的异同点
相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多个,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行。静态代码块只在第一次new时执行一次,之后不在执行。而非静态代码块每new一次就执行一次。
三.演示
1.普通代码块
普通代码块的存在可以将类的生命周期内只调用一次的代码放在一起,程序调用完之后就立即销毁,这样可以节省栈内存,防止栈溢出。
普通代码块执行的顺序是按照排列的先后顺序。
public class Test1 {
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
2.构造代码块
直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
public class Test1 {
{
System.out.println("构造代码块先执行~~~");
}
public Test1() {
System.out.println("构造函数再执行~~~~");
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("普通代码块最后执行~~~");
}
}
运行结果:
构造代码块先执行~~~
构造函数再执行~~~~
普通代码块最后执行~~~
3.静态代码块
在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
public class Test1 {
static String s1 = "cjj"; //静态变量
String s2 = "吹静静"; //普通变量
static{//静态变量
System.out.println("静态代码块最先执行~~~" + s1);
}
{//非静态代码块
System.out.println("构造代码块再执行~~~" + s2);
}
public Test1() {//构造函数
System.out.println("构造函数再执行~~~~");
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("普通代码块最后执行~~~");
}
}
运行结果:
静态代码块最先执行~~~cjj
构造代码块再执行~~~吹静静
构造函数再执行~~~~
普通代码块最后执行~~~
注意:
1.静态代码块不能存在于任何方法体内。
2.静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问
3.在类加载的时候执行一次
4.执行顺序:父类静态 -> 子类静态 -> 父类非静态 -> 父类的构造方法 -> 子类非静态 -> 子类的构造方法
原理:
类在加载阶段,由于 i 处于一个标记值状态,所以实际上是无值的,所以此时不允许直接操作
static int i = 5;
{
i = 7;
}
先将静态变量 i 放入方法区,并且标记一个值为0;在初始化阶段,再检查 i 是否有初值,如果没有初值,则将标记值0赋值进去;如果有初始值,则将初始值设置进去。然后顺次执行静态代码块,将静态变量 i 的值改为7。
static{
i = 7;
}
static int i = 5;
先将静态变量 i 放入方法区,并且标记一个值为0;在初始化阶段,先执行静态代码块,对于 i = 7;并不是将7直接赋值给 i 而是将标记值改为7;初始化静态变量 i ;检查 i 是否有初始值,如果没有初始值,则将标记值7赋值进去;如果有初始值则抛弃标记值,将5赋值进去。
Java 代码块的更多相关文章
- Java代码块详解
Java中代码块指的是用 {} 包围的代码集合,分为4种:普通代码块,静态代码块,同步代码块,构造代码块 普通代码块: 定义:在方法.循环.判断等语句中出现的代码块 修饰:只能用标签修饰 位置:普通代 ...
- java代码块的理解
最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...
- java代码块执行顺序
父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 夯实Java基础系列7:Java 代码块和执行顺序
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- Java 代码块详解
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 注:本文原链接:https://www.cnblogs.com/chloneda/p/java-c ...
- java代码块 静态、非静态
Java虚拟机的内存分区:Java栈.堆.方法区.本地方法栈.PC寄存器.还有一个常量池的概念,虚拟机会为每种类型分配一个常量池,而不是实例. 例如有一个类有很多子类,那么在父类定义的final变量, ...
- Java——代码块
前言 在程序编写之中可以直接使用{...}定义的一段语句就是代码块.根据代码块的位置以及关键字的不同可以分为4种:普通代码块.构造块.静态块以及同步代码块(多线程相关).下面将先介绍前3种以及Java ...
- 08-02 Java 代码块,代码块执行的先后顺序问题
代码块 /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代 ...
随机推荐
- 配置django上传文件目录的http访问
1.假设你的html模版文件使用以下路径来访问上传文件内容: url="{{ MEDIA_URL }}{{ images.image }}" 2.设置settings文件: MED ...
- _routing字段介绍
一个document通过以下公式被路由到该索引下一个特定的分片: shard_num = hash(_routing) % num_primary_shards _routing的默认值是文档的_id ...
- L167
- word-break:break-all 打散文字,强制对齐
- NodeJs 基础知识
1.网站 http://nodejs.cn/ 下载最新NodeJs并且安装2. 你可以输入一个新命令“node”.使用该“node”命令有两种不同的方法.第一种不带任何参数,将打开一个交互式Shell ...
- mongodb 使用
一.下载 MongoDB的官网是:http://www.mongodb.org/ MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloa ...
- ios图标生成器网址 插件禁用后,可以选择这个
1. 可以使用在线移动图标生成工具:图标工场http://icon.wuruihong.com/网站自动生成iOS所需的所有对应格式的图标 2. 如果直接选择iOS,会自动生成29pt.40pt.50 ...
- HTML编写规范
HTML和CSS编码规范内容 一.HTML规范 二.CSS规范 三.注意事项: 四.常用的命名规则 五.CSS样式表文件命名 六.文件命名规则 一.HTML规范: 1.代码规范 页面的第一行添加标准模 ...
- openvpn搭建笔记
#整理openvpn安装 #1安装上传/下载软件 yum -y install openssh-clients lrzsz #2更新时间 yum -y install ntpdatentpdate t ...
- WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式.然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当 ...