A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 hx32 于 2013-7-21 12:30 编辑

父类静态代码块,父类构造器,子类静态代码块,父类构造代码块,子类构造函数,子类构造代码块的执行顺序是什么样的啊???
关于这个问题,先是看了置顶的问题归纳贴,得到了大部分解决,但是仍有疑问

  1. <P>public class Test
  2. {
  3.     public static void main(String[] args)  
  4.     {
  5.                  new Student();
  6.         }</P>
  7. <P>}</P>
  8. <P>class Person
  9. {</P>
  10. <P>        static
  11.         {
  12.                 System.out.println("Person static block!");
  13.         }</P>
  14. <P>        {
  15.                 System.out.println("Person 构造代码块执行!");
  16.         }</P>
  17. <P>        public Person()
  18.         {
  19.                 System.out.println("Person 构造函数执行!");
  20.         }
  21. }</P>
  22. <P>class Student extends Person
  23. {
  24.         static
  25.         {
  26.                 System.out.println("Student static block!");
  27.         }</P>
  28. <P>        {
  29.                 System.out.println("Student 构造代码块执行!");
  30.         }</P>
  31. <P>        public Student()
  32.         {
  33.                 //super()默认调用父类不带参数的构造函数
  34.                 System.out.println("Student 构造函数执行!");
  35.         }</P>
  36. <P>
  37. }</P>
  38. <P>//---------- 运行Java程序 ----------
  39. //Person static block!
  40. //Student static block!
  41. //Person 构造代码块执行!
  42. //Person 构造函数执行!
  43. //Student 构造代码块执行!
  44. //Student 构造函数执行!</P>
复制代码
疑问是为什么不是“Student构造代码块”先于“Person构造函数”执行,因为super()默认的调用父类构造函数是在Student的构造函数中调用的啊
在CSDN另一篇帖子中,是这么说的:
构造器初始化顺序如下:
1 基类static成员初始化
2 子类static成员初始化
3 基类对象成员默认初始化(按照声明的顺序)
4 子类成员默认初始化(按照声明的顺序)
5 子类构造函数调用父类构造函数(如果子类构造器中没有显式的调用父类构造函数,那么父类必须提供一个无参构造器供子类调用。如果所有子类构造器中显式调用父类其他的构造函数,那么就不会执行父类默认构造函数,并且编译时不会强制父类提供默认构造函数)
6 子类构造函数执行



评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

3 个回复

倒序浏览

楼主的理解是先主函数进来 看到有student先执行student 再执行其父类?
其实是静态代码块先于主函数执行。
静态代码块定义在类中,随类的加载而执行,优先于主函数执行并且只执行一次,
先执行其父类再执行其子类。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
yangqing 发表于 2013-7-21 08:22
楼主的理解是先主函数进来 看到有student先执行student 再执行其父类?
其实是静态代码块先于主函数执行。 ...

我的问题是,子类调用父类的构造函数和子类的构造代码块之间的顺序
回复 使用道具 举报
hx32 发表于 2013-7-21 12:29
我的问题是,子类调用父类的构造函数和子类的构造代码块之间的顺序

这种情况的前提是 都不是静态的 。。而后调用顺序的问题得看具体代码了把 。。依照主函数的顺序。。先引用父类肯定是父类先。。。如果先出现子类而 子类又是先调用了父类的函数方法就是父类先。。余下就是子类先。。这是我的理解 希望帮到了你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马