代码块
1.静态代码块
可以定义多个,优先级一样,按定义顺序执行
随着类加载而执行,只执行一次,执行时机比普通代码块早
static
2.普通代码块
可以定义多个,优先级一样,按定义顺序执行
随着对象创建而执行,提高构造器代码复用性,每次创建对象都会执行
class A extends B{
public A(){
//(1) super()
//(2) 调用本类普通代码块
System.out.println("3");
}
}
{
System.out.println("这里是普通代码块");
}
3.类什么时候被加载
创建对象实例
创建子类对象实例,父类也会被加载
使用类的静态成员时
使用子类静态成员时,父类也会被加载
4.创建对象是的调用顺序
1)父类的静态对象代码块和静态属性
2)子类的静态代码块和静态属性
3)父类的普通代码和普通属性初始化
4)父类的构造方法
5)子类的普通代码块和普通属性初始化
6)子类的构造方法
5.静态代码块只能调用静态成员,普通代码块可以调用任意成员
6.执行 new Test(); 会输出什么
public class Hello {
public static void main(String[] args) {
new Test();
}
}
class Demo {
Demo(String s) {
System.out.println(s);
}
Demo() {
System.out.println("Demo 无参");
}
}
class Test {
Demo demo1 = new Demo("Demo1初始化");
static Demo demo2 = new Demo("demo2初始化");
static {
System.out.println("static块执行");
if (demo2 == null) {
System.out.println("demo2 is null");
}
}
Test() {
System.out.println("Test 无参");
}
}
//demo2初始化
//static块执行
//Demo1初始化
//Test 无参