在继承中代码的执行顺序为:1.父类静态对象和静态代码块 2.子类静态对象和静态代码块函数
3.父类非静态对象和非静态代码块 4.父类构造函数spa
5.子类非静态对象和非静态代码块 6.子类构造函数code
1.对于本题来讲:在只想new Sub(5)的时候,父类先初始化了 int flag = 1,而后执行父类的构造函数Super(),父类构造函数中执行的test()方法,因子类是重写了test()方法的,所以父类构造函数中的test()方法实际执行的是子类的test()方法,因此输出为Sub.test() flag=1,接着执行子类构造函数Sub(5) 将flag赋值为5,所以输出结果Sub.Sub() flag=5。最终选择了A:Sub.test() flag=1 Sub.Sub() flag=5对象
public class Demo {
class Super {
int flag=1; ①父类非静态对象 Super(){ ②父类构造函数 test(); ③子类是重写了test()方法的,所以父类构造函数中的test()方法实际执行的是子类的test()方法 }
void test(){ System.out.println("Super.test() flag="+flag); } }
class Sub extends Super { Sub(int i){ ④子类构造函数
flag=i; System.out.println("Sub.Sub()flag="+flag); }
void test(){ ③ System.out.println("Sub.test()flag="+flag); } }
public static void main(String[] args) {
new Demo().new Sub(5); } }
2.初始化类的时候,首先在其余任何事物发生以前,将分配给对象的存储空间初始化为二进制的0。因此加载时,对t1初始化为null,对static静态块作了初步的初始化,可是还未执行里面的代码。而后按照静态变量的初始化顺序,首先对t1进行具体的初始化,因为static静态块已经进行了初步的初始化,因此这时候是直接跳过这里的,因此首先输出 blockA,而后初始化t1后,执行到static静态块以后,再执行里面的内容,因此输出blockB,最后执行普通的初始化块blockA. blockAblockBblockAblog
类中静态块按照声明顺序执行,而且(1)和(2)不须要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)继承
执行顺序优先级:静态块>main()>构造块>构造方法
class
public class Test { public static Test t1 = new Test(); ① { System.out.println("blockA"); } static { System.out.println("blockB"); ② } public static void main(String[] args) { Test t2 = new Test(); ③ } }