此为大牛写好后,我转载过来的,内容包括多位大牛对java中程序执行顺序的思考!
- * 几大原则
- * 一、静态成员变量(Static)
- * 1、静态成员变量为类变量,所有对象共享同一内存空间
- * 2、静态成员变量的声明和定义仅在首次加载类时执行一次
- * 3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值
- * 二、静态初始块
- * 1、静态初始化块仅在首次加载类时执行一次
- * ······多个静态成员变量与静态始化快参照出现顺序先后执行······
- * 三、动态成员变量
- * 1、动态成员变量定义在每次实例化对象时在构造函数之前执行
- * 四、动态初始化块
- * 1、动态初始化块在每次实例化对象时在构造函数之前执行
- * ······多个动态成员变量与动态初始化块参照出现顺序先后执行······
- * 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行
- * 1、按照出现顺序先后执行静态成员变量定义与静态初始化块
- * 2、按照出现顺序先后执行动态成员变量定义与动态初始化块
- * 3、执行构造函数
- * 再次实例化对象时只执行第2、3步即可
- *
- * ············成员变量与定义与初始化块先于构造函数执行·········
- * 五、当涉及到继承时,按照如下顺序执行
- * 1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块
- * 2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法
- * 3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法
- * 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法
一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。
二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。
三、按声明顺序将成员引用对象变量初始化。
四、最后调用自身的构造方法。
下面以一个例子来说明代码如下:
1. class Animal{
2. String name;
3. Animal() {
4. "class Animal");
5. }
6. Animal(String name){
7. this.name = name;
8. " class Animal");
9. printNumber();
10. }
11.
12. public void printNumber(){
13.
14. }
15. }
16.
17. class Fish extends Animal{
18. Fish() {
19. "class Fish");
20. }
21. }
22.
23. class GoldFish extends Fish {
24. GoldFish() {
25. "class GoldFish");
26. }
27. }
28.
29. class Cat {
30. Cat(){
31. "class cat");
32. }
33. }
34.
35. class Rabbit {
36. private static int number;
37. private static Cat cat = new Cat();
38. public Rabbit() {
39. number++;
40. "class rabbit");
41. }
42. }
43.
44. class Dog extends Animal{
45. public int dogNumber;
46. private GoldFish goldFish = new GoldFish();
47. static Rabbit blackRabbit = new Rabbit();
48. static Rabbit whiterabbit = new Rabbit();
49.
50. public Dog() {
51. super("Tom");
52. "class Dog");
53. 10;
54. "The dog's number is:" + dogNumber);
55. }
56.
57. public void printNumber(){
58. "The dog's number is:" + dogNumber);
59. }
60. }
61.
62. public class TestInheritanceConstructor extends Animal {
63. public static void main(String[] args){
64. new Dog(); //Test the executive order of constructor
65. }
66. }
67. 执行结果:
class cat
1class rabbit
2class rabbit
Tom class Animal
The dog's number is:0
class Animal
class Fish
class GoldFish
class Dog
The dog's number is:10
解释:
输出:class cat 是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第 一句。
输出:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。
输出:Tomclass Animal 执行父类的构造函数,因为用super("")。
输出:The dog's number is:0 可以看出子类的dogNumber还是默认值0
输出:class Animal 和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。
输出:class Dog 和The dog's number is:10是执行自己的构造函数。