一、代码块的分类:
1.普通代码块
2.构造快
3.静态块
4.同步代码块
二、代码块的使用
1、普通代码块:定义在方法中的代码块
如:
public class Test{
public static void main(String[]args){
{//直接使用{}定义,普通方法块
int x=10;
System.out.println("x="+x);
}
int x=100;
System.out.println("x="+x);
}
}
2、构造块
构造快:定义在类中的代码块(不加修饰符)。
如:
class Person{
{//定义在类中,不加任何修饰符,构造块
System.out.println("1.Person类的构造块");
}
public Person(){
System.out.println("2.Person类的构造方法");
}
}
public classTest{
public static void main(String[]args){
newPerson();
newPerson();
}
}
3、静态代码块(重点)
静态代码块:使用static定义的代码块。
根据静态块所在的类的不同又可分为以下两种类型:1.在非主类中;2.在主类中。
4、同步代码块
使用synchronized(object){ }进行修饰,在调用该代码块时,需要获得内置锁,否则就处于阻塞状态
如:
synchronized(object){
//内容
}
三、阿里校招笔试题
class HelloA{
//构造方法
public HelloA(){
System.out.println("HelloA!父类构造方法");
}
//非静态代码块
{
System.out.println("i'mAclass.父类非静态代码块");
}
//静态代码块
static{
System.out.println("staticA父类静态代码块");
}
}
class HelloB extends HelloA{
//构造方法
public HelloB(){
System.out.println("HelloB!构造方法");
}
//非静态代码块
{
System.out.println("i'mBclass.非静态代码块");
}
//静态代码块
static{
System.out.println("staticB静态代码块");
}
}
public class Test1{
public static void main(String[]args){
System.out.println("---start---");
new HelloB();
new HelloB();
System.out.println("---end---");
}
}
执行结果如下:
---start---
staticA父类静态代码块
staticB静态代码块
i'mAclass.父类非静态代码块
HelloA!父类构造方法
i'mBclass.非静态代码块
HelloB!构造方法
i'mAclass.父类非静态代码块
HelloA!父类构造方法
i'mBclass.非静态代码块
HelloB!构造方法
---end---
总结:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。
总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。