package codeblock;
/**
* @author QinYingjie
* @version 1.0
*/
public class DemoCodeBlock {
public static void main(String[] args) {
// 创建对象是,static代码块被执行
// AA aa = new AA();
// 创建子类对象时父类,子类的static被执行
// BB bb = new BB();
// 使用类的静态成员时(静态属性,静态方法)
System.out.println(Cat.n1);
}
}
class Animal{
static {
System.out.println("Animal静态代码块被执行...");
}
}
class Cat extends Animal{
public static int n1 = 3;
static {
System.out.println("Cat 代码块被执行...");
}
}
class BB extends AA{
static {
System.out.println("BB的静态块被执行...");
}
}
class AA{
static {
System.out.println("AA的静态代码块被执行...");
}
}
//代码块使用注意事项和细节
////1.static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行
////并且只会执行一次,如果是普通代码块,每创建一个对象,就执行。
////2.类什么时候被加载
////(1)创建对象实例时
////(2)创建子类对象实例,父类也会被加载
////(3)使用类的静态成员时(静态属性,静态方法)
////3.普通代码块,在创建对象实例时,会被隐式的调用
////被创建一次,调用一次
////如果只使用类的静态成员时,普通代码块并不会执行
////4.创建一个对象时,在一个类调用顺序是:(重点,难点):
////(1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初
//// 始化调用的优先级一样,如果
//// 有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
////(2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性
//// 的初始化调用的优先级一样,如果有多个普通代码块
//// 和多个普通属性初始化,则按定义顺序调用)
////(3)调用构造方法
//5.构造器的最前面其实隐含了super()和调用普通代码块。
//6.我们看一下创建一个子类(继承关系),他们的静态代码块,静态属性初始化,普通代码块,
//普通属性初始化,构造方法的调用顺序如下:
//(1)父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
//(2)子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
//(3)父类的普通代码块和普通属性初始化
//(4)父类构造方法
//(5)子类的普通代码块和普通属性初始化
//(6)子类的构造方法
//
//7.静态代码块只能直接调用静态成员(静态属性和静态方法),普通成员可以调用任意成员