2013-07-17 42 views
11

當我讀到關於Java的書時,我看到了一個這樣寫的例子。我想知道我可以在主要方法之外聲明變量嗎?在主要方法外部和內部聲明變量有什麼區別?什麼是「靜態」在這裏的作用?請有人向我解釋一下?我是新來的Java。聲明變量主要方法和內部主要方法之間有什麼區別?

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 
    } 

此致敬禮。

回答

12

1)內部VS外:

如果聲明你的對象的方法,它只會在這個方法中是可見的。基本上,如果將括號括起來,它只能在這些括號內可見/可訪問。

如果聲明外你的對象的方法(類中),這取決於access modifier
默認情況下,它在該類和整個包中可見/可訪問。

2)靜態

靜態裝置,這個對象/變量屬於類本身,而不是它的對象。

例子:

public class Members { 

    static int memberCount; 

    public Members() { 
    memberCount++; 
    } 
} 

memberCount存在只有一次,不管類的有多少對象存在。 (甚至在創建任何對象之前!)

每次創建新對象Members時,都會增加memberCount。現在你可以像這樣訪問它:Members.memberCount

3

在main方法中聲明一個變量將使其僅在main中可用。在外部聲明變量將使其可用於該類的所有方法,包括主要方法。

實施例:

public class Foo { 
    private String varOne = "Test"; 

    public void testOne() { 
    System.out.println(varOne); 
    System.out.println(varTwo); // Error, this variable is available in the testTwo method only 
    } 

    public void testTwo() { 
    String varTwo = "Bar"; 
    System.out.println(varOne); // Will display "Test" 
    System.out.println(varTwo); // Will display "Bar" 
    } 
} 
+0

課外同班同學其他班也 – nachokk

+1

@nachokk:就在這種情況下。它取決於訪問說明符。 – pratZ

+1

這段代碼不會編譯,因爲'varOne'是非靜態的,所以不能從靜態'main()'方法訪問。 – bcsb1001

1

有一個範圍差。 而且你必須聲明它爲靜態的,因爲你的主函數是靜態的,所以它只允許你使用靜態變量。 主要方法內部聲明的變量只能在主要方法內使用。

現在你可能想知道爲什麼我需要將主要方法作爲靜態! 由於java中的任何應用程序都將從main方法運行,因此只能通過類名稱調用,而不創建任何對象,因此我們將其定義爲靜態。所有靜態方法都可以使用類引用調用,不需要任何對象。

+0

謝謝,很清楚。 –

1

區別是現在你的an_integer有更多的範圍。

示例如果您有其他方法。

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 

     public void anotherMethod(){ 
     an_integer++; 
     } 


    } 

當你宣佈

<default package> int an_integer=0;

在同一個包中的所有clases訪問這個變量。

+0

謝謝你很明白 –

+0

不客氣,考慮接受任何答案,並upvoting讓你理解:) – nachokk

1

你指的是變量的範圍。

方法內的變量只能在此方法內訪問,即an_integermain-方法不能在main方法之外引用。變量甚至可以有更窄的範圍,例如循環內部。 for循環的經典迭代變量僅在其循環中可用,然後消失。

方法外的變量稱爲字段。它取決於它可以被看到的訪問修飾符。例如Private字段只能在此類中使用,可以從任何地方訪問public10字段(其他訪問修飾符爲protected,而其他字段均爲缺省值)。基本上,您可以使用類中的字段從該類中的每個方法訪問其值,但是,如果多個線程訪問同一個類的實例,這可能是危險的,但這是另一個故事。

字段和局部變量可能具有相同的名稱,這可能會導致混淆。我通常寧願不這樣做,或者,也許更好的是,始終指代具有this訪問者的字段。我並不確定是否存在局部變量與同名字段的偏好,但我認爲局部變量在確定哪個變量的含義時具有更高的優先級。

Static字段現在意味着此變量不屬於類的實例,而屬於類本身。 Static字段(和方法)可以被讀取(或調用),而無需首先初始化類。一個例子可能是一個類的標準值,或者可能是一個工廠方法(如果它是一個方法)。 Static字段也可能與常量一起使用,並與final修飾符一起使用。一個public final static字段幾乎是一個全球常數。

3

我很好奇沒有人提及記憶問題。很多年前,main()中的實例化會將變量分配給堆棧,然後將其實例化爲主要將變量分配給堆。在那些日子裏,系統有很小的堆棧,所以不檢查這些細節會導致堆棧溢出非常容易。儘管如此,我並不是內存架構方面的專家,但我希望有人能夠爲適用於當前的軟件架構/內存的這一細微的細節作出貢獻。

相關問題