局部變量

“你好,我親愛的學生!是時候認真對待變量了。但是這次我們不會討論它們的內部結構。相反,我們將關注變量如何與它們所在的代碼交互。

“在方法內部聲明的所有變量都稱為局部變量局部變量僅存在於聲明它的代碼塊中。或者更準確地說,它從聲明的那一刻起一直存在到塊的末尾聲明它的代碼。”

“顯然,我需要一個例子。”

“沒問題。給你:

代碼 變量可用性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

“讓我們再看一遍訪問局部變量的規則。這是一段代碼。它的開始和結束標記是什麼?”

“大括號?”

“正確。這可能是一個方法體,一個循環體,或者只是一個條件語句的代碼塊。在代碼塊中聲明的變量一直存在到該代碼塊的末尾。告訴我,將在哪裡如果在循環體中聲明變量,則該變量存在?”

“它將只存在於循環體中。”

“沒錯,而且每次循環都會創建和銷毀它。”

“這意味著你不能在一個方法中聲明兩個同名的局部變量——程序將無法編譯。但如果聲明變量的代碼塊不重疊,你可以這樣做。

“你是我的最愛是有原因的,阿米戈。再舉一個例子來鞏固你的大腦。

代碼 可變可見性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

“我們能夠聲明第二個局部變量,b僅因為第一個變量在聲明b第二個變量的代碼塊中不可見。b

參數

“正如我們之前所說,每個方法都可以有我們稱之為參數的變量。它們的可見性和生命週期呢?”

“嗯……我難住了……”

“這裡的一切都很簡單。參數是在執行進入方法時創建的(即當方法的代碼開始執行時)。當方法結束時它們被消除。”

“也就是說,它們在整個法體中都是可見的,而且只存在於那裡?”

“是的。例子:

代碼 可變可見性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

“正如我們之前所說,args它只是一個類型為字符串數組的變量。和所有參數一樣,它在方法體內的任何地方都可用。也就是說,我們通常在示例中忽略它。

類中的變量

“請記住第 1 級的課程,我們說一個類可以有方法和變量。方法有時稱為實例方法,而變量 — 實例變量或字段。

“類的變量(或字段)是什麼?

它們是不是在方法中而是在類中聲明的變量。”

“他們在那里幹什麼?”

“對於初學者來說,可以從一個類的任何(非靜態)方法訪問它們。粗略地說,實例變量是一個類的所有方法共享的變量。

例子:

代碼 可變可見性
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

“在這個例子中,我們有兩個方法——add()remove()add()方法增加sumcount實例變量,remove()方法減少sumcount變量。這兩種方法都適用於共享實例變量。”

“我都明白了!局部變量在方法執行時存在。只要對象存在,類的實例變量就存在於類的對像中。”

“幹得好,阿米戈。我們已經奠定了一些基礎,你將在下一個級別了解有關某個類對象的詳細信息。

靜態變量

“和方法一樣,類中的變量可以是靜態的,也可以是非靜態的。靜態方法只能訪問靜態變量。

“我對靜態變量還沒有很清楚的認識。”

“哦,我知道,但別擔心。現在,先適應它們。熟悉它們。在第 11 關中,我們將分析靜態變量和方法的結構,您將了解這些的原因限制。

“要創建一個靜態變量(類變量),必須static在它的聲明中寫上關鍵字。

“靜態變量不綁定到聲明它們的類的對像或實例。相反,它們屬於類本身。這就是為什麼即使沒有創建類的單個對象它們也存在的原因。你可以參考他們來自其他類,使用如下結構:

ClassName.variableName

例子:

代碼 可變可見性
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

“在上面的示例中,我們創建了一個單獨的Storage類,將countsum變量移入其中,並將它們聲明為static。公共靜態變量可以從程序中的任何方法訪問(而不僅僅是從方法中訪問)。”

“我不太明白,不過這對我來說似乎很方便。”

“確實如此。有時這是必要的。如果沒有靜態變量和方法,我們就會陷入困境。”

“希望,我能慢慢弄明白。”

“是的,你當然會。”