一、代码块的作用:对类和对象的信息进行赋值
二、分类:静态代码块和非静态代码块
三、静态代码块 vs 非静态代码块
静态代码块:
>内部可以输出语句
>随着类的加载而执行,而且只执行一次。
>初始化类的信息。
>如果一个类中有多个静态代码块,则按照声明的顺序进行执行。
>静态代码块的执行要优先于非静态代码块。
>静态代码块可以调用静态属性及方法,不能调用非静态属性及方法
非静态代码块:
>内部可以输出语句
>随着对象的加载而执行
>每创建一个对象,就执行一次非静态代码块。
>作用:在创建对象过程中,对对象的属性等进行初始化。
>如果一个类中有多个非静态代码块,则按照声明的顺序进行执行。
>非静态代码块可以调用非静态属性、方法及静态属性、方法
格式:
class Person{
//属性
String name;
int age;
static String desc = "我是一个人";
//构造器
public Person(){
}
public void eat(){
System.out.println("吃饭");
}
//第一种static修饰的代码块
static {
System.out.println("hello,static block-2");
}
static {
System.out.println("hello,static block-1");
//静态代码块不能调用非静态属性及方法
// eat();
// name = "tom";
//静态代码块可以调用静态属性及方法
desc = "我是一个爱学习的人!";
info();
}
//第二种,不用static修饰的代码块
{
System.out.println("hello,block-2");
}
{
System.out.println("hello,block-1");
//非静态代码块可以调用非静态属性、方法及静态属性、方法
age = 1;
name = "Tom";
info();
System.out.println(desc);
}
}
四、实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序:
父类静态代码块、子类静态代码块、父类非静态代码块、父类构造器、子类非静态代码块、子类构造器依次加载。
总结:由父及子,静态先行!
五、Java中对属性进行赋值操作的位置:
①默认初始化
②显式初始化
③构造器中初始化
④通过对象进行“对象.属性”或“对象.方法”赋值
⑤代码块中赋值
执行顺序:① - ②/⑤ - ③ - ④