文章目录
- 一、代码块
- 静态代码块
- 非静态代码块
- 注意
- 总结:由父及子,静态先行
- 属性赋值总结
一、代码块
1、代码块的作用:用来初始化类、对象
2、代码块如果有修饰的话,只能使用static
3、分类:静态代码块 vs 非静态代码块
静态代码块
1、内部可以有输出语句
2、随着类的加载而执行,而且只执行一次
3、作用:初始化类的信息
4、如果在一个类中定义了多个静态的代码块,按声明的先后顺序执行
5、静态代码块的执行优于非静态代码块的执行
6、静态代码块内只能调用静态的属性或方法,不能调用非静态结构
非静态代码块
1、内部可以有输出语句
2、随着对象的创建而执行,而且每创建一个对象就执行一次
3、作用:可以在创建对象时,对对象的属性进行初始化
4、如果在一个类中定义了多个非静态的代码块,按声明的先后顺序执行
5、非静态代码块内可以调用静态的属性或方法,也可以调用非静态结构
注意
第一点
public class MainTest {
public static void main(String[] args) {
System.out.println(Person.name);//LiMIng
Person p=new Person();
System.out.println(p.name);//Liming1
}
}
class Person{
static String name="黎明";
static{
name="LiMIng";
}
{
name="Liming1";
}
}
这里的误区是:虽然在Person中的name是static的,但是在class Person的非静态代码块中又对static的属性name进行了修改,而在创建对象p后会直接执行非静态代码块,因此此时的name是改后的值。
static修饰的属性或方法不是说是一个固定的值,不能进行修改,而是说每个创建的对象得知都是相同的,且都是修改后的值。不要认为不能修改!
第二点
这里的是错误的,对属性的赋值只能是显式赋值,或者在方法、代码块等结构中中进行修改。
第三点
main也是一个静态方法,方法执行前也需要先加载类,所以在main执行前,也会先执行代码中的类中定义的静态代码块
总结:由父及子,静态先行
属性赋值总结
①默认初始化
②显式初始化
③构造器初始化
④调用对象.属性或对象.方法
⑤代码块中赋值
顺序:1 - 2或5 - 3 - 4
2或5的意思是,看类中这两个的先后顺序,谁先写的,谁就先执行