John Squirrels
等級 41
San Francisco

作用域

在 Toto sisi 群組發布
我們都知道,國家有邊界,也有自己的法律。該國的法律在境內運作。在該國,例如學校或博物館等組織也有自己的地方規則。它們不與國家法律相抵觸,只在特定組織的框架內運作。在編程中也是如此。所以在編程中,特別是在 Java 語言中,有一個術語“作用域”。它指的是某些數據(例如變量或方法)起作用的程序區域。在本文中,我們將弄清楚 Java 中變量的作用域是什麼以及如何定義它們。

一般的 Java 作用域

為什麼有必要分離變量和方法的範圍?事實上,有時程序非常大,很難跟踪一個或另一個變量。此外,在大型項目中,變量的明確命名是可取的,以便清楚它們的用途。作用域特別允許您在程序的不同部分擁有同名的不同變量。這樣的代碼更容易維護和閱讀。Java 範圍定義了程序中某個變量或方法的可訪問位置。簡要地:
  • 在方法中聲明的變量從聲明開始到方法結束(方法範圍)都是可見的。
  • 在代碼塊中聲明的變量一直存在到該代碼塊的末尾。
  • 作為方法參數的變量一直存在到方法結束。
  • 類/對像變量在包含對象的生命週期內存在。它們的可見性由特殊的訪問修飾符控制。
  • 靜態類變量在程序運行時一直存在。它們的可見性也由訪問修飾符決定。

方法級範圍

方法中聲明的任何變量(包括參數)都無法在該方法之外訪問。在方法內部聲明的所有變量從聲明開始到方法結束都是可見的。這是方法變量範圍的示例:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
這裡我們有secondArg,一個局部變量或方法參數。我們不能在myMethod方法之外或聲明它之前使用此變量。如果一個變量是一個函數參數,那麼它在這個方法的整個主體中都是可見的。在上面的示例中,我們有兩個這樣的參數:myMethod 中的 arg 和 main 方法中的 args。

類級別範圍

類級範圍(實例變量)——類中聲明的任何變量都可用於該類的所有方法。根據其訪問修飾符(即 public 或 private),它有時可以在類之外訪問。所以如果一個變量是類變量,那麼它就綁定到一個特定的對像上,只要有這個類的對象就存在。如果沒有對象,則沒有變量的副本。該變量對於類的所有方法都是可見的,無論它們是在它之前還是之後聲明的。每個對像都有自己的獨立於其他對象的變量。無法從靜態方法訪問變量。

代碼示例


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
SurnamenamesecondNamebirthday是實例變量。

塊作用域

如果在某個代碼塊中定義/聲明了一個變量,那麼它會一直存在到該代碼塊的末尾。通常,此類變量存在於定義它們的花括號之間。塊作用域通常可以是一個循環變量。在for循環條件中聲明的變量在循環外不可訪問,除非您事先定義了它。

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
first sum 和 i 變量都在循環內聲明,並且不存在於此循環外。然而,第二個總和是在循環外聲明的,所以這個特定的變量將被打印出來。

靜態變量

如果一個變量被聲明為靜態的(用 static 關鍵字標記),那麼只要它的類存在,它就存在。通常,當初始化靜態變量時,JVM 會在首次使用時將類加載到內存中。

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
您不應該創建Student類 的新實例來使用靜態today變量。這裡將打印“2022”。

訪問修飾符

Java 有 4 個訪問修飾符來限制對方法或變量的訪問。您可以在類內部使用它們,而不是在方法內部。
  • private是限制性最強的修飾符。它將對方法和變量的訪問限制在聲明它們的類中。如果不需要在類外使用某些方法或變量,就用private。類變量在 Java 中通常是私有的。

  • 如果沒有指定訪問修飾符,方法或變量將接受默認修飾符。默認只允許從當前包訪問。

  • protected修飾符只允許從當前包內訪問方法或變量,除非通過包外的子類訪問。

  • public是限制最少的修飾符。它允許您不僅可以從聲明的類中訪問類、方法或變量,還可以從外部訪問它們。這個修飾符經常使用。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION