为了探讨类在创建时,类成员的加载顺序,创建两个类:Animal类和Person类,其中Person 类继承Animal 类。Person类中重写了Animal类中的大部分方法。
注意,但我们在程序块中调用eat方法时,父类中调用的是eat方法,而子类却重新定义了一个Peat方法。这是因为如果在子类中重写eat后,父类中程序块中的this.eat就只能调用到子类中的eat方法,而无法调用自己本身的eat方法。具体原因见类的加载机制:https://blog.csdn.net/monologuezjp/article/details/98846720
建立一个测试类,用来创建上述两个类的对象。
执行的结果如下:
从代码的执行结果来看,可以清晰的看出类的加载顺序:
1、加载父类
2、父类产生自己的静态空间 加载顺序:属性-->方法--> 块--> 执行
执行输出静态块中的代码
3、加载子类
4、子类产生自己的静态空间
执行静态块中的代码
------------------------------------------
5、开辟对象空间 产生对象前先加载静态属性、方法、块(从这里可以理解为什么静态元素不能调用非静态元素,以及为什么静态元素只能用类名.元素名的方式调用了。)
6、加载父类的非静态成员 属性 方法 块 构造方法
7、 执行块的代码,执行构造方法
8、加载子类的非静态成员
9、执行子类的块、构造方法
10、将对象空间的地址引用交给 变量来存储
用图的形式展示这个过程: