2016-11-21 60 views
1

我有這兩類解釋執行java代碼的順序或優先級?

public class B { 
     int mB = 5; 

    public int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    int mA = b.getBValue(); 

    public static void main(String [] args){ 
     B b = new B(); 
     System.out.println(mA); 
    } 
} 

編譯器顯示「無法找到符號B」。我理解代碼首先從主要方法執行,然後按順序執行。因此,當編譯器讀取代碼時,它首先進入「B b = new B();」,然後b被定義。這是真的嗎?範圍有誤嗎?

第二狀態我的理解:

public class B { 
    static int mB = 5; 

    public static int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    static int mA = B.getBValue(); 

    public static void main(String [] args){ 
     System.out.println(mA); 
    } 
} 

這種狀態正常工作。靜態屬於類本身,不屬於任何對象。所以所有的靜態加載和程序運行時初始化。

那麼,這兩個國家之間的關鍵點?

+0

'B b = new B();'不創建類'A'可以使用的變量。它不在課堂範圍內。它只是'main'方法的一個「本地」變量。 –

+0

所以我們處理主要方法像任何其他方法沒有任何隱私這種方法? –

+0

'b'不具有全局範圍。它只能用於'main'方法,而_only_只能用於'main'方法的末尾。即使你有一些不是'main'方法的方法,並且它在'main'方法中聲明瞭'b',類'A'將不能訪問'b ',因爲'b'是方法內部的_local_變量。 –

回答

2

我明白,代碼首先執行從主要方法和線後依次。

這是完全正確的。然而,來自main(或來自任何其他方法)的變量在class A的字段初始值設定項中不可用,它們在作爲類構造函數的一部分的各自上下文中執行。

當編譯器讀取代碼首先進入B b = new B();然後b成爲定義它的真實

是,b成爲其範圍的其餘部分定義,即直到的main結束的括號。

那麼這兩個狀態之間的關鍵點在哪裏?

本練習的外帶課程是字段初始值設定項可以自由訪問靜態字段和方法;他們不能訪問任何其他東西,包括任何方法的構造函數參數和局部變量。而且,參數和當地人對他們自己的方法以外的所有事物都是禁止的。

+0

「它與A類的字段初始值設定無關「你是什麼意思,你可以給我例子嗎? –

+0

@ AndroidAL-Khatib int mA'是一個字段聲明,'b.getBValue()'表達式是它的初始化器,所有的初始化器都在它們自己的上下文中執行,沒有訪問字段或變量,除了靜態的,可以從任何地方訪問。 – dasblinkenlight

+0

所以編譯器首先讀取和初始化成員類的聲明,然後調用它的方法? ? –

0

這裏:

public class A { 
    int mA = b.getBValue(); 

    public static void main(String [] args){ 
     B b = new B(); 
     System.out.println(mA); 
    } 
} 

b是和,因爲它是在main()方法的局部變量將是A例如不可見。其範圍限於main()方法。
爲了是可見的,應當在A類

這裏聲明爲靜態字段:

public class B { 
    static int mB = 5; 

    public static int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    static int mA = B.getBValue(); 

    public static void main(String [] args){ 
     System.out.println(mA); 
    } 
} 

它是有效的:

static int mA = B.getBValue(); 

因爲B.getBValue()是在這個範圍內進行訪問。無論如何,B.getBValue()引用了一個公共靜態方法,根據定義,任何地方都可以訪問一個公共靜態方法。由於它是靜態的,它不需要任何實例,因爲它是公開的,任何類都可以調用它。

+0

謝謝你(: –