代码块是指使用“{}”括起来的一段代码,根据位置不同,代码块可以分为四种:普通代码块、构造块、静态代码块、同步代码块
一.普通代码块
直接定义在方法中的代码块称为普通代码块public class Test1{
public static void main(String args[]){
{ // 普通代码块
int x = 30 ; // 就属于一个局部变量
System.out.println("普通代码块 --> x = " + x) ;
}
int x = 100 ; // 与局部变量名称相同
System.out.println("代码块之外 --> x = " + x) ;
}
};
运行结果:
普通代码块 --> x = 30
代码块之外 --> x = 100
二. 构造块
构造块将代码块直接定义在类中,如下:class Test2{
{ // 直接在类中编写代码块,称为构造块
System.out.println("1、构造块。") ;
}
public Test2(){ // 定义构造方法
System.out.println("2、构造方法。") ;
}
};
public class Test2Main{
public static void main(String args[]){
new Test2() ; // 实例化对象
new Test2() ; // 实例化对象
}
};
运行结果:
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
构造块优先于构造方法执行,且执行多次,只要一有实例化对象产生,就执行构造块中的内容。
三.静态代码块
直接使用static关键字声明就称为静态代码块.
class Test3{
{ // 直接在类中编写代码块,称为构造块
System.out.println("1、构造块。") ;
}
static{ // 使用static,称为静态代码块
System.out.println("0、静态代码块") ;
}
public Test3(){ // 定义构造方法
System.out.println("2、构造方法。") ;
}
};
public class Test3Main{
static{ // 在主方法所在的类中定义静态块
System.out.println("在主方法所在类中定义的代码块") ;
}
public static void main(String args[]){
new Test3() ; // 实例化对象
new Test3() ; // 实例化对象
}
};
运行结果:
在主方法所在类中定义的代码块
0、静态代码块
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
静态块优先于主方法执行,如果在普通类中定义的静态块,优先于构造块执行,不管不多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能就是为静态发生初始化。
四.同步代码块
同步代码块用于多线程中,解决线程同步问题
/*
JAVA对于多线程的安全问题提供了专业的解决方式
就是同步代码块
synchronized(对象)//这个对象可以为任意对象
{
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行
没持有锁的线程即使获取CPU的执行权,也进不去
同步的前提:
1,必须要有两个或者两个以上的线程
2,必须是多个线程使用同一个锁
必须保证同步中只能有一个线程在运行
好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源
*/
class Tick implements Runnable
{
private int tick = 50;
Object obj = new Object();//申请一个对象
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick > 0)
{
//try{Thread.sleep(40);}catch(Exception e){}
System.out.println( Thread.currentThread().getName() + " sail --" + tick--);
}
}
}
}
}
class TickDemo
{
public static void main(String []args)
{
Tick t = new Tick();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}