1.局部變量

讓我們更認真地談談變量。但是這次我們不討論它們的內部結構。相反,我們將關注變量如何與它們所在的代碼交互。

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

為簡單起見,讓我們考慮一個例子:

代碼 可變可見性
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

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


2. 參數

正如我們之前所說,每個方法都可以有我們稱之為參數的變量。他們的知名度和壽命如何?

一切都很簡單。參數是在執行進入方法時創建的(即當方法的代碼開始執行時)。當方法結束時,它們被消除。它們在整個方法中都是可見的。

例子:

代碼 可變可見性
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只是一個類型為字符串數組的變量。和所有參數一樣,它在方法體內的任何地方都可用。也就是說,我們通常在示例中忽略它。



3.類中的變量

你會回憶起第 1 級的課程,一個類可以有方法和變量。方法有時稱為實例方法,而變量 — 實例變量或字段。這些實際上是 Java 中的同義詞。

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

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

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

例子:

代碼 可變可見性
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()方法減少sum 和count變量。這兩種方法都適用於共享實例變量。

方法執行時存在局部變量。只要對象存在,類的實例變量就存在於類的對像中。您將在下一級別了解有關類對象的詳細信息。


4.靜態變量

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

在級別 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類,將count 和sum 變量移入其中,並將它們聲明為static。公共靜態變量可以從程序中的任何方法訪問(而不僅僅是從方法中訪問)。