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中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代 ...
随机推荐
- cursor游标(mysql)
/* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的 ...
- Html5的Web存储和WebSql
HTML5 Web 存储 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是cookies.但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,但是这些数据只用 ...
- Eclipse上安装springsource-tool-suite
spring tool suite 是一个基于eclipseIDE开发环境中的用于开发spring应用程序的工具.提供了开箱即用的环境用于实现,调试和部署你的spring应用,包括为关键的的服务器和云 ...
- ubuntu16 chrome install
1,download chrome.deb from : https://www.google.com/chrome/index.html 2,double click chrome.deb and ...
- CUDA Samples: Ray Tracking
以下CUDA sample是分别用C++和CUDA实现的生成光线跟踪图像,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第六章,CUDA各实现 ...
- ibatis 参数类型为map,map里面有list
<select id="getChannelLayerList" parameterClass="java.util.HashMap" re ...
- [Java]如何为一个自定义类型的List排序。
好吧,三年了,又重拾我的博客了,是因为啥呢,哈哈哈.今天被问到一个题目,当场答不出来,动手动的少了,再此记录下来. Q:有一个MyObject类型的List,MyObject定义如下: class M ...
- Linux 用C语言实现简单的shell(2)
不知不觉两周没有发文了,因为“一万美金的福特奖学金答辩”,ACM比赛,网络论文阅读和网络大作业一大堆事把时间冲散了,所以先写一篇博文补上之前一坑. 之前发了一篇关于linux 用C语言实现简单shel ...
- BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)
题目链接 静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于 ...
- LOJ2321. 「清华集训 2017」无限之环【费用流】
LINK 很好的一道网络里题 首先想插头DP的还是出门左转10分代码吧 然后考虑怎么网络流 首先要保证没有漏水 也就是说每个接口一定要有对应的接口 那么发现每个点只有可能和上下左右四个点产生联通关系 ...