JAVA中一般来说顺序如下:
父类静态代码->子类静态代码->父类变量初始化(构造代码块,注意覆盖字段)->子类变量初始化(构造代码块)->父类构造函数->子类构造函数
public class Print {
Print(Object s){
System.out.print(s+" ");
}
}
public class A {
public static Print A_sv1 = new Print("A_sv1"); //1
public Print A_cv1 = new Print("A_cv1");//3
public int num = 66;//初始化
public int num2 = 88;//初始化
A(){
new Print("A_s");//4
show();
}
public void show(){//show被子类重载,执行子类的
new Print(num);//8、打印66
new Print(num2);//9、打印88
}
}
public class B extends A {
public static Print B_sv1 = new Print("B_sv1"); //2
public Print B_cv1 = new Print("B_cv1");
public int num = 99;
B() {
new Print("B_s");//10
new Print(num);//11、子类num完成初始化,打印99
}
public void show() {
new Print(num);//5、num被子类覆盖此时还未初始化0,值为0
new Print(num2);//6、打印子类里的88
super.show();//执行父类的
}
}
class Test {
public static void main(String[] args) {
B b = new B();
System.out.println();
System.out.println("-----------------------------");
B b2 = new B();
}
}
可以先尝试下自己判断下内容。
这里为实例的打印结果:
A_sv1 B_sv1 A_cv1 A_s 0 88 66 88 B_cv1 B_s 99
-----------------------------
A_cv1 A_s 0 88 66 88 B_cv1 B_s 99
需要说明的是0 88 66 88这里的打印,主要是在执行父类的构造函数中,调用了show方法,但show方法被子类重载,所以进行到子类的show方法里,但此时num被覆盖且未完成初始化,所以为0;而子类中又显示调用了父类的show,父类中的num则是完成了初始化的,所以为66。
你答对了吗???
留言与评论(共有 0 条评论) “” |