2012-03-15 20 views
1

「任何人都可以解釋我執行流程的下列java代碼??」 對不起,我誤導性陳述......我的問題是...解釋下列java程序的執行流程

Main b = new Main(); 

控制進入A類建築工,那麼控制直接轉到類主要的覆蓋方法

public void PrintFields() { 
    System.out.println("x = "+x+" y = "+y); 
} 

爲什麼編譯不會給出錯誤,因爲x和y不會被創建.. !!我只對此感到困惑。

什麼時候x和y會在內存中創建並且它的初始化發生?是當控制達到Main類中的以下語句時創建的x和y?

int x = 1; 
int y; 

代碼:

class A 
{ 
    public A() { 
     PrintFields(); 
    } 
    public void PrintFields() {} 
} 
class Main extends A 
{ 
    int x = 1; 
    int y; 
    public Main() { 
     y = -1; 
     PrintFields(); 
    } 
    public void PrintFields() { 
     System.out.println("x = "+x+" y = "+y); 
    } 
} 
class Test 
{ 
    public static void main(String[] args) { 
     Main b = new Main(); 
    } 
} 

輸出:

run: 
x = 0 y = 0 //why 0 0 ? 
x = 1 y = -1 // why 1 -1 ? 
BUILD SUCCESSFUL (total time: 0 seconds) 

謝謝。

+7

有這個東西叫做調試...... – 2012-03-15 06:08:33

+2

請不下來..投票不告訴你的問題.. – hardik 2012-03-15 06:08:52

+0

Hardik這個論壇來回答你解決不了的問題,簡單地提到使用調試器或做sysouts和你會了解這個流程。 – 2012-03-15 06:15:06

回答

5
Main b = new Main(); 

控制進入A類建築工,然後調用類的主要

public void PrintFields() { 
    System.out.println("x = "+x+" y = "+y); 
} 

的覆蓋方法此時x和y的默認值

so x=0, y=0 

現在控制來到

int x = 1; 
int y; 
public Main() { 
    y = -1; 
    PrintFields(); 
} 

然後

public void PrintFields() { 
    System.out.println("x = "+x+" y = "+y); 
} 

此時的x = 1且y = -1

所以輸出是

x=1, y=-1 
+0

非常瞭解! – Rakesh 2012-03-15 06:21:17

3

的流程如下:

  • main呼叫new Main()
  • Main()構造函數隱式調用A()作爲第一件事。
  • A()來電PrintFields()。但是,由於此方法被覆蓋,實際執行的是Main.PrintFields()。這會打印第一行x = 0 y = 0,因爲xy字段具有默認值。
  • A()完成後,Main()構造函數繼續執行。它初始化了xy。 (請注意,int x = 1;分配部分後才A()完成執行。)Main()然後調用PrintFields()再次執行並打印的xy(現在初始化)值。

的這一切是如何工作的描述可以在Java Language Specification (§12.5)找到。

+0

Thanx爲答案,我的觀點是當控制進入重寫方法並打印「x = 0,y = 0」但x和y尚未創建,因此它如何顯示「x = 0,y = 0」。 – hardik 2012-03-15 06:34:28

+0

@Hardik - 變量已創建;他們只是沒有被初始化(他們有默認值0)。從我的答案中的JLS鏈接:_「每當創建一個新的類實例時,都會爲它分配內存空間,以便在類類型中聲明的所有實例變量以及類類型的每個超類中聲明的所有實例變量都有空間,包括可能隱藏的所有實例變量。「_這發生在任何構造函數執行之前。 – 2012-03-15 06:40:37

+0

謝謝你的回覆,現在它清除了我的疑惑。 – hardik 2012-03-15 06:50:10

0

如果改變:

System.out.println("x = "+x+" y = "+y); 

到:

new Exception().printStackTrace(System.out); // <-- CFPMD (poor man's debugger) 
System.out.println("x = "+x+" y = "+y); 

這可能更容易理解其他回答者告訴你的內容。