实践:
public class AB {
public static void main(String[] args) throws InterruptedException {
new B().b();//结论1
// B.b();//结论2
/* for(int i=0;i<10;i++){ //结论3
Thread.sleep(2000);
new A();
System.out.println("==============");
}*/
}
}
class A{
private static int i=0;
private static int j=0;
private static int z=0;
//构造方法
public A(){
System.out.println(z++);
System.out.println("父级构造");
}
//普通代码块
{ System.out.println(j++);
System.out.println("父级{}");
}
//静态代码块
static{
System.out.println(i++);
System.out.println("父级static");
}
}
class B extends A{
//普通方法
public static void b(){
System.out.println("子函数");
}
//构造方法
public B(){
System.out.println("子构造");
}
//普通代码块
{
System.out.println("子{}");
}
//静态代码块
static{
System.out.println("子static");
}
}
使用 new B().b();,输出结果:(无论顺序怎么换)
- 父级static
- 子static
- 父级{}
- 父级构造
- 子{}
- 子构造
- 子函数
结论1:【父static块 】> 【子static块】> 【父{}】> 【父构造】> 【子{} 】> 【子构造】>【调用普通方法】
使用 B.b();执行,输出结果:(直接使用类调用方法)
- 父级static
- 子static
- 子函数
结论2:静态代码块,在类加载的时候已经执,而构造代码块和构造方法是在 new 对象的时候才执行。
使用 for(...){...}执行,输出结果:(加Thread.sleep是为了易于观察结果)
- 0
- 父级static
- 0
- 父级{}
- 0
- 父级构造
- ==============
- 1
- 父级{}
- 1
- 父级构造
- ==============
结论3:当类被载入时,静态代码块被执行,且只被执行一次