2015-07-22 61 views
1

在創建另一個類的實例時,我注意到創建實例的位置可能會引發很多錯誤或工作。讓我使用這個例子Java實例位置

public class Main() { 
    Main(){ 

    } 

    Camera camera = new Camera(); 

    public static void main(String[] args) { 
     Box box = new Box(); 
    } 
} 

這兩個不同的實例有什麼區別?我有一個輕微的想法,它與靜態引用有關,但我不確定。另外,在什麼條件下你會在靜態主體內部或外部創建一個實例?感謝您的時間。

+4

您可能對一些[教程](https://docs.oracle.com/javase/tutorial/)感興趣。特別是,[語言基礎教程](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html)應該能夠幫助你(查看[Variables](https:/ /docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html)部分)。 – Jeffrey

回答

2

在你已經提供的代碼,Main是一類,具有構造Main(),場Camera型(包本地可見性)的camera,和一個靜態方法main(String[])。請注意,靜態方法main(String[])Main或其構造函數Main()不相同。

Box類型的box實例靜態方法main內部產生,並且不是外面可見的,而Camera類型的camera實例是在相同的封裝中當前類的每個類可見。

此外,由於camera不是靜態字段,因此它必須與Main類型的實例關聯。例如,你可以這樣做:

Main m = new Main(); 
Camera thisCamera = m.camera; 

但不是這樣的:

Camera myCamera = Main.camera; 
+0

什麼讓相機成爲一個領域? – Ryan

+0

Java中的一個字段只是一個類中的變量。正如Jeffrey在評論中所建議的那樣,教程應該使這些概念清晰。這裏是一個快速和容易閱讀:http://tutorials.jenkov.com/java/index.html –

1

當你做到這一點:

Camera camera = new Camera(); 

你聲明類的保護屬性(場)主要。您還正在爲此屬性創建一個實例。

請注意,此屬性不是靜態的。這樣,總是創建一個Main類的對象,一個Camera將被創建。

對於另一面,如果你聲明:

static Camera camera = new Camera(); 

那麼Java編譯器會保證只有一個該屬性的實例將存在(無論創建了多少類主要的對象)。

box是一個在靜態void main方法內部創建的變量。這個變量在這個方法之外是不可見的(即不能被訪問),因爲這個變量是在方法內創建的(這是許多語言的標準範圍規則)。

請注意,在一個靜態方法內部可能僅引用兩種變量:局部變量(如框)或類靜態變量(如上例)。

+0

我喜歡這個答案,因爲任何新手看這個例子會想知道他們爲什麼不能使用'相機'在'main'方法中。 「Main」的一個實例還沒有創建,所以還沒有一個「攝像頭」。 – CandiedOrange

2

只是更@Chthonic項目的後期闡述:

按照這個例子中你給它顯然,你沒有一個階級,這些通過Java文檔不見了

成員變量被稱爲字段

代碼的方法或代碼塊中的變量 - 這些變量被稱爲局部變量

爲了詳細闡述這更讓我們另一示例

/*Camera object is class variable*/ 
Camera camera = new Camera(); 

由於這是在類級別這成爲一個類的成員或場的範圍。 不要認爲只有intString可以成爲一個領域。類對象變量也可以是字段或類成員。

/*Here the BOX object is inside a method*/ 
public static void main(String[] args){ 
    Box box = new Box(); 
} 

A Box box對象在main方法內部被聲明和實例化。此對象的範圍是有限到方法的範圍。它將僅位於主方法的大括號內。

例如,假設現在修改您的爲例:

public static void main(String[] args){ 
    Box box = new Box(); 
    if(null != camera){ 
     // You can access camera inside main as it is a class member 
     // the scope is a full class. 
    } 
} // mian method ends. 

if(null == box){ // compiler will shout!!! 
    // accessing box object outside main method 
    // not allowed cause the box objects scope is over inside main method only. 
} 
1

Main實例甚至還沒有被創建,這樣就不會有一個camera呢。以下是你可以如何解決這個問題:

public class Main() { 
    Main(){ 

    } 

    Camera camera = new Camera(); 

    public static void main(String[] args) { 
     Box box = new Box(); 
     box.standOn(); 
     Main main = new Main(); // <- now the camera exists. 
     System.out.println("Say cheese."); 
     main.camera.click(); 
    } 
} 

通過一切手段閱讀人們指着你的教程。但是,想一想這裏發生了什麼的簡單方法是:對象的靜態部分是在其實例(對象)創建之前工作的部分(通常使用new)。當然,static也意味着每個實例共享相同的內存,這可能是有用的,很酷。但是,在你存在之前讓你的部分人工作也很酷。畢竟static void main(String[] args)是我們如何讓整個展會開始。

現在你應該已經注意到它有多麼令人困惑,它有Main這個類,main這個實例變量和main()這個方法。這就是爲什麼我們不把名字命名爲Main的原因。

+0

我明白我havnt創建了一個主要的實例,我只是問兩個實例的區別。我不知道你是否用靜態方法定義了一個實例,它也是靜態的 – Ryan