代码块分类
普通代码块
普通代码块就是在方法后面使用"{}"括起来的代码片段,不能单独执行,必须调用其方法名才可以执行.
构造代码块
在类中没与任何的前缀或后缀,并使用"{}"括起来的代码片段.
public class Student{
{
System.out.println("this is a 构造代码块");
}
public Student(){
System.out.println("this is a 构造无参方法");
}
public Student(String stuName){
System.out.println("this is student name is"+stuName);
System.out.println("this is a 构造有参方法");
}
}
处理方式:
编译器在执行时,构造代码块和构造方法是以整体的形式执行的,会在执行每一个构造方法之前先执行构造代码块中的内容。
即:在编译器中执行时是这样的形式:
public class Student{
public Student(){
System.out.println("this is a 构造代码块");
System.out.println("this is a 构造无参方法");
}
public Student(String stuName){
System.out.println("this is a 构造代码块");
System.out.println("this is student name is"+stuName);
System.out.println("this is a 构造有参方法");
}
}
类似于将构造代码块拼接在了构造方法中。
静态代码块
静态代码块是:执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。
如果父类和子类中同时存在静态代码块,编译器会优先执行父类的静态代码块然后再执行子类的静态代码块。
静态代码块是在类加载时就执行加载的,所以如果是main方法所在的类中有静态代码块的话,其执行会在main方法执行前。
同步代码块
同步代码块是什么?
同步代码块就是在多线程程序中被加上synchronized锁的一段程序,也就是为代码块中的代码加上了锁,另其在多线程中排队执行。
synchronized(对象){
//可能会发生线程安全问题的代码
}
//这里的对象可以是任意对象,我们可以用 Object obj = new Object()里面的obj放入括号中
其中,obj 称为同步监视器,也就是锁,原理是:当线程开始执行同步代码块前,必须先获得对同步代码块的锁定。并且任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。
其中的锁,在非静态方法中可为this,在静态方法中为当前类本身(例如单例模式的懒汉式:Singleton.class)
// 单例模式 - 懒汉式
class Singleton {
private Singleton() {
}
private static Singleton s = null;
private static Singleton getInstance() {
if (s == null) {
synchronized (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
}