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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 乔叶旭 于 2012-12-3 21:39 编辑

  父类静态代码块,父类构造器,子类静态代码块,父类构造代码块,子类构造函数,子类构造代码块的执行顺序是什么样的啊???

2 个回复

倒序浏览
构造器初始化顺序如下:

1 基类static成员初始化

2 子类static成员初始化

3 基类对象成员默认初始化(按照声明的顺序)

4 子类成员默认初始化(按照声明的顺序)

5 子类构造函数调用父类构造函数(如果子类构造器中没有显式的调用父类构造函数,那么父类必须提供一个无参构造器供子类调用。如果所有子类构造器中显式调用父类其他的构造函数,那么就不会执行父类默认构造函数,并且编译时不会强制父类提供默认构造函数)
6 子类构造函数执行
下面的代码输出结果如下:
Base Static Init
Derived Static Init
BaseInit with args:0
DerivedInit
--------------------
BaseInit with args:1
DerivedInit with args:1
  1. class Puppy{
  2.     public Puppy(String name)
  3.     {
  4.        System.out.println( name);
  5.     }
  6. }
  7. class BaseInit{
  8.     public static Puppy basePuppy = new Puppy("Base Static Init");
  9.     /* Unless every derived class's constructors call base class's constructors
  10.     * explicitly, base class must have a default constructor
  11.     */
  12.     /*
  13.     public BaseInit()
  14.     {
  15.         System.out.println("BaseInit");
  16.     }
  17.     */
  18.     public BaseInit(Integer i)
  19.     {
  20.        System.out.println("BaseInit with args:"+i);
  21.     }
  22. }
  23. class DerivedInit extends BaseInit{
  24.     public static Puppy derivedPuppy= new Puppy("Derived Static Init");
  25.     public DerivedInit()
  26.     {
  27.        /* call base class's constructor explicitly */
  28.        super(0);
  29.        System.out.println("DerivedInit");
  30.     }
  31.     public DerivedInit(Integer i)
  32.     {
  33.        super(i);
  34.        System.out.println("DerivedInit with args:"+i);
  35.     }
  36. }
  37. public class InitOrder {
  38.     public static void main(String args[]){
  39.        DerivedInit derivedInit = new DerivedInit();
  40.        System.out.println("--------------------");
  41.        DerivedInit derivedInit2 = new DerivedInit(1);
  42.     }
  43. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨千里 + 1

查看全部评分

回复 使用道具 举报
Person p = new Person(“zhangsan”,20);
这句话都做了什么事情?
1.        因为new用到了Person .class,所以会先找到Person .class文件并加载到内存中
2.        执行该类中的static代码块,如果有的话,给Person .class类进行初始化
3.        在堆内存中开辟空间,分配内存地址
4.        在堆内存中建立对象的特有属性,并进行默认初始化
5.        对属性进行显示初始化
6.        对对象进行构造代码块初始化
7.        对对象进行对应的构造函数初始化
8.        将内存地址赋给栈内存中的p变量

评分

参与人数 1技术分 +1 收起 理由
杨千里 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马