簡體   English   中英

靜態方法中的局部變量也是靜態的嗎?

[英]Are local variables in static methods also static?

我想知道如果我們在靜態方法中聲明它們,所有局部變量都會變為靜態嗎?

例如:

  public static void A(){
        int x [] = {3,2};
        changeX(x);

        for (int i = 0; i< x.length; i++){
             System.out.println(x[i]);   // this will print -1 and 1
        }
  }
  private static void changeX(int[] x){
        x[0] = -1;
        x[1] =  1;
  }

據我所知,Java總是按值傳遞,但是為什么在我們進行changeX調用后X的狀態發生了變化? 有人可以解釋一下嗎? 任何人都可以解釋Java如何在內存分配方面處理靜態變量? 如果我們將靜態變量作為參數傳遞給函數會發生什么(我知道人們通常不這樣做)

大多數問題的答案是“與任何其他變量相同”。

靜態方法中的局部變量只是靜態方法中的局部變量。 它們不是靜止的,它們在任何方面都不是特別的。

靜態變量保存在附加到相應Class對象的內存中; 靜態引用變量引用的任何對象都只存在於常規堆中。

當您將靜態變量作為參數傳遞給方法時......絕對沒有任何有趣的事情發生。

關於代碼中的場景:

  1. 想象一下,你在一個字符串上有一個玩具氣球(氣球是你的數組對象,字符串是在A()聲明它的引用。)
  2. 現在你將另一個字符串綁定到氣球上​​並將該字符串交給朋友(這正是調用changeX()方法時發生的情況:字符串是方法的參數,它指向同一個對象。)
  3. 接下來,你的朋友拉入字符串,拿一個黑色標記並在氣球上繪制一個面(這就像修改數組的changeX()方法)。
  4. 然后你的朋友解開他的字符串,只留下你的字符串附加到氣球(方法返回,並且changeX()的局部變量超出范圍。)
  5. 最后你卷入字符串然后看氣球:當然,你看到了臉(你的A()例程看到了更改過的數組。)

這真的很簡單!

正如其他人所指出的那樣,METHOD的本地變量與任何其他方法中聲明的任何其他變量相同 - 它們是動態分配的,當方法返回變量不再可見時可以釋放它們。

但是,如果需要靜態變量,則必須在方法外部聲明它們,作為類的普通靜態變量。 按照慣例,如果除了在特定方法內部之外,它們將它們留下,它們具有與方法靜態和局部相同的效果。 請務必為此添加評論。

靜態變量存儲在堆的特殊區域,稱為“永久生成”。

靜態方法中顯示的局部變量與非靜態方法中聲明的局部變量沒有任何區別。 對象引用和原始變量放在堆棧上。無論何時創建對象,都會在執行該代碼時在堆上分配存儲。

暫無
暫無

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

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