簡體   English   中英

在Java中聲明“全局”變量時,“靜態”究竟意味着什么?

[英]What exactly does “static” mean when declaring “global” variables in Java?

我已經多次遇到這個問題而且我從不費心去了解它為什么會發生並學習“靜態”實際意味着什么。 我剛剛應用了Eclipse建議並繼續進行的更改。

public class Member {

 // Global Variables
 int iNumVertices;
 int iNumEdges;

 public static void main(String[] args) {

  // do stuff

  iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

  // do more stuff

 } // main end 
}

所以eclipse告訴我做static int iNumVertices; 而且我不確定為什么。 那究竟什么是“靜態”,它是如何使用的,使用“靜態”的目的是什么,為什么它會給我這個問題呢?

這是你的例子:

public class Member {

    // Global Variables
    int iNumVertices;
    int iNumEdges;

    public static void main(String[] args) {

        // do stuff

        iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

    }
}

方法main是與類關聯的靜態方法。 它與Member的實例無關,因此無法訪問與Member實例關聯的變量。 對此的解決方案不是使這些字段靜態。 相反,您需要使用new關鍵字創建Member實例。

這是一個修改版本:

public class Member {
    // Fields
    private int iNumVertices;
    private int iNumEdges;

    public Member(){
        // init the class
    }

    public static void main(String[] args) {
        Member member = new Member();
        member.iNumVertices = 0;
        // do more stuff
    }
}

找到自己創建全局靜力學表明你應該仔細考慮如何設計一些東西。 這並不總是錯的,但它應該告訴你要思考你在做什么。

靜態變量是在類的所有對象之間共享的變量。 在您的示例中,對於您創建的成員的每個對象,您將獲得具有自己的iNumVertices值的對象。 static與變量一起使用時,在Member的每個對象上只共享一個變量。 靜態方法的工作方式相同 - 它們在所有對象之間共享。

由於靜態變量/方法對所有對象都是通用的,因此無需使類的對象訪問這些變量/方法。

iNumVertices這樣的非靜態變量屬於類的對象。 如果不創建對象,則無法訪問它們。 因此,當您從靜態上下文(此處為main方法)訪問非靜態變量時,java將不知道您嘗試訪問哪個對象的iNumVertices 因此錯誤。

要么使iNumVertices成為靜態,要么通過創建Member的對象來引用它

Member m = new Member();
m.iNumVertices = 0;
learn what "static" actually means

什么靜態實際上意味着Class變量對於該特定類的所有實例都是相同的,但是如果你想避免使用靜態變量(這是一個好主意,因為靜態變量保存在內存中)你可以傳遞變量值trough構造函數從而避免使用靜態修飾符,並實現相同的效果(即在類實例化時傳遞相同的值)。

這是代碼示例:

public class Car{

    private int speed;

    public Car(int speed){
        this.speed = speed;
    }

}

所以你可以在創建新實例時這樣做:

Car car = new Car(100);

並且每次創建Car實例時它都會有100的速度,從而避免靜態聲明private static int speed = 100;

靜態變量是類變量。 該變量將有一個副本可用於該類的所有實例,並且它們將共享該變量。 也可以在不引用類的特定實例的情況下使用靜態成員。

更多信息:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

靜態變量不需要實例化類以便被訪問,因此如果您嘗試從靜態上下文訪問非靜態變量,則可能會嘗試訪問尚未初始化/實例化的內容。

靜態方法只能訪問靜態變量。 類中有兩種變量。 一個是靜態變量(也是類變量),另一個是實例變量。 內存中只存在一個靜態變量副本,但實例變量將針對每個對象進行實例化。 因此,對於靜態變量,所有對象都訪問同一個變量,並且一個對象所做的任何更改都將反映到其他對象。 這里的問題是為什么方法必須是靜態的才能訪問靜態變量。 將方法設置為靜態時,可以在不實例化該類的對象的情況下訪問該方法。 因此,如果此方法能夠訪問實例變量,那么它應該更改為哪個對象的變量? 另一種方式是可能的,即非靜態方法可以訪問靜態變量。

靜態變量對於Class的所有實例都是通用的。

注意:如前所述,這些是類變量,即所有實例共享。

這些也可以稱為類級變量。 通常,您定義常量(您還需要用於定義常量的final關鍵字)和全局變量作為靜態。

有關更多信息,請參閱: http//download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

靜態方法中使用的每個類變量(在類體內聲明的變量和方法體外部的變量)也需要聲明為靜態。

可以在該類外部訪問靜態類變量和方法,而無需該類的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM