话不多说直接给出一串代码:
A类,作为父类:
public class A {
static {
System.out.println("A 静态代码块");
}
private static String staticStr = getStaticStr();
private String str = getStr();
{
System.out.println("A 代码块");
}
public A() {
System.out.println("A 构造方法");
}
private static String getStaticStr() {
System.out.println("A 静态方法");
return null;
}
private String getStr() {
System.out.println("A 实例属性初始化");
return null;
}
B类,作为子类:
public class B extends A{
private static String staticStr = getStaticStr();
static {
System.out.println("B 静态代码块");
}
public B(){
System.out.println("B 构造方法");
}
{
System.out.println("B 构造块");
}
private String str = getStr();
private static String getStaticStr(){
System.out.println("B 静态方法");
return null;
}
private String getStr(){
System.out.println("B 方法");
return null;
}
}
main方法:
public static void main(String[] args) {
new B();
new B();
}
结果是什么呢???可以自己尝试一下,给出提示:
- 首先是加载父类的静态块和静态变量,他俩的具体顺序要根据代码的前后顺序去判断。
- 然后是子类的静态块和静态变量。
- 等静态的都执行完了,就可以开始执行父类的构造块、属性和构造方法了,这三个的顺序主要是根据代码的顺序,但是一定要注意的一点,构造方法一定是最后执行的。
- 最后,如果一个类已经被加载过了,那么后面的初始化将不会再加载静态代码块和静态变量
所以最后的结果是这样的:
A 静态代码块
A 静态方法
B 静态方法
B 静态代码块
A 实例属性初始化
A 代码块
A 构造方法
B 构造块
B 方法
B 构造方法
A 实例属性初始化
A 代码块
A 构造方法
B 构造块
B 方法
B 构造方法
网友评论