定义:代码块是用 {} 定义的一段代码
分类:(根据代码块定义的位置以及关键字分)普通代码块、构造块、静态块、同步代码块
1.普通代码块
普通代码块是定义在方法中的代码块
举例:
package com.wl;
public class Test {
public static void main(String[] args) {
//直接使用{}定义一个普通的代码块
{
int a=2;
System.out.println("a = "+a);
}
int a=20;
System.out.println("a = "+a);
}
}
运行结果:
通过上述的代码举例,我们可以了解到,使用普通代码块可以用来解决变量重名问题。
2.构造块
构造块是定义在类中的代码块,不加修饰符
举例:
package com.wl;
class Test{
//定义在Test类中,不加任何修饰符-->构造块
{
System.out.println("1.Test类的构造块");
}
public Test(){
System.out.println("2.Test类的构造方法");
}
}
public class Test1{
public static void main(String[] args) {
new Test();
new Test();
}
}
运行结果:
修改代码如下:
package com.wl;
class Test{
//定义在Test类中,不加任何修饰符-->构造块
{
System.out.println("1.Test类的构造块");
}
public Test(){
System.out.println("2.Test类的构造方法");
}
}
public class Test1{
public static void main(String[] args) {
new Test();
//new Test();
}
}
运行结果:
通过对上面两段代码的观察,得出如下结论:
- 构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块 ;
- 构造块可以进行简单的逻辑操作(在调用构造方法之前)。
3.静态块
按照静态块所在的类不同进行分类:
- 在非主类中
- 在主类中
3.1在非主类中的静态块
举例:
package com.wl;
class Test{
//定义在类中,不加修饰符-->构造块
{
System.out.println("1.Test类的构造块");
}
public Test(){
System.out.println("2.Test类的构造方法");
}
//定义在非主类中的静态块
static {
System.out.println("3.Test类的静态块");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println("--------hello---------");
new Test();
new Test();
new Test();
System.out.println("--------world---------");
}
}
运行结果:
3.2在主类中的静态块
举例:
package com.wl;
class Test{
//定义在类中,不加修饰符-->构造块
{
System.out.println("1.Test类的构造块");
}
public Test(){
System.out.println("2.Test类的构造方法");
}
//定义在非主类中的静态块
static {
System.out.println("3.定义在非主类中的静态块");
}
}
public class Test1 {
//定义在主类中的静态块
static{
System.out.println("4.定义在主类中的静态块");
}
public static void main(String[] args) {
System.out.println("--------hello---------");
new Test();
new Test();
new Test();
System.out.println("--------world---------");
}
}
运行结果:
通过对在非主类中的静态块和在主类中的静态块代码的比较,得出以下结论:
- 在非主类中静态块优先于构造块执行;
- 在主类中静态块优先于主方法执行;
- 无论产生多少实例化对象,静态块只执行一次;
- 静态块的主要作用是为static属性进行初始化。
4.同步代码块
可以解决多线程的安全问题