1、前言
今天我来向大家介绍一下Java中的代码块,虽然在开发中不怎么常用(个人也不是建议使用),但不免也会遇到,有时在看一些jdk源码也会经学看它的身影。代码块本身并不很难理解的概念,所谓的代码块就是指使用“{}”括起来的一段代码,根据位置不同,偌代码块可以分为
普通代码块、
构造块、
静态代码块、
同步代码块4种。
2、普通代码块
简述:普通代码块就是指直接在方法或是语句中定义的代码块
public class CodeDemo {
public static void main(String[] args) {
// 普通代码块
{
int x = 10; // 局部变量
System.out.println("普通代码块---》"+x); //10
}
int x = 100;
System.out.println("代码块之外---》"+x); //100
}
}
从上面的代码,我们可以发现,普通代码块和main方法的优先级是一样的。因为java的从上到下依次执行的,所以当优先级一样的时候,它会按照代码的先后顺序执行。
3、静态代码块
简述:静态代码块是使用static关键字声明的代码
package com.java.test;
/**
* 静态代码块
* StaticBlock
* 创建人:罗祥
* 时间:2018年7月9日-下午12:36:54
* @version 1.0.0
*
*/
public class StaticBlock {
static String str;
//静态代码块
static{
System.out.println("---------静态代码块---------");
str = "哈哈";
System.out.println(str);
//静态代码块中不能调用非静态的属性
// System.out.println(str1); str1 cannot be resolved to a variable
}
public static void main(String[] args){
System.out.println("---------mian方法---------");
String str1 = "呵呵";
//普通代码块
{
System.out.println("---------普通代码块---------");
//普通代码块中可调用静态代码块,也可以调用非静态代码块
System.out.println("在普通代码块中调用静态属性:"+str);
System.out.println("在普通代码块中调用非静态属性:"+str1);
}
}
}
/* 运行结果
---------静态代码块---------
哈哈
---------mian方法---------
---------普通代码块---------
在普通代码块中调用静态属性:哈哈
在普通代码块中调用非静态属性:呵呵
*/
运行结果得知
静态代码块优先于main()方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少对象产生,静态代码只执行一次。
3.1、静态代码块只初始化一次
public class StaticBlock2 {
public static void main(String[] args){
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
}
}
class Demo{
// 静态代码块
static{
System.out.println("---------静态代码块---------");
System.out.println("我是静态代码块");
}
// 构造块
{
System.out.println("我是构造块");
}
}
/* 运行结果
---------静态代码块---------
我是静态代码块
我是构造块
我是构造块
我是构造块
我是构造块
我是构造块
*/
4、构造代码块
简述:构造代码块是直接写在类中的代码块
public class CodeDemo {
public static void main(String[] args) {
new CodeDemo1();
new CodeDemo1();
new CodeDemo1();
}
}
/**
* 构造代码块
* CodeDemo1
* 创建人:罗祥
* 时间:2018年7月9日-下午12:40:57
* @version 1.0.0
*
*/
class CodeDemo1{
// 构造方法
public CodeDemo1() {
System.out.println("构造方法");
}
// 构造块
{
System.out.println("构造代码块是直接写在类中的代码块");
}
}
/* 运行结果
构造代码块是直接写在类中的代码块
构造方法
构造代码块是直接写在类中的代码块
构造方法
构造代码块是直接写在类中的代码块
构造方法
*/
构造块只有在实例化对象的时候才会调用,并且优先于构造方法执行,每次实例化对象时都会执行构造中的代码,会执行多次。
参考资料:
李新华《
Java开发实战经典》