1.代码块使用场景(为什么会引入代码块)
如果多个构造器中都有重复的语句 ,可以抽取到初始化块中,提高代码的重用性 ,降低代码的耦合度
1)、初始化实例变量;
如果一个类中存在若干个构造函数,这些构造函数都需要对实例变量进行初始化,如果我们直接在构造函数中实例化,必定会产生很多重复代码,繁琐和可读性差。这里我们可以充分利用构造代码块来实现。
2)、初始化实例环境
一个对象必须在适当的场景下才能存在,当该场景的创建过程较为复杂,可以利用构造代码块来创建此场景。
2.代码块的分类
代码块可以分为 普通代码块 和 静态代码块
静态代码块是被 static 修饰的代码块 遵循静态规则
3.个人对代码块的理解
不管调用那个代码块中的对象 ,都会先调用代码块中的内容
代码块相当于另一种形式的构造器(对构造器的补充机制),可以做初始化操作
静态代码块
作用是对类进行初始化 ,它随类的加载而执行 ,并且只会执行一次 ,如果是普通代码块 ,每创建一个对象就执行
4.这就涉及到 类什么时候被加载的问题,那么类什么时候被加载 ?我总结一下几点
1)创建对象实例
2)创建子类实例
3) 使用类的静态成员时 (静态属性 ,静态方法)
那么代码块的加载优先级又是怎么样的呢?
先来代码实现:
public class Hello {
public static void main(String[] args) {
Dog xiaohua = new Dog("小花", 18);
xiaohua.eat();//调用父类方法
xiaohua.eat();//再次调用
}
}
class Animal {
String name ;
public void eat(){ //父类方法
System.out.println( "在吃东西");
}
{ //父类代码块部分
System.out.println("调用执行父类代码块");
}
static{
//父类静态代码块
System.out.println("调用父类静态代码块");
}
}
class Dog extends Animal{
private String name;
private int age ;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
{
//子类代码块部分
System.out.println("调用子类代码块");
}
static{
//子类静态代码块部分
System.out.println("调用子类静态代码块");
}
}
运行结果:
根据以上代码和运行结果我们可以得出一下结论
创建一个对象时,在一个类中调用顺序:
1,调用静态代码块和静态属性初始化(静态代码块和静态属性初始化调用优先级一样 ,如果有多个静态代码块和多个静态变量属性初始化,则按照代码定义顺序执行调用)
2,调用普通代码块和普通属性初始化(普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按照定义顺序执行调用)
3,调用构造方法(构造器)
4,创建一个子类对象时(继承关系),它们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序:
1)父类的静态代码块和静态属性(优先级相同,按定义顺序执行)
2)子类的静态代码块和静态属性(优先级相同,按定义顺序执行)
注:静态代码块只能调用静态成员,普通代码块可以调用任意成员。