本帖最后由 hx32 于 2013-7-21 12:30 编辑
父类静态代码块,父类构造器,子类静态代码块,父类构造代码块,子类构造函数,子类构造代码块的执行顺序是什么样的啊???
关于这个问题,先是看了置顶的问题归纳贴,得到了大部分解决,但是仍有疑问
- <P>public class Test
- {
- public static void main(String[] args)
- {
- new Student();
- }</P>
- <P>}</P>
- <P>class Person
- {</P>
- <P> static
- {
- System.out.println("Person static block!");
- }</P>
- <P> {
- System.out.println("Person 构造代码块执行!");
- }</P>
- <P> public Person()
- {
- System.out.println("Person 构造函数执行!");
- }
- }</P>
- <P>class Student extends Person
- {
- static
- {
- System.out.println("Student static block!");
- }</P>
- <P> {
- System.out.println("Student 构造代码块执行!");
- }</P>
- <P> public Student()
- {
- //super()默认调用父类不带参数的构造函数
- System.out.println("Student 构造函数执行!");
- }</P>
- <P>
- }</P>
- <P>//---------- 运行Java程序 ----------
- //Person static block!
- //Student static block!
- //Person 构造代码块执行!
- //Person 构造函数执行!
- //Student 构造代码块执行!
- //Student 构造函数执行!</P>
复制代码 疑问是为什么不是“Student构造代码块”先于“Person构造函数”执行,因为super()默认的调用父类构造函数是在Student的构造函数中调用的啊
在CSDN另一篇帖子中,是这么说的:
构造器初始化顺序如下:
1 基类static成员初始化
2 子类static成员初始化
3 基类对象成员默认初始化(按照声明的顺序)
4 子类成员默认初始化(按照声明的顺序)
5 子类构造函数调用父类构造函数(如果子类构造器中没有显式的调用父类构造函数,那么父类必须提供一个无参构造器供子类调用。如果所有子类构造器中显式调用父类其他的构造函数,那么就不会执行父类默认构造函数,并且编译时不会强制父类提供默认构造函数)
6 子类构造函数执行
|