Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序

执行顺序的规则:

一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。

二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。

三、按声明顺序将成员引用对象变量初始化。

四、最后调用自身的构造方法。

五、同一个类中的static代码块,代码块,构造函数的执行顺序此顺序执行,static代码块与代码块的区别是static代码块只执行一次。

 

下面以一个例子来说明代码如下:

package com.dxz;

class Animal {
    String name;

    Animal() {
        System.out.println("class Animal default construct");
    }

    Animal(String name) {
        this.name = name;
        System.out.println(name + " class Animal construct");
        printNumber();
    }

    public void printNumber() {

    }
}
package com.dxz;

public class Fish extends Animal {
    Fish() {  
        System.out.println("class Fish");  
    }
}

package com.dxz;

public class GoldFish extends Fish {
    GoldFish() {  
        System.out.println("class GoldFish");  
    }  
}

package com.dxz;

public class Cat {
    Cat(){  
        System.out.println("class cat");  
    }
}


package com.dxz;

public class Rabbit {
    private static int number;
    private static Cat cat = new Cat();//静态成员先执行
    
    public Rabbit() {  
        number++;  
        System.out.println(number + "class rabbit");  
    }
    
    static {
        System.out.println("static Rabbit");
    }
    
    {
        System.out.println("I'm a Rabbit");
    }
}
package com.dxz;

public class Dog extends Animal {
    public int dogNumber;  
    private GoldFish goldFish = new GoldFish();  
    static  Rabbit blackRabbit = new Rabbit();   
    static  Rabbit whiterabbit = new Rabbit();   
      
    public Dog() {
        super("super Tom");  
        System.out.println("class Dog");  
        dogNumber = 10;  
        System.out.println("The dog's number is:" + dogNumber);  
    }  
      
    public void printNumber(){  
        System.out.println("The dog's number is:" + dogNumber);  
    }  
}
package com.dxz;

public class TestInheritanceConstructor extends Animal {
    public static void main(String[] args){ 
        System.out.println("---------------begin---------");
        new Dog(); 
    }  
}

//结果:
1:---------------begin---------
2:class cat 
3:static Rabbit
4:I'm a Rabbit
5:1class rabbit
6:I'm a Rabbit
7:2class rabbit
8:super Tom class Animal construct
9:The dog's number is:0
10:class Animal default construct
11:class Fish
12:class GoldFish
13:class Dog
14:The dog's number is:10

解释:

输出第2行:class cat  是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第一句。

输出第5、7行:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。

输出第3、4、5、6、7行:同一个类中static代码块,代码块,构造函数的执行顺序及static代码块只执行一次。验证第五句。

输出第8行:super Tom class Animal construct 执行父类的构造函数,因为用super("")。

输出第9行:The dog's number is:0 可以看出子类的dogNumber还是默认值0

输出第10、11、12行:class Animal default construct和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。

输出第13、14行:class Dog  和The dog's number is:10是执行自己的构造函数。

posted on 2012-12-07 10:16  duanxz  阅读(1288)  评论(0编辑  收藏  举报