1. 程式人生 > >java程式的執行順序

java程式的執行順序

筆試的時候發現這樣一道題,發現自己對於java的一些基礎還是有所欠缺,於是在筆試後專門自己動手實現了下。
import java.util.*;

class helloA{
	public helloA(){
	System.out.println("helloA");
	}
	{
	System.out.println(" I am  class A");
	}
	static{
		System.out.println(" static A");
	}
}
public final class helloB extends helloA{
	public helloB(){
	System.out.println("helloB");
	}
	{
	System.out.println(" I am  class B");
	}
	static{
		System.out.println(" static B");
	}
	public static void main(String args[]){
		helloB b;
		helloB a;
		helloB c;
	   new helloB();
	}
}

程式執行結果是:

static A
static B
I am  class A
helloA
I am  class B
helloB
也就是說,執行順序是
  1.    父類靜態塊
  2.    自身靜態塊
  3.    父類塊
  4.    父類構造器
  5.    自身塊
  6.    自身構造器 
上網搜了一下,網上也有不少這類的文章,關於這個執行順序還有一篇文章降到了賦值的順序,這裡也一併給出:
class Dog {  
    public String type="父類成員變數賦的值";  
    public Dog() {  
        System.out.println("父類構造器--type-->"+type);  
        type="父類構造器賦的值";  
                   System.out.println("父類構造器----type--->"+type);  
    }  
      
    {  
        System.out.println("block---type--->"+type);  
        type="父類塊賦的值";  
    }  
}  
public class Mastiff extends Dog {  
    public String type="成員變數賦的值";  
    public Mastiff() {  
        System.out.println("構造器---type--->"+type);  
        type="構造器賦的值";  
    }  
      
    public void say(){  
        System.out.println("say---type---->"+type);  
    }  
  
    {  
        System.out.println("block---type--->"+type);  
        type="塊賦的值";  
          
    }  
      
    public static void  main(String[] args){  
        Mastiff mastiff=new Mastiff();  
        mastiff.say();
    }  
}  
執行結果是:
block---type--->父類成員變數賦的值
父類構造器--type-->父類塊賦的值
父類構造器----type--->父類構造器賦的值
block---type--->成員變數賦的值
構造器---type--->塊賦的值
say---type---->構造器賦的值

也就是說賦值順序是:
  1. 父類成員變數賦值
  2. 父類塊賦值
  3. 父類構造器賦值
  4. 自身成員變數賦值
  5. 自身塊賦值
  6. 自身構造器賦值
結合我們前面說的程式中的執行順序,這個顯然是很好理解的:
1.成員變數賦值>>>塊賦值>>>構造器賦值
2.父類的塊>>父類構造器>>自身塊>>自身構造器
又因為一個成員變數是不可能在靜態變數中賦值的,而且又前面程式執行順序可知      靜態塊>>塊 所以,程式的賦值步驟為
  1. 父類的靜態變數賦值
  2. 自身的靜態變數賦值
  3. 父類成員變數賦值
  4. 父類塊賦值
  5. 父類構造器賦值
  6. 自身成員變數賦值
  7. 自身塊賦值
  8. 自身構造器賦值