前言:
代码块的知识感觉没啥,不过在静态和非静态的调用时机上要注意一下
普通代码块
- 代码块在实例化对象调用构造函数前执行
public class Main{
public static void main(String[] args) {
Test t1 = new Test(3);
}
}
class Test {
private int age;
//普通代码块
{
System.out.println("hello world!");
}
public Test(int age) {
this.age = age;
System.out.println("调用了构造函数");
}
}
静态代码块
- 在类加载时候执行
public class Main{
public static void main(String[] args) {
Test t1 = new Test(3);
}
}
class Test {
private int age;
//普通代码块
static {
System.out.println("类加载了");
}
{
System.out.println("准备调用构造器了");
}
public Test(int age) {
this.age = age;
System.out.println("调用构造器了");
}
}
个人感觉要注意的点
- 继承的时候:
因为静态的东西一定是在类加载的时候执行的,所以静态代码块也是,而普通代码块是在实例化对象时调用构造器前执行。可以推出执行顺序是这样的:父类静态的东西 ----> 子类静态的东西 ----> 父类普通的东西 -----> 父类构造 ---->子类普通的东西 ----> 子类构造 ,优先级就是普通的东西,和静态的东西谁在上面先调用谁,因为优先级一样
注:普通的东西指 普通代码块和普通属性初始化
静态的东西指 静态代码块和静态属性 初始化
- 静态和普通代码块调用次数的问题
静态的东西,只是加载的时候调用,而类只会加载一次,所以只会执行一次,而普通代码块,是实例化对象的时候调用的,所以实例化一次对象就调用一次
- 静态的代码块里面只能调静态的东西,普通代码块就都可以调
这里的东西和我在final文章里面的个人理解类似:静态的东西在类加载的时候执行,而且只会执行一次,非静态的东西弄进去,他内存都没分配,哪里知道有这个东西
代码块使用场景
观察以下代码可以看到,有两个构造函数,而且每个构造函数里都有一个一样的输出内容。遇到这种类似的情况就可以考虑使用代码块,因为构造器里面那个输出每次都搞一次感觉挺麻烦的,不如弄成代码块,简洁一点。
class Test {
private int a;
private int b;
/* 代码块
{
System.out.println("hello world");
}
*/
public Test(int a)
{
System.out.println("hello world!");
this.a = a;
}
pubilc Test(int a, int b)
{
System.out.println("hello world!");
this.a = a;
this.b = b;
}
}